From c45938d74774c8cbbb094f1250e157909a92a46f Mon Sep 17 00:00:00 2001 From: Josh McVey Date: Mon, 6 Jan 2025 10:29:52 -0600 Subject: [PATCH 001/150] chore(release): v8.3.0-alpha.1 release notes (#17188) ## Overview This PR is the rebased version of #17141 --- api/release-notes.md | 16 ++++++++++++++++ app-shell/build/release-notes.md | 16 ++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/api/release-notes.md b/api/release-notes.md index 1fdd9a033d9..68d84b62cce 100644 --- a/api/release-notes.md +++ b/api/release-notes.md @@ -8,6 +8,22 @@ By installing and using Opentrons software, you agree to the Opentrons End-User --- +## Opentrons Robot Software Changes in 8.3.0 + +Welcome to the v8.3.0 release of the Opentrons robot software! This release adds support for Evosep Evotips on the Flex, as well as other features. + +### New Features + +- Use Evosep Evotips in Python API version 2.22 protocols for protein sample purification. Only available with the Flex 96-channel pipette. + +- Load a newly modified Flex 8-Channel EM 1000 µL pipette equipped with a PEEK motor component to automate emulsion applications. + +### Improved Features + +- Improvements to the Flex error recovery feature help protocols recover from detected stalls and collisions, saving you valuable time and resources. + +--- + ## Opentrons Robot Software Changes in 8.2.0 Welcome to the v8.2.0 release of the Opentrons robot software! This release adds support for the Opentrons Absorbance Plate Reader Module. diff --git a/app-shell/build/release-notes.md b/app-shell/build/release-notes.md index 9b9231e9709..4d5c7827f6f 100644 --- a/app-shell/build/release-notes.md +++ b/app-shell/build/release-notes.md @@ -8,6 +8,22 @@ By installing and using Opentrons software, you agree to the Opentrons End-User --- +## Opentrons App Changes in 8.3.0 + +Welcome to the v8.3.0 release of the Opentrons App! This release adds support for Evosep Evotips on the Flex, as well as other features. + +### New Features + +- Use Evosep Evotips in Python API version 2.22 protocols for protein sample purification. Only available with the Flex 96-channel pipette. +- Change the app or Flex touchscreen language to Mandarin in Settings. +- Load a newly modified Flex 8-Channel EM 1000 µL pipette equipped with a PEEK motor component to automate emulsion applications. + +### Improved Features + +- Improvements to the Flex error recovery feature help protocols recover from detected stalls and collisions, saving you valuable time and resources. + +--- + ## Opentrons App Changes in 8.2.0 Welcome to the v8.2.0 release of the Opentrons App! This release adds support for the Opentrons Absorbance Plate Reader Module, as well as other features. From 8c2474dbcd1b29225f020e8525a4d642b6d7227e Mon Sep 17 00:00:00 2001 From: Seth Foster Date: Tue, 7 Jan 2025 13:02:50 -0500 Subject: [PATCH 002/150] fix(api): properly handle non-labware jsons in sim (#17198) opentrons_simulate tries to see if any json file it can reach is a labware and load it if so. We recently changed the exceptions we raise in verify_labware_definitions if that call fails, so now instead of ignoring the file on exception opentrons_simulate raises the error through and terminates. No good! Change the exception to something a little saner and make sure we can actually ignore invalid labware files in sim. Closes RQA-3820 --- api/src/opentrons/protocols/labware.py | 45 +++++++++++++++---- api/src/opentrons/util/entrypoint_util.py | 7 +-- .../errors/exceptions.py | 3 +- 3 files changed, 41 insertions(+), 14 deletions(-) diff --git a/api/src/opentrons/protocols/labware.py b/api/src/opentrons/protocols/labware.py index d3159ee5d9f..ec05e3cbb72 100644 --- a/api/src/opentrons/protocols/labware.py +++ b/api/src/opentrons/protocols/labware.py @@ -4,7 +4,7 @@ import json import os from pathlib import Path -from typing import Any, AnyStr, Dict, Optional, Union, List +from typing import Any, AnyStr, Dict, Optional, Union, List, Sequence, Literal import jsonschema # type: ignore @@ -17,10 +17,30 @@ USER_DEFS_PATH, ) from opentrons_shared_data.labware.types import LabwareDefinition +from opentrons_shared_data.errors.exceptions import InvalidProtocolData MODULE_LOG = logging.getLogger(__name__) +LabwareProblem = Literal[ + "no-schema-id", "bad-schema-id", "schema-mismatch", "invalid-json" +] + + +class NotALabwareError(InvalidProtocolData): + def __init__( + self, problem: LabwareProblem, wrapping: Sequence[BaseException] + ) -> None: + messages: dict[LabwareProblem, str] = { + "no-schema-id": "No schema ID present in file", + "bad-schema-id": "Bad schema ID in file", + "invalid-json": "File does not contain valid JSON", + "schema-mismatch": "File does not match labware schema", + } + super().__init__( + message=messages[problem], detail={"kind": problem}, wrapping=wrapping + ) + def get_labware_definition( load_name: str, @@ -126,7 +146,7 @@ def save_definition( json.dump(labware_def, f) -def verify_definition( +def verify_definition( # noqa: C901 contents: Union[AnyStr, LabwareDefinition, Dict[str, Any]] ) -> LabwareDefinition: """Verify that an input string is a labware definition and return it. @@ -146,15 +166,24 @@ def verify_definition( if isinstance(contents, dict): to_return = contents else: - to_return = json.loads(contents) + try: + to_return = json.loads(contents) + except json.JSONDecodeError as e: + raise NotALabwareError("invalid-json", [e]) from e try: schema_version = to_return["schemaVersion"] + except KeyError as e: + raise NotALabwareError("no-schema-id", [e]) from e + + try: schema = schemata_by_version[schema_version] - except KeyError: - raise RuntimeError( - f'Invalid or unknown labware schema version {to_return.get("schemaVersion", None)}' - ) - jsonschema.validate(to_return, schema) + except KeyError as e: + raise NotALabwareError("bad-schema-id", [e]) from e + + try: + jsonschema.validate(to_return, schema) + except jsonschema.ValidationError as e: + raise NotALabwareError("schema-mismatch", [e]) from e # we can type ignore this because if it passes the jsonschema it has # the correct structure diff --git a/api/src/opentrons/util/entrypoint_util.py b/api/src/opentrons/util/entrypoint_util.py index 2da4cac874c..508f6769bc5 100644 --- a/api/src/opentrons/util/entrypoint_util.py +++ b/api/src/opentrons/util/entrypoint_util.py @@ -6,7 +6,6 @@ from dataclasses import dataclass import json import logging -from json import JSONDecodeError import pathlib import subprocess import sys @@ -21,8 +20,6 @@ TYPE_CHECKING, ) -from jsonschema import ValidationError # type: ignore - from opentrons.calibration_storage.deck_configuration import ( deserialize_deck_configuration, ) @@ -32,7 +29,7 @@ JUPYTER_NOTEBOOK_LABWARE_DIR, SystemArchitecture, ) -from opentrons.protocol_api import labware +from opentrons.protocols import labware from opentrons.calibration_storage import helpers from opentrons.protocol_engine.errors.error_occurrence import ( ErrorOccurrence as ProtocolEngineErrorOccurrence, @@ -79,7 +76,7 @@ def labware_from_paths( if child.is_file() and child.suffix.endswith("json"): try: defn = labware.verify_definition(child.read_bytes()) - except (ValidationError, JSONDecodeError): + except labware.NotALabwareError: log.info(f"{child}: invalid labware, ignoring") log.debug( f"{child}: labware invalid because of this exception.", diff --git a/shared-data/python/opentrons_shared_data/errors/exceptions.py b/shared-data/python/opentrons_shared_data/errors/exceptions.py index b27b3c9c3d3..bdc952d5760 100644 --- a/shared-data/python/opentrons_shared_data/errors/exceptions.py +++ b/shared-data/python/opentrons_shared_data/errors/exceptions.py @@ -1,4 +1,5 @@ """Exception hierarchy for error codes.""" + from typing import Dict, Any, Optional, List, Iterator, Union, Sequence, overload from logging import getLogger from traceback import format_exception_only, format_tb @@ -1099,7 +1100,7 @@ def __init__( self, message: Optional[str] = None, detail: Optional[Dict[str, str]] = None, - wrapping: Optional[Sequence[EnumeratedError]] = None, + wrapping: Optional[Sequence[Union[EnumeratedError, BaseException]]] = None, ) -> None: """Build an InvalidProtocolData.""" super().__init__(ErrorCodes.INVALID_PROTOCOL_DATA, message, detail, wrapping) From 696d2e444bd0495140c18784a0e4c80c472110f2 Mon Sep 17 00:00:00 2001 From: Jamey Huffnagle Date: Tue, 7 Jan 2025 11:42:52 -0700 Subject: [PATCH 003/150] fix(app): Fix gantry not homing when no labware in gripper jaws during Error Recovery (#17201) Closes RQA-3822 Adds the explicit homing command to the "no labware in jaws" option, preventing fatal errors that occur after gripper recovery involving axes with unknown positioning. --- .../shared/GripperIsHoldingLabware.tsx | 44 +++++++++++-------- .../GripperIsHoldingLabware.test.tsx | 18 ++++++++ 2 files changed, 44 insertions(+), 18 deletions(-) diff --git a/app/src/organisms/ErrorRecoveryFlows/shared/GripperIsHoldingLabware.tsx b/app/src/organisms/ErrorRecoveryFlows/shared/GripperIsHoldingLabware.tsx index 036f1aff3d0..6f4157bc909 100644 --- a/app/src/organisms/ErrorRecoveryFlows/shared/GripperIsHoldingLabware.tsx +++ b/app/src/organisms/ErrorRecoveryFlows/shared/GripperIsHoldingLabware.tsx @@ -29,12 +29,15 @@ export const HOLDING_LABWARE_OPTIONS: HoldingLabwareOption[] = [ export function GripperIsHoldingLabware({ routeUpdateActions, currentRecoveryOptionUtils, + recoveryCommands, }: RecoveryContentProps): JSX.Element { const { proceedNextStep, proceedToRouteAndStep, goBackPrevStep, + handleMotionRouting, } = routeUpdateActions + const { homeExceptPlungers } = recoveryCommands const { selectedRecoveryOption } = currentRecoveryOptionUtils const { MANUAL_MOVE_AND_SKIP, @@ -48,24 +51,29 @@ export function GripperIsHoldingLabware({ const { t } = useTranslation(['error_recovery', 'shared']) const handleNoOption = (): void => { - switch (selectedRecoveryOption) { - case MANUAL_MOVE_AND_SKIP.ROUTE: - void proceedToRouteAndStep( - MANUAL_MOVE_AND_SKIP.ROUTE, - MANUAL_MOVE_AND_SKIP.STEPS.MANUAL_MOVE - ) - break - case MANUAL_REPLACE_AND_RETRY.ROUTE: - void proceedToRouteAndStep( - MANUAL_REPLACE_AND_RETRY.ROUTE, - MANUAL_REPLACE_AND_RETRY.STEPS.MANUAL_REPLACE - ) - break - default: { - console.error('Unexpected recovery option for gripper routing.') - void proceedToRouteAndStep(OPTION_SELECTION.ROUTE) - } - } + // The "yes" option also contains a home, but it occurs later in the control flow, + // after the user has extricated the labware from the gripper jaws. + void handleMotionRouting(true) + .then(() => homeExceptPlungers()) + .then(() => { + switch (selectedRecoveryOption) { + case MANUAL_MOVE_AND_SKIP.ROUTE: + return proceedToRouteAndStep( + MANUAL_MOVE_AND_SKIP.ROUTE, + MANUAL_MOVE_AND_SKIP.STEPS.MANUAL_MOVE + ) + case MANUAL_REPLACE_AND_RETRY.ROUTE: + return proceedToRouteAndStep( + MANUAL_REPLACE_AND_RETRY.ROUTE, + MANUAL_REPLACE_AND_RETRY.STEPS.MANUAL_REPLACE + ) + default: { + console.error('Unexpected recovery option for gripper routing.') + return proceedToRouteAndStep(OPTION_SELECTION.ROUTE) + } + } + }) + .finally(() => handleMotionRouting(false)) } const primaryOnClick = (): void => { diff --git a/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/GripperIsHoldingLabware.test.tsx b/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/GripperIsHoldingLabware.test.tsx index adedca04009..3279bdfea7c 100644 --- a/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/GripperIsHoldingLabware.test.tsx +++ b/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/GripperIsHoldingLabware.test.tsx @@ -23,19 +23,25 @@ const render = (props: ComponentProps) => { let mockProceedToRouteAndStep: Mock let mockProceedNextStep: Mock +let mockHandleMotionRouting: Mock +let mockHomeExceptPlungers: Mock describe('GripperIsHoldingLabware', () => { let props: ComponentProps beforeEach(() => { mockProceedToRouteAndStep = vi.fn(() => Promise.resolve()) mockProceedNextStep = vi.fn(() => Promise.resolve()) + mockHandleMotionRouting = vi.fn(() => Promise.resolve()) + mockHomeExceptPlungers = vi.fn(() => Promise.resolve()) props = { ...mockRecoveryContentProps, routeUpdateActions: { proceedToRouteAndStep: mockProceedToRouteAndStep, proceedNextStep: mockProceedNextStep, + handleMotionRouting: mockHandleMotionRouting, } as any, + recoveryCommands: { homeExceptPlungers: mockHomeExceptPlungers } as any, } }) @@ -82,12 +88,24 @@ describe('GripperIsHoldingLabware', () => { fireEvent.click(screen.getAllByLabelText('No')[0]) clickButtonLabeled('Continue') + await waitFor(() => { + expect(mockHandleMotionRouting).toHaveBeenCalledWith(true) + }) + + await waitFor(() => { + expect(mockHomeExceptPlungers).toHaveBeenCalled() + }) + await waitFor(() => { expect(mockProceedToRouteAndStep).toHaveBeenCalledWith( RECOVERY_MAP.MANUAL_MOVE_AND_SKIP.ROUTE, RECOVERY_MAP.MANUAL_MOVE_AND_SKIP.STEPS.MANUAL_MOVE ) }) + + await waitFor(() => { + expect(mockHandleMotionRouting).toHaveBeenCalledWith(false) + }) }) it(`proceeds to the correct step when the no option is clicked for ${RECOVERY_MAP.MANUAL_REPLACE_AND_RETRY.ROUTE}`, async () => { From eeb7a02634436982e87290319ca455acb4a9a2a4 Mon Sep 17 00:00:00 2001 From: Seth Foster Date: Tue, 7 Jan 2025 16:47:35 -0500 Subject: [PATCH 004/150] fix(robot-server): Better errors for bad wpa2 pass (#17203) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We pipe errors from nmcli straight to the display when we get them. NMCLI has famously awful errors. We don't want to always squash them, because they could be useful, but in the case of a mis-entered WPA2 PSK, we can be pretty sure that's the problem. This will now say "check your wifi credentials" Screenshot 2025-01-07 at 4 46 15 PM ## Testing - [x] Connect to a wifi network and purposefully enter the wrong password; you should get a less awful message. Note that this only actually works if you're disconnected from wifi when you try to connect; if you're connected to wifi and then try and connect to a network and use the wrong password, you just don't get a result because the request went out over the original wifi network which got disconnected. It's the same code on the flex, ot-2 on the desktop (the ODD has a different message). Closes RSQ-3 --- .../service/legacy/routers/networking.py | 11 ++++++++- .../service/legacy/routers/test_networking.py | 23 +++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/robot-server/robot_server/service/legacy/routers/networking.py b/robot-server/robot_server/service/legacy/routers/networking.py index ea3c4543ea8..d0acb1b64be 100644 --- a/robot-server/robot_server/service/legacy/routers/networking.py +++ b/robot-server/robot_server/service/legacy/routers/networking.py @@ -1,5 +1,6 @@ import logging import os +import re import subprocess from typing import Annotated, Optional @@ -96,6 +97,13 @@ async def get_wifi_networks( return WifiNetworks(list=[WifiNetworkFull(**n) for n in networks]) +def _massage_nmcli_error(error_string: str) -> str: + """Raises a better-formatted error message from an nmcli error string.""" + if re.search("password.*802-11-wireless-security\\.psk.*not given", error_string): + return "Could not connect to network. Please double-check network credentials." + return error_string + + @router.post( path="/wifi/configure", summary="Configure the robot's Wi-Fi", @@ -129,7 +137,8 @@ async def post_wifi_configure( if not ok: raise LegacyErrorResponse( - message=message, errorCode=ErrorCodes.GENERAL_ERROR.value.code + message=_massage_nmcli_error(message), + errorCode=ErrorCodes.GENERAL_ERROR.value.code, ).as_error(status.HTTP_401_UNAUTHORIZED) return WifiConfigurationResponse(message=message, ssid=configuration.ssid) diff --git a/robot-server/tests/service/legacy/routers/test_networking.py b/robot-server/tests/service/legacy/routers/test_networking.py index 22ea2359a92..ebc42a41839 100755 --- a/robot-server/tests/service/legacy/routers/test_networking.py +++ b/robot-server/tests/service/legacy/routers/test_networking.py @@ -5,6 +5,7 @@ import pytest from opentrons.system import nmcli, wifi +from robot_server.service.legacy.routers.networking import _massage_nmcli_error from typing import Optional @@ -369,3 +370,25 @@ def check_option(opt_dict): assert "options" in opt for method_opt in opt["options"]: check_option(method_opt) + + +@pytest.mark.parametrize( + "nmcli_message,result_message", + [ + ( + "Warning: password for '802-11-wireless-security.psk' not given in 'passwd-file' and nmcli cannot ask without '--ask' option. Error: Connection activation failed: Secrets were required, but not provided Hint: use 'journalctl -xe NM_CONNECTION=05d784ec-1feb4147-be22-c07d7915ef96 + NM_DEVICE=mlan0' to get more details.", + "Could not connect to network. Please double-check network credentials.", + ), + ( + "Warning: asdasdasff for '802-11-afasda' not given in 'asdadsa'. Error: Connection activation failed: Secrets were required, but not provided", + "Warning: asdasdasff for '802-11-afasda' not given in 'asdadsa'. Error: Connection activation failed: Secrets were required, but not provided", + ), + ( + "Error: Connection activation failed: Secrets were required, but not provided", + "Error: Connection activation failed: Secrets were required, but not provided", + ), + ], +) +def test_error_rewriting(nmcli_message: str, result_message: str) -> None: + """It should rewrite known nmcli failure messages.""" + assert _massage_nmcli_error(nmcli_message) == result_message From 0395804d3cd6cebbd47dc3807d69fe22a6488e3c Mon Sep 17 00:00:00 2001 From: CaseyBatten Date: Tue, 7 Jan 2025 17:23:06 -0500 Subject: [PATCH 005/150] fix(shared-data): Add back missing parent labwares for auto sealing lids (#17195) Covers RQA-3819 Adds in missing valid labware parents for the TC lid --- .../definitions/3/opentrons_tough_pcr_auto_sealing_lid/1.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/shared-data/labware/definitions/3/opentrons_tough_pcr_auto_sealing_lid/1.json b/shared-data/labware/definitions/3/opentrons_tough_pcr_auto_sealing_lid/1.json index 479fd00b772..342fd30c4e0 100644 --- a/shared-data/labware/definitions/3/opentrons_tough_pcr_auto_sealing_lid/1.json +++ b/shared-data/labware/definitions/3/opentrons_tough_pcr_auto_sealing_lid/1.json @@ -81,7 +81,9 @@ "compatibleParentLabware": [ "armadillo_96_wellplate_200ul_pcr_full_skirt", "opentrons_96_wellplate_200ul_pcr_full_skirt", - "opentrons_tough_pcr_auto_sealing_lid" + "opentrons_tough_pcr_auto_sealing_lid", + "biorad_96_wellplate_200ul_pcr", + "opentrons_flex_deck_riser" ], "gripForce": 15, "gripHeightFromLabwareBottom": 7.91, From cff47c9812201d7f1a81bd44275d970a6cbae3a9 Mon Sep 17 00:00:00 2001 From: Jamey Huffnagle Date: Wed, 8 Jan 2025 08:00:25 -0700 Subject: [PATCH 006/150] fix(app-shell): Fix flaky file system test (#17212) Fix a flaky test by running filesystem commands sequentially instead of in parallel. --- .../__tests__/file-system.test.ts | 109 +++++++++--------- 1 file changed, 55 insertions(+), 54 deletions(-) diff --git a/app-shell/src/protocol-storage/__tests__/file-system.test.ts b/app-shell/src/protocol-storage/__tests__/file-system.test.ts index 4da2cd23abe..cc742e0b89b 100644 --- a/app-shell/src/protocol-storage/__tests__/file-system.test.ts +++ b/app-shell/src/protocol-storage/__tests__/file-system.test.ts @@ -109,66 +109,67 @@ describe('protocol storage directory utilities', () => { }) describe('parseProtocolDirs', () => { - it('reads and parses directories', () => { + it('reads and parses directories', async () => { const protocolsDir = makeEmptyDir() - const firstProtocolDirName = 'protocol_item_1' const secondProtocolDirName = 'protocol_item_2' - const firstDirPath = path.join(protocolsDir, firstProtocolDirName) const secondDirPath = path.join(protocolsDir, secondProtocolDirName) - return Promise.all([ - fs.emptyDir(path.join(protocolsDir, firstProtocolDirName)), - fs.emptyDir(path.join(protocolsDir, firstProtocolDirName, 'src')), - fs.createFile( - path.join(protocolsDir, firstProtocolDirName, 'src', 'main.py') - ), - fs.emptyDir(path.join(protocolsDir, firstProtocolDirName, 'analysis')), - fs.createFile( - path.join( - protocolsDir, - firstProtocolDirName, - 'analysis', - 'fake_timestamp0.json' - ) - ), - fs.emptyDir(path.join(protocolsDir, secondProtocolDirName)), - fs.emptyDir(path.join(protocolsDir, secondProtocolDirName, 'src')), - fs.createFile( - path.join(protocolsDir, secondProtocolDirName, 'src', 'main.json') - ), - fs.emptyDir(path.join(protocolsDir, secondProtocolDirName, 'analysis')), - fs.createFile( - path.join( - protocolsDir, - secondProtocolDirName, - 'analysis', - 'fake_timestamp1.json' - ) - ), - ]).then(() => { - return expect( - parseProtocolDirs([firstDirPath, secondDirPath]) - ).resolves.toEqual([ - { - dirPath: firstDirPath, - modified: expect.any(Number), - srcFilePaths: [path.join(firstDirPath, 'src', 'main.py')], - analysisFilePaths: [ - path.join(firstDirPath, 'analysis', 'fake_timestamp0.json'), - ], - }, - { - dirPath: secondDirPath, - modified: expect.any(Number), - srcFilePaths: [path.join(secondDirPath, 'src', 'main.json')], - analysisFilePaths: [ - path.join(secondDirPath, 'analysis', 'fake_timestamp1.json'), - ], - }, - ]) - }) + await fs.emptyDir(path.join(protocolsDir, firstProtocolDirName)) + await fs.emptyDir(path.join(protocolsDir, firstProtocolDirName, 'src')) + await fs.emptyDir( + path.join(protocolsDir, firstProtocolDirName, 'analysis') + ) + await fs.createFile( + path.join(protocolsDir, firstProtocolDirName, 'src', 'main.py') + ) + await fs.createFile( + path.join( + protocolsDir, + firstProtocolDirName, + 'analysis', + 'fake_timestamp0.json' + ) + ) + + await fs.emptyDir(path.join(protocolsDir, secondProtocolDirName)) + await fs.emptyDir(path.join(protocolsDir, secondProtocolDirName, 'src')) + await fs.emptyDir( + path.join(protocolsDir, secondProtocolDirName, 'analysis') + ) + await fs.createFile( + path.join(protocolsDir, secondProtocolDirName, 'src', 'main.json') + ) + await fs.createFile( + path.join( + protocolsDir, + secondProtocolDirName, + 'analysis', + 'fake_timestamp1.json' + ) + ) + + const result = await parseProtocolDirs([firstDirPath, secondDirPath]) + + expect(result).toEqual([ + { + dirPath: firstDirPath, + modified: expect.any(Number), + srcFilePaths: [path.join(firstDirPath, 'src', 'main.py')], + analysisFilePaths: [ + path.join(firstDirPath, 'analysis', 'fake_timestamp0.json'), + ], + }, + { + dirPath: secondDirPath, + modified: expect.any(Number), + srcFilePaths: [path.join(secondDirPath, 'src', 'main.json')], + analysisFilePaths: [ + path.join(secondDirPath, 'analysis', 'fake_timestamp1.json'), + ], + }, + ]) }) }) From b565fea1f15364eb867c3ddb4b46a870392667a8 Mon Sep 17 00:00:00 2001 From: Seth Foster Date: Wed, 8 Jan 2025 10:06:50 -0500 Subject: [PATCH 007/150] chore(app-shell): pass team id via env var only (#17210) This is very odd and I'm not sure when it would have changed but this is the thing the error message says to do. ## Testing - [x] does the apple build work - [x] does the apple build run --- app-shell/electron-builder.config.js | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/app-shell/electron-builder.config.js b/app-shell/electron-builder.config.js index decac1f66b9..26bcf518e28 100644 --- a/app-shell/electron-builder.config.js +++ b/app-shell/electron-builder.config.js @@ -1,11 +1,7 @@ 'use strict' const path = require('path') -const { - OT_APP_DEPLOY_BUCKET, - OT_APP_DEPLOY_FOLDER, - APPLE_TEAM_ID, -} = process.env +const { OT_APP_DEPLOY_BUCKET, OT_APP_DEPLOY_FOLDER } = process.env const DEV_MODE = process.env.NODE_ENV !== 'production' const USE_PYTHON = process.env.NO_PYTHON !== 'true' const WINDOWS_SIGN = process.env.WINDOWS_SIGN === 'true' @@ -62,9 +58,7 @@ module.exports = async () => ({ icon: project === 'robot-stack' ? 'build/icon.icns' : 'build/three.icns', forceCodeSigning: !DEV_MODE, gatekeeperAssess: true, - notarize: { - teamId: APPLE_TEAM_ID, - }, + // note: notarize.teamId is passed by implicitly sending through the APPLE_TEAM_ID env var }, dmg: { icon: null, From 63cba42d4fecdbbbc1f3cffd5ab2102fcb41118a Mon Sep 17 00:00:00 2001 From: Ryan Howard Date: Wed, 8 Jan 2025 10:58:44 -0500 Subject: [PATCH 008/150] fix(hardware-testing): add oem argument to pipette load in lld test protocol (#17216) # Overview We're doing a direct "load_definintion" call in this protocol so we need to update it to have the new OEM arg added in 8.3 ## Test Plan and Hands on Testing ## Changelog ## Review requests ## Risk assessment --- .../protocols/liquid_sense/lld_test_empty_wells.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/hardware-testing/hardware_testing/protocols/liquid_sense/lld_test_empty_wells.py b/hardware-testing/hardware_testing/protocols/liquid_sense/lld_test_empty_wells.py index 3adfd8e3208..2e289eed919 100644 --- a/hardware-testing/hardware_testing/protocols/liquid_sense/lld_test_empty_wells.py +++ b/hardware-testing/hardware_testing/protocols/liquid_sense/lld_test_empty_wells.py @@ -14,6 +14,7 @@ PipetteChannelType, PipetteModelType, PipetteVersionType, + PipetteOEMType, ) ########################################### @@ -113,6 +114,7 @@ def _setup( major=int(pip_model_list[-1][-3]), # type: ignore[arg-type] minor=int(pip_model_list[-1][-1]), # type: ignore[arg-type] ), + oem=PipetteOEMType.get_oem_from_model_str(str(pipette.model)), ) # Writes details about test run to google sheet. tipVolume = "t" + str(TIP_SIZE) From 0fa2cfc9de836d2c298adc13f88fbeac29b329c5 Mon Sep 17 00:00:00 2001 From: Jamey Huffnagle Date: Wed, 8 Jan 2025 12:40:38 -0700 Subject: [PATCH 009/150] fix(app): Fix gripper calibration copy during exit (#17220) Closes RQA-3832 --- app/src/organisms/GripperWizardFlows/index.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/organisms/GripperWizardFlows/index.tsx b/app/src/organisms/GripperWizardFlows/index.tsx index 1a4bab512eb..17b61ab51c8 100644 --- a/app/src/organisms/GripperWizardFlows/index.tsx +++ b/app/src/organisms/GripperWizardFlows/index.tsx @@ -145,6 +145,8 @@ export function GripperWizardFlows( }) const handleCleanUpAndClose = (): void => { + setIsExiting(true) + if (maintenanceRunData?.data.id == null) { handleClose() } else { From 5f869ea04c29cb6d1b2e4884af8d859dbbd88149 Mon Sep 17 00:00:00 2001 From: Max Marrone Date: Wed, 8 Jan 2025 14:40:57 -0500 Subject: [PATCH 010/150] docs(robot-server): Exclude `/labwareOffsets` endpoints from docs (#17219) --- robot-server/robot_server/labware_offsets/router.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/robot-server/robot_server/labware_offsets/router.py b/robot-server/robot_server/labware_offsets/router.py index 6aca03e4b18..155eef4b5ce 100644 --- a/robot-server/robot_server/labware_offsets/router.py +++ b/robot-server/robot_server/labware_offsets/router.py @@ -42,6 +42,7 @@ """ ), status_code=201, + include_in_schema=False, # todo(mm, 2025-01-08): Include for v8.4.0. ) async def post_labware_offset( # noqa: D103 store: Annotated[LabwareOffsetStore, fastapi.Depends(get_labware_offset_store)], @@ -72,6 +73,7 @@ async def post_labware_offset( # noqa: D103 " Filters are ANDed together." " Results are returned in order from oldest to newest." ), + include_in_schema=False, # todo(mm, 2025-01-08): Include for v8.4.0. ) async def get_labware_offsets( # noqa: D103 store: Annotated[LabwareOffsetStore, fastapi.Depends(get_labware_offset_store)], @@ -163,6 +165,7 @@ async def get_labware_offsets( # noqa: D103 path="/labwareOffsets/{id}", summary="Delete a single labware offset", description="Delete a single labware offset. The deleted offset is returned.", + include_in_schema=False, # todo(mm, 2025-01-08): Include for v8.4.0. ) async def delete_labware_offset( # noqa: D103 store: Annotated[LabwareOffsetStore, fastapi.Depends(get_labware_offset_store)], @@ -185,6 +188,7 @@ async def delete_labware_offset( # noqa: D103 router.delete, path="/labwareOffsets", summary="Delete all labware offsets", + include_in_schema=False, # todo(mm, 2025-01-08): Include for v8.4.0. ) async def delete_all_labware_offsets( # noqa: D103 store: Annotated[LabwareOffsetStore, fastapi.Depends(get_labware_offset_store)] From 7e1d4a3b9fbe74b2071697564dc57a3fddcea441 Mon Sep 17 00:00:00 2001 From: Josh McVey Date: Wed, 8 Jan 2025 15:42:29 -0600 Subject: [PATCH 011/150] chore(translation): sync locize repo (#17207) --- .../assets/localization/en/app_settings.json | 2 +- .../localization/en/change_pipette.json | 6 +- .../localization/en/device_details.json | 48 ++++---- .../localization/en/device_settings.json | 2 +- .../localization/en/gripper_wizard_flows.json | 2 +- .../assets/localization/en/heater_shaker.json | 12 +- .../localization/en/incompatible_modules.json | 6 +- .../localization/en/labware_details.json | 4 +- .../localization/en/labware_landing.json | 6 +- .../en/labware_position_check.json | 20 ++-- .../localization/en/module_wizard_flows.json | 14 +-- .../localization/en/pipette_wizard_flows.json | 14 +-- .../en/protocol_command_text.json | 2 +- .../localization/en/protocol_details.json | 28 ++--- .../assets/localization/en/protocol_info.json | 6 +- .../assets/localization/en/protocol_list.json | 2 +- .../localization/en/protocol_setup.json | 2 +- .../localization/en/quick_transfer.json | 14 +-- app/src/assets/localization/en/shared.json | 2 +- .../localization/en/top_navigation.json | 2 +- app/src/assets/localization/zh/anonymous.json | 12 +- .../assets/localization/zh/app_settings.json | 2 +- app/src/assets/localization/zh/branded.json | 8 +- .../localization/zh/change_pipette.json | 6 +- .../localization/zh/device_details.json | 45 ++++---- .../localization/zh/device_settings.json | 50 +++++++- .../localization/zh/devices_landing.json | 2 +- .../localization/zh/drop_tip_wizard.json | 7 +- .../localization/zh/error_recovery.json | 36 ++++-- .../localization/zh/gripper_wizard_flows.json | 4 +- .../assets/localization/zh/heater_shaker.json | 12 +- .../localization/zh/incompatible_modules.json | 6 +- .../localization/zh/labware_details.json | 4 +- .../localization/zh/labware_landing.json | 6 +- .../zh/labware_position_check.json | 20 ++-- .../localization/zh/module_wizard_flows.json | 14 +-- .../localization/zh/pipette_wizard_flows.json | 15 +-- .../zh/protocol_command_text.json | 36 ++++-- .../localization/zh/protocol_details.json | 29 +++-- .../assets/localization/zh/protocol_info.json | 6 +- .../assets/localization/zh/protocol_list.json | 2 +- .../localization/zh/protocol_setup.json | 107 +++++++++--------- .../localization/zh/quick_transfer.json | 47 ++++---- .../assets/localization/zh/run_details.json | 63 ++++++----- app/src/assets/localization/zh/shared.json | 21 ++-- .../localization/zh/top_navigation.json | 9 +- 46 files changed, 430 insertions(+), 333 deletions(-) diff --git a/app/src/assets/localization/en/app_settings.json b/app/src/assets/localization/en/app_settings.json index c6c4b595597..540df5ef394 100644 --- a/app/src/assets/localization/en/app_settings.json +++ b/app/src/assets/localization/en/app_settings.json @@ -117,7 +117,7 @@ "usb_to_ethernet_unknown_manufacturer": "Unknown Manufacturer", "usb_to_ethernet_unknown_product": "Unknown Adapter", "use_system_language": "Use system language", - "view_software_update": "View software update", "view_adapter_info": "view adapter info", + "view_software_update": "View software update", "view_update": "View Update" } diff --git a/app/src/assets/localization/en/change_pipette.json b/app/src/assets/localization/en/change_pipette.json index b9ca35752d5..f63445ea779 100644 --- a/app/src/assets/localization/en/change_pipette.json +++ b/app/src/assets/localization/en/change_pipette.json @@ -1,8 +1,8 @@ { "are_you_sure_exit": "Are you sure you want to exit before {{direction}} your pipette?", "attach_name_pipette": "Attach a {{pipette}} Pipette", - "attach_pipette_type": "Attach a {{pipetteName}} Pipette", "attach_pipette": "Attach a pipette", + "attach_pipette_type": "Attach a {{pipetteName}} Pipette", "attach_the_pipette": "

Attach the pipette

Push in the white connector tab until you feel it plug into the pipette.", "attached_pipette_does_not_match": "The attached {{name}} does not match the {{pipette}} you had originally selected.", "attaching": "attaching", @@ -16,10 +16,10 @@ "confirming_attachment": "Confirming attachment", "confirming_detachment": "Confirming detachment", "continue": "Continue", - "detach_pipette_from_mount": "Detach Pipette from {{mount}} Mount", + "detach": "Detach pipette", "detach_pipette": "Detach {{pipette}} from {{mount}} Mount", + "detach_pipette_from_mount": "Detach Pipette from {{mount}} Mount", "detach_try_again": "Detach and try again", - "detach": "Detach pipette", "detaching": "detaching", "get_started": "Get started", "go_back": "Go back", diff --git a/app/src/assets/localization/en/device_details.json b/app/src/assets/localization/en/device_details.json index 17daa2c5955..f394a9a9ac8 100644 --- a/app/src/assets/localization/en/device_details.json +++ b/app/src/assets/localization/en/device_details.json @@ -1,16 +1,16 @@ { "about_gripper": "About gripper", "about_module": "About {{name}}", - "about_pipette_name": "About {{name}} Pipette", "about_pipette": "About pipette", - "abs_reader_status": "Absorbance Plate Reader Status", + "about_pipette_name": "About {{name}} Pipette", "abs_reader_lid_status": "Lid status: {{status}}", + "abs_reader_status": "Absorbance Plate Reader Status", + "add": "Add", "add_fixture_description": "Add this hardware to your deck configuration. It will be referenced during protocol analysis.", "add_to_slot": "Add to slot {{slotName}}", - "add": "Add", + "an_error_occurred_while_updating": "An error occurred while updating your pipette's settings.", "an_error_occurred_while_updating_module": "An error occurred while updating your {{moduleName}}. Please try again.", "an_error_occurred_while_updating_please_try_again": "An error occurred while updating your pipette's settings. Please try again.", - "an_error_occurred_while_updating": "An error occurred while updating your pipette's settings.", "attach_gripper": "Attach gripper", "attach_pipette": "Attach pipette", "bad_run": "run could not be loaded", @@ -18,13 +18,13 @@ "bundle_firmware_file_not_found": "Bundled fw file not found for module of type: {{module}}", "calibrate_gripper": "Calibrate gripper", "calibrate_now": "Calibrate now", - "calibrate_pipette_offset": "Calibrate pipette offset", "calibrate_pipette": "Calibrate pipette", - "calibration_needed_without_link": "Calibration needed.", + "calibrate_pipette_offset": "Calibrate pipette offset", "calibration_needed": "Calibration needed. Calibrate now", + "calibration_needed_without_link": "Calibration needed.", "canceled": "canceled", - "changes_will_be_lost_description": "Are you sure you want to exit without saving your deck configuration?", "changes_will_be_lost": "Changes will be lost", + "changes_will_be_lost_description": "Are you sure you want to exit without saving your deck configuration?", "choose_protocol_to_run": "Choose protocol to Run on {{name}}", "close_lid": "Close lid", "completed": "completed", @@ -36,9 +36,9 @@ "current_temp": "Current: {{temp}} °C", "current_version": "Current Version", "deck_cal_missing": "Pipette Offset calibration missing. Calibrate deck first.", + "deck_configuration": "deck configuration", "deck_configuration_is_not_available_when_robot_is_busy": "Deck configuration is not available when the robot is busy", "deck_configuration_is_not_available_when_run_is_in_progress": "Deck configuration is not available when run is in progress", - "deck_configuration": "deck configuration", "deck_fixture_setup_instructions": "Deck fixture setup instructions", "deck_fixture_setup_modal_bottom_description_desktop": "For detailed instructions for different types of fixtures, scan the QR code or go to the link below.", "deck_fixture_setup_modal_top_description": "First, unscrew and remove the deck slot where you'll install a fixture. Then put the fixture in place and attach it as needed.", @@ -58,14 +58,14 @@ "estop_pressed": "E-stop pressed. Robot movement is halted.", "failed": "failed", "files": "Files", - "firmware_update_needed": "Instrument firmware update needed. Start the update on the robot's touchscreen.", "firmware_update_available": "Firmware update available.", "firmware_update_failed": "Failed to update module firmware", - "firmware_updated_successfully": "Firmware updated successfully", + "firmware_update_needed": "Instrument firmware update needed. Start the update on the robot's touchscreen.", "firmware_update_occurring": "Firmware update in progress...", + "firmware_updated_successfully": "Firmware updated successfully", "fixture": "Fixture", - "have_not_run_description": "After you run some protocols, they will appear here.", "have_not_run": "No recent runs", + "have_not_run_description": "After you run some protocols, they will appear here.", "heater": "Heater", "height_ranges": "{{gen}} Height Ranges", "hot_to_the_touch": "Module is hot to the touch", @@ -74,12 +74,12 @@ "instruments_and_modules": "Instruments and Modules", "labware_bottom": "Labware Bottom", "last_run_time": "last run {{number}}", - "left_right": "Left + Right Mounts", "left": "left", + "left_right": "Left + Right Mounts", "lights": "Lights", "link_firmware_update": "View Firmware Update", - "location_conflicts": "Location conflicts", "location": "Location", + "location_conflicts": "Location conflicts", "magdeck_gen1_height": "Height: {{height}}", "magdeck_gen2_height": "Height: {{height}} mm", "max_engage_height": "Max Engage Height", @@ -88,13 +88,13 @@ "missing_hardware": "missing hardware", "missing_instrument": "missing {{num}} instrument", "missing_instruments_plural": "missing {{count}} instruments", - "missing_module_plural": "missing {{count}} modules", "missing_module": "missing {{num}} module", + "missing_module_plural": "missing {{count}} modules", "module_actions_unavailable": "Module actions unavailable while protocol is running", + "module_calibration_required": "Module calibration required.", "module_calibration_required_no_pipette_attached": "Module calibration required. Attach a pipette before running module calibration.", "module_calibration_required_no_pipette_calibrated": "Module calibration required. Calibrate pipette before running module calibration. ", "module_calibration_required_update_pipette_FW": "Update pipette firmware before proceeding with required module calibration.", - "module_calibration_required": "Module calibration required.", "module_controls": "Module Controls", "module_error": "Module error", "module_name_error": "{{moduleName}} error", @@ -105,8 +105,8 @@ "no_deck_fixtures": "No deck fixtures", "no_protocol_runs": "No protocol runs yet!", "no_protocols_found": "No protocols found", - "no_recent_runs_description": "After you run some protocols, they will appear here.", "no_recent_runs": "No recent runs", + "no_recent_runs_description": "After you run some protocols, they will appear here.", "num_units": "{{num}} mm", "offline_deck_configuration": "Robot must be on the network to see deck configuration", "offline_instruments_and_modules": "Robot must be on the network to see connected instruments and modules", @@ -132,32 +132,32 @@ "protocol_analysis_failed": "Protocol failed in-app analysis. ", "protocol_analysis_stale": "Protocol analysis out of date. ", "protocol_details_page_reanalyze": "Go to the protocol details screen to reanalyze.", - "ready_to_run": "ready to run", "ready": "Ready", + "ready_to_run": "ready to run", "recalibrate_gripper": "Recalibrate gripper", "recalibrate_now": "Recalibrate now", - "recalibrate_pipette_offset": "Recalibrate pipette offset", "recalibrate_pipette": "Recalibrate pipette", + "recalibrate_pipette_offset": "Recalibrate pipette offset", "recent_protocol_runs": "Recent Protocol Runs", - "rerun_now": "Rerun protocol now", "rerun_loading": "Protocol re-run is disabled until data connection fully loads", + "rerun_now": "Rerun protocol now", "reset_all": "Reset all", "reset_estop": "Reset E-stop", "resume_operation": "Resume operation", "right": "right", "robot_control_not_available": "Some robot controls are not available when run is in progress", "robot_initializing": "Initializing...", + "run": "Run", "run_a_protocol": "Run a protocol", "run_again": "Run again", "run_duration": "Run duration", - "run": "Run", "select_options": "Select options", "serial_number": "Serial Number", "set_block_temp": "Set temperature", "set_block_temperature": "Set block temperature", + "set_engage_height": "Set Engage Height", "set_engage_height_and_enter_integer": "Set the engage height for this Magnetic Module. Enter an integer between {{lower}} and {{higher}}.", "set_engage_height_for_module": "Set Engage Height for {{name}}", - "set_engage_height": "Set Engage Height", "set_lid_temperature": "Set lid temperature", "set_shake_of_hs": "Set rpm for this module.", "set_shake_speed": "Set shake speed", @@ -174,8 +174,8 @@ "target_temp": "Target: {{temp}} °C", "tc_block": "Block", "tc_lid": "Lid", - "tc_set_temperature_body": "Pre heat or cool your Thermocycler {{part}}. Enter a whole number between {{min}} °C and {{max}} °C.", "tc_set_temperature": "Set {{part}} Temperature for {{name}}", + "tc_set_temperature_body": "Pre heat or cool your Thermocycler {{part}}. Enter a whole number between {{min}} °C and {{max}} °C.", "tempdeck_slideout_body": "Pre heat or cool your {{model}}. Enter a whole number between 4 °C and 96 °C.", "tempdeck_slideout_title": "Set Temperature for {{name}}", "temperature": "Temperature", @@ -185,12 +185,12 @@ "trash": "Trash", "update_now": "Update now", "updating_firmware": "Updating firmware...", - "usb_port_not_connected": "usb not connected", "usb_port": "usb-{{port}}", + "usb_port_not_connected": "usb not connected", "version": "Version {{version}}", + "view": "View", "view_pipette_setting": "Pipette Settings", "view_run_record": "View protocol run record", - "view": "View", "waste_chute": "Waste chute", "welcome_modal_description": "A place to run protocols, manage your instruments, and view robot status.", "welcome_to_your_dashboard": "Welcome to your dashboard!", diff --git a/app/src/assets/localization/en/device_settings.json b/app/src/assets/localization/en/device_settings.json index 06a67d39d35..e0a199fbee4 100644 --- a/app/src/assets/localization/en/device_settings.json +++ b/app/src/assets/localization/en/device_settings.json @@ -318,8 +318,8 @@ "unable_to_commit_update": "Unable to commit update", "unable_to_connect": "Unable to connect to Wi-Fi", "unable_to_disconnect": "Unable to disconnect from Wi-Fi", - "unable_to_find_system_file": "Unable to find system file for update", "unable_to_find_robot_with_name": "Unable to find online robot with name", + "unable_to_find_system_file": "Unable to find system file for update", "unable_to_restart": "Unable to restart robot", "unable_to_start_update_session": "Unable to start update session", "up_to_date": "up to date", diff --git a/app/src/assets/localization/en/gripper_wizard_flows.json b/app/src/assets/localization/en/gripper_wizard_flows.json index 70df5688820..929627bf064 100644 --- a/app/src/assets/localization/en/gripper_wizard_flows.json +++ b/app/src/assets/localization/en/gripper_wizard_flows.json @@ -10,8 +10,8 @@ "continue": "Continue", "continue_calibration": "Continue calibration", "detach_gripper": "Detach Gripper", - "firmware_updating": "A firmware update is required, instrument is updating...", "firmware_up_to_date": "Firmware is up to date.", + "firmware_updating": "A firmware update is required, instrument is updating...", "get_started": "Get started", "gripper_calibration": "Gripper Calibration", "gripper_recalibration": "Gripper Recalibration", diff --git a/app/src/assets/localization/en/heater_shaker.json b/app/src/assets/localization/en/heater_shaker.json index 12ac83a4123..0eec55e6a11 100644 --- a/app/src/assets/localization/en/heater_shaker.json +++ b/app/src/assets/localization/en/heater_shaker.json @@ -4,43 +4,43 @@ "cannot_shake": "Cannot shake when labware latch is open", "close_labware_latch": "Close labware latch", "close_latch": "Close latch", - "closed_and_locked": "Closed and Locked", "closed": "Closed", + "closed_and_locked": "Closed and Locked", "closing": "Closing...", "complete": "Complete", "confirm_attachment": "Confirm attachment", "confirm_heater_shaker_modal_attachment": "Confirm Heater-Shaker Module attachment", "continue_shaking_protocol_start_prompt": "Continue shaking while the protocol starts?", + "deactivate": "Deactivate", "deactivate_heater": "Deactivate heater", "deactivate_shaker": "Deactivate shaker", - "deactivate": "Deactivate", "heater_shaker_in_slot": "Attach {{moduleName}} in Slot {{slotName}} before proceeding", "heater_shaker_is_shaking": "Heater-Shaker Module is currently shaking", "keep_shaking_start_run": "Keep shaking and start run", - "labware_latch": "Labware Latch", "labware": "Labware", + "labware_latch": "Labware Latch", "min_max_rpm": "{{min}} - {{max}} rpm", "module_anchors_extended": "Before the run begins, module should have both anchors fully extended for a firm attachment to the deck.", "module_in_slot": "{{moduleName}} in Slot {{slotName}}", "module_should_have_anchors": "Module should have both anchors fully extended for a firm attachment to the deck.", + "open": "Open", "open_labware_latch": "Open labware latch", "open_latch": "Open latch", - "open": "Open", "opening": "Opening...", "proceed_to_run": "Proceed to run", "set_shake_speed": "Set shake speed", "set_temperature": "Set module temperature", "shake_speed": "Shake speed", "show_attachment_instructions": "Show attachment instructions", - "stop_shaking_start_run": "Stop shaking and start run", "stop_shaking": "Stop Shaking", + "stop_shaking_start_run": "Stop shaking and start run", "t10_torx_screwdriver": "{{name}} Screwdriver", "t10_torx_screwdriver_subtitle": "Provided with the Heater-Shaker. Using another size can strip the module's screws.", + "test_shake": "Test shake", "test_shake_banner_information": "If you want to add labware to the module before doing a test shake, you can use the labware latch controls to hold the latches open.", "test_shake_banner_labware_information": "If you want to add the {{labware}} to the module before doing a test shake, you can use the labware latch controls.", "test_shake_slideout_banner_info": "If you want to add labware to the module before doing a test shake, you can use the labware latch controls to hold the latches open.", "test_shake_troubleshooting_slideout_description": "Revisit instructions for attaching the module to the deck as well as attaching the thermal adapter.", - "test_shake": "Test shake", "thermal_adapter_attached_to_module": "The thermal adapter should be attached to the module.", "troubleshoot_step_1": "Return to Step 1 to see instructions for securing the module to the deck.", "troubleshoot_step_3": "Return to Step 3 to see instructions for securing the thermal adapter to the module.", diff --git a/app/src/assets/localization/en/incompatible_modules.json b/app/src/assets/localization/en/incompatible_modules.json index d9b1a231f0c..6829c971d24 100644 --- a/app/src/assets/localization/en/incompatible_modules.json +++ b/app/src/assets/localization/en/incompatible_modules.json @@ -1,7 +1,7 @@ { "incompatible_modules_attached": "incompatible module detected", - "remove_before_running_protocol": "Remove the following hardware before running a protocol:", + "is_not_compatible": "{{module_name}} is not compatible with the {{robot_type}}", "needs_your_assistance": "{{robot_name}} needs your assistance", - "remove_before_using": "You must remove incompatible modules before using this robot.", - "is_not_compatible": "{{module_name}} is not compatible with the {{robot_type}}" + "remove_before_running_protocol": "Remove the following hardware before running a protocol:", + "remove_before_using": "You must remove incompatible modules before using this robot." } diff --git a/app/src/assets/localization/en/labware_details.json b/app/src/assets/localization/en/labware_details.json index 3b25beffefc..ef1b786d666 100644 --- a/app/src/assets/localization/en/labware_details.json +++ b/app/src/assets/localization/en/labware_details.json @@ -8,8 +8,8 @@ "generic": "generic", "height": "height", "length": "length", - "manufacturer_number": "manufacturer / catalog #", "manufacturer": "manufacturer", + "manufacturer_number": "manufacturer / catalog #", "max_volume": "max volume", "measurements": "Measurements (mm)", "na": "n/a", @@ -21,8 +21,8 @@ "u": "U_Bottom", "v": "V_Bottom", "various": "various", - "well_count": "Well Count", "well": "Well", + "well_count": "Well Count", "width": "width", "x_offset": "x-offset", "x_size": "x-size", diff --git a/app/src/assets/localization/en/labware_landing.json b/app/src/assets/localization/en/labware_landing.json index 17eebda979d..3780788b4ee 100644 --- a/app/src/assets/localization/en/labware_landing.json +++ b/app/src/assets/localization/en/labware_landing.json @@ -3,20 +3,20 @@ "cancel": "cancel", "cannot-run-python-missing-labware": "Robots cannot run Python protocols with missing labware definitions.", "category": "Category", - "choose_file_to_upload": "Or choose a file from your computer to upload.", "choose_file": "Choose file", + "choose_file_to_upload": "Or choose a file from your computer to upload.", "copied": "Copied!", "create_new_def": "Create a new labware definition", "custom_def": "Custom Definition", "date_added": "Added", "def_moved_to_trash": "This labware definition will be moved to this computer’s trash and may be unrecoverable.", - "delete_this_labware": "Delete this labware definition?", "delete": "Delete", + "delete_this_labware": "Delete this labware definition?", "duplicate_labware_def": "Duplicate labware definition", "error_importing_file": "Error importing {{filename}}.", "go_to_def": "Go to labware definition", - "import_custom_def": "Import a Custom Labware Definition", "import": "Import", + "import_custom_def": "Import a Custom Labware Definition", "imported": "{{filename}} imported.", "invalid_labware_def": "Invalid labware definition", "labware": "labware", diff --git a/app/src/assets/localization/en/labware_position_check.json b/app/src/assets/localization/en/labware_position_check.json index 4072826650a..3d4e83fe706 100644 --- a/app/src/assets/localization/en/labware_position_check.json +++ b/app/src/assets/localization/en/labware_position_check.json @@ -25,8 +25,8 @@ "confirm_position_and_pick_up_tip": "Confirm position, pick up tip", "confirm_position_and_return_tip": "Confirm position, return tip to Slot {{next_slot}} and home", "detach_probe": "Remove calibration probe", - "ensure_nozzle_position_odd": "Ensure that the {{tip_type}} is centered above and level with {{item_location}}. If it isn't, tap Move pipette and then jog the pipette until it is properly aligned.", "ensure_nozzle_position_desktop": "Ensure that the {{tip_type}} is centered above and level with {{item_location}}. If it isn't, use the controls below or your keyboard to jog the pipette until it is properly aligned.", + "ensure_nozzle_position_odd": "Ensure that the {{tip_type}} is centered above and level with {{item_location}}. If it isn't, tap Move pipette and then jog the pipette until it is properly aligned.", "exit_screen_confirm_exit": "Exit and discard all labware offsets", "exit_screen_go_back": "Go back to labware position check", "exit_screen_subtitle": "If you exit now, all labware offsets will be discarded. This cannot be undone.", @@ -35,9 +35,10 @@ "install_probe": "Take the calibration probe from its storage location. Ensure its collar is fully unlocked. Push the pipette ejector up and press the probe firmly onto the {{location}} pipette nozzle as far as it can go. Twist the collar to lock the probe. Test that the probe is secure by gently pulling it back and forth.", "jog_controls_adjustment": "Need to make an adjustment?", "jupyter_notebook": "Jupyter Notebook", + "labware": "labware", "labware_display_location_text": "Deck Slot {{slot}}", - "labware_offset_data": "labware offset data", "labware_offset": "Labware Offset", + "labware_offset_data": "labware offset data", "labware_offsets_deleted_warning": "Once you begin Labware Position Check, previously created Labware Offsets will be discarded.", "labware_offsets_summary_labware": "Labware", "labware_offsets_summary_location": "Location", @@ -46,22 +47,21 @@ "labware_position_check_description": "Labware Position Check is a guided workflow that checks every labware on the deck for an added degree of precision in your protocol.Labware Position Check first checks tip racks, and then checks all other labware used in your protocol.", "labware_position_check_overview": "Labware Position Check Overview", "labware_position_check_title": "Labware Position Check", - "labware_step_detail_labware_plural": "The tips should be centered above column 1 in {{labware_name}} and level with the top of the labware.", "labware_step_detail_labware": "The tip should be centered above A1 in {{labware_name}} and level with the top of the labware.", + "labware_step_detail_labware_plural": "The tips should be centered above column 1 in {{labware_name}} and level with the top of the labware.", "labware_step_detail_link": "See how to tell if the pipette is centered", "labware_step_detail_modal_heading": "How to tell if the pipette is centered and level", + "labware_step_detail_modal_nozzle": "To ensure that the nozzle is centered, check from a second side of your OT-2.", "labware_step_detail_modal_nozzle_image_1_text": "Viewed from front, it appears centered...", "labware_step_detail_modal_nozzle_image_2_nozzle_text": "Nozzle is not centered", "labware_step_detail_modal_nozzle_image_2_text": "...but viewed from side, it requires adjustment", + "labware_step_detail_modal_nozzle_or_tip": "To ensure the nozzle or tip is level with the top of the labware, position yourself at eye-level and/or slide a sheet of paper between the nozzle and tip.", "labware_step_detail_modal_nozzle_or_tip_image_1_text": "Viewed from standing height, it appears level...", "labware_step_detail_modal_nozzle_or_tip_image_2_nozzle_text": "Nozzle is not level", "labware_step_detail_modal_nozzle_or_tip_image_2_text": "... but viewed from eye-level, it requires adjustment", "labware_step_detail_modal_nozzle_or_tip_image_3_text": "If you’re having trouble, slide 1 sheet of printer paper between the nozzle and the tip. A single piece of paper should barely pass between them.", - "labware_step_detail_modal_nozzle_or_tip": "To ensure the nozzle or tip is level with the top of the labware, position yourself at eye-level and/or slide a sheet of paper between the nozzle and tip.", - "labware_step_detail_modal_nozzle": "To ensure that the nozzle is centered, check from a second side of your OT-2.", - "labware_step_detail_tiprack_plural": "The pipette nozzles should be centered above column 1 in {{tiprack_name}} and level with the top of the tips.", "labware_step_detail_tiprack": "The pipette nozzle should be centered above A1 in {{tiprack_name}} and level with the top of the tip.", - "labware": "labware", + "labware_step_detail_tiprack_plural": "The pipette nozzles should be centered above column 1 in {{tiprack_name}} and level with the top of the tips.", "learn_more": "Learn more", "location": "location", "lpc_complete_summary_screen_heading": "Labware Position Check Complete", @@ -73,9 +73,9 @@ "new_labware_offset_data": "New labware offset data", "ninety_six_probe_location": "A1 (back left corner)", "no_labware_offsets": "No Labware Offset", + "no_offset_data": "No offset data available", "no_offset_data_available": "No labware offset data available", "no_offset_data_on_robot": "This robot has no useable labware offset data for this run.", - "no_offset_data": "No offset data available", "offsets": "offsets", "pick_up_tip_from_rack_in_location": "Pick up tip from tip rack in {{location}}", "picking_up_tip_title": "Picking up tip in slot {{slot}}", @@ -98,13 +98,13 @@ "robot_has_no_offsets_from_previous_runs": "Labware offset data references previous protocol run labware locations to save you time. If all the labware in this protocol have been checked in previous runs, that data will be applied to this run. You can add new offsets with Labware Position Check in later steps.", "robot_has_offsets_from_previous_runs": "This robot has offsets for labware used in this protocol. If you apply these offsets, you can still adjust them with Labware Position Check.", "robot_in_motion": "Stand back, robot is in motion.", - "run_labware_position_check": "run labware position check", "run": "Run", + "run_labware_position_check": "run labware position check", "secondary_pipette_tipracks_section": "Check tip racks with {{secondary_mount}} Pipette", "see_how_offsets_work": "See how labware offsets work", + "slot": "Slot {{slotName}}", "slot_location": "slot location", "slot_name": "slot {{slotName}}", - "slot": "Slot {{slotName}}", "start_position_check": "begin labware position check, move to Slot {{initial_labware_slot}}", "stored_offset_data": "Apply Stored Labware Offset Data?", "stored_offsets_for_this_protocol": "Stored Labware Offset data that applies to this protocol", diff --git a/app/src/assets/localization/en/module_wizard_flows.json b/app/src/assets/localization/en/module_wizard_flows.json index 34e14017162..2ca733e2725 100644 --- a/app/src/assets/localization/en/module_wizard_flows.json +++ b/app/src/assets/localization/en/module_wizard_flows.json @@ -1,21 +1,21 @@ { "attach_probe": "Attach probe to pipette", "begin_calibration": "Begin calibration", - "calibrate_pipette": "Calibrate pipettes before proceeding to module calibration", "calibrate": "Calibrate", + "calibrate_pipette": "Calibrate pipettes before proceeding to module calibration", + "calibration": "{{module}} Calibration", "calibration_adapter_heatershaker": "Calibration Adapter", "calibration_adapter_temperature": "Calibration Adapter", "calibration_adapter_thermocycler": "Calibration Adapter", - "calibration_probe_touching_thermocycler": "The calibration probe will touch the sides of the calibration square in Thermocycler to determine its exact position", - "calibration_probe_touching": "The calibration probe will touch the sides of the calibration square in {{module}} in slot {{slotNumber}} to determine its exact position", "calibration_probe": "Take the calibration probe from its storage location. Ensure its collar is unlocked. Push the pipette ejector up and press the probe firmly onto the pipette nozzle. Twist the collar to lock the probe. Test that the probe is secure by gently pulling it back and forth.", - "calibration": "{{module}} Calibration", + "calibration_probe_touching": "The calibration probe will touch the sides of the calibration square in {{module}} in slot {{slotNumber}} to determine its exact position", + "calibration_probe_touching_thermocycler": "The calibration probe will touch the sides of the calibration square in Thermocycler to determine its exact position", "checking_firmware": "Checking {{module}} firmware", "complete_calibration": "Complete calibration", "confirm_location": "Confirm location", "confirm_placement": "Confirm placement", - "detach_probe_description": "Unlock the pipette calibration probe, remove it from the nozzle, and return it to its storage location.", "detach_probe": "Remove pipette probe", + "detach_probe_description": "Unlock the pipette calibration probe, remove it from the nozzle, and return it to its storage location.", "error_during_calibration": "Error during calibration", "error_prepping_module": "Error prepping module for calibration", "exit": "Exit", @@ -32,16 +32,16 @@ "move_gantry_to_front": "Move gantry to front", "next": "Next", "pipette_probe": "Pipette probe", + "place_flush": "Place the adapter flush on top of the module.", "place_flush_heater_shaker": "Place the adapter flush on the top of the module. Secure the adapter to the module with a thermal adapter screw and T10 Torx screwdriver.", "place_flush_thermocycler": "Ensure the Thermocycler lid is open and place the adapter flush on top of the module where the labware would normally go. ", - "place_flush": "Place the adapter flush on top of the module.", "prepping_module": "Prepping {{module}} for module calibration", "recalibrate": "Recalibrate", "select_location": "Select module location", "select_the_slot": "Select the slot where you installed the {{module}} on the deck map to the right. The location must be correct for successful calibration.", "slot_unavailable": "Slot unavailable", - "stand_back_robot_in_motion": "Stand back, robot is in motion", "stand_back": "Stand back, calibration in progress", + "stand_back_robot_in_motion": "Stand back, robot is in motion", "start_setup": "Start setup", "successfully_calibrated": "{{module}} successfully calibrated" } diff --git a/app/src/assets/localization/en/pipette_wizard_flows.json b/app/src/assets/localization/en/pipette_wizard_flows.json index 1154d6f9659..02b186d4026 100644 --- a/app/src/assets/localization/en/pipette_wizard_flows.json +++ b/app/src/assets/localization/en/pipette_wizard_flows.json @@ -2,14 +2,14 @@ "align_the_connector": "Attach the pipette to the robot by aligning the connector and pressing to ensure a secure connection. Hold the pipette in place and use the hex screwdriver to tighten the pipette screws. Then test that the pipette is securely attached by gently pulling it side to side.", "all_pipette_detached": "All pipettes successfully detached", "are_you_sure_exit": "Are you sure you want to exit before completing {{flow}}?", - "attach_96_channel_plus_detach": "Detach {{pipetteName}} and Attach 96-Channel Pipette", + "attach": "Attaching Pipette", "attach_96_channel": "Attach 96-Channel Pipette", - "attach_mounting_plate_instructions": "Attach the mounting plate by aligning the pins on the plate to the slots on the gantry carriage. You may need to adjust the position of the right pipette mount to achieve proper alignment.", + "attach_96_channel_plus_detach": "Detach {{pipetteName}} and Attach 96-Channel Pipette", "attach_mounting_plate": "Attach Mounting Plate", + "attach_mounting_plate_instructions": "Attach the mounting plate by aligning the pins on the plate to the slots on the gantry carriage. You may need to adjust the position of the right pipette mount to achieve proper alignment.", "attach_pip": "attach pipette", "attach_pipette": "attach {{mount}} pipette", "attach_probe": "attach calibration probe", - "attach": "Attaching Pipette", "backmost": "backmost", "before_you_begin": "Before you begin", "begin_calibration": "Begin calibration", @@ -25,6 +25,7 @@ "connect_and_secure_pipette": "connect and secure pipette", "continue": "Continue", "critical_unskippable_step": "this is a critical step that should not be skipped", + "detach": "Detaching Pipette", "detach_96_attach_mount": "Detach 96-Channel Pipette and Attach {{mount}} Pipette", "detach_96_channel": "Detach 96-Channel Pipette", "detach_and_reattach": "Detach and reattach pipette", @@ -32,14 +33,13 @@ "detach_mount_attach_96": "Detach {{mount}} Pipette and Attach 96-Channel Pipette", "detach_mounting_plate_instructions": "Hold onto the plate so it does not fall. Then remove the pins on the plate from the slots on the gantry carriage.", "detach_next_pipette": "Detach next pipette", - "detach_pipette_to_attach_96": "Detach {{pipetteName}} and Attach 96-Channel pipette", "detach_pipette": "detach {{mount}} pipette", + "detach_pipette_to_attach_96": "Detach {{pipetteName}} and Attach 96-Channel pipette", "detach_pipettes_attach_96": "Detach Pipettes and Attach 96-Channel Pipette", "detach_z_axis_screw_again": "detach the z-axis screw before attaching the 96-Channel Pipette.", - "detach": "Detaching Pipette", "exit_cal": "Exit calibration", - "firmware_updating": "A firmware update is required, instrument is updating...", "firmware_up_to_date": "No firmware update found.", + "firmware_updating": "A firmware update is required, instrument is updating...", "gantry_empty_for_96_channel_success": "Now that both mounts are empty, you can begin the 96-Channel Pipette attachment process.", "get_started_detach": "To get started, remove labware from the deck and clean up the working area to make detachment easier. Also gather the needed equipment shown to the right.", "grab_screwdriver": "While continuing to hold in place, grab your 2.5mm driver and tighten screws as shown in the animation. Test the pipette attachment by giving it a wiggle before pressing continue", @@ -71,8 +71,8 @@ "reattach_carriage": "reattach z-axis carriage", "recalibrate_pipette": "recalibrate {{mount}} pipette", "remove_cal_probe": "remove calibration probe", - "remove_labware_to_get_started": "To get started, remove labware from the deck and clean up the working area to make calibration easier. Also gather the needed equipment shown to the right.The calibration probe is included with the robot and should be stored on the front pillar of the robot.", "remove_labware": "To get started, remove labware from the deck and clean up the working area to make attachment and calibration easier. Also gather the needed equipment shown to the right.The calibration probe is included with the robot and should be stored on the front pillar of the robot.", + "remove_labware_to_get_started": "To get started, remove labware from the deck and clean up the working area to make calibration easier. Also gather the needed equipment shown to the right.The calibration probe is included with the robot and should be stored on the front pillar of the robot.", "remove_probe": "unlock the calibration probe, remove it from the nozzle, and return it to its storage location.", "replace_pipette": "replace {{mount}} pipette", "return_probe_error": "Return the calibration probe to its storage location before exiting. {{error}}", diff --git a/app/src/assets/localization/en/protocol_command_text.json b/app/src/assets/localization/en/protocol_command_text.json index 8037b8f2778..c3620eac904 100644 --- a/app/src/assets/localization/en/protocol_command_text.json +++ b/app/src/assets/localization/en/protocol_command_text.json @@ -59,9 +59,9 @@ "offdeck": "offdeck", "on_location": "on {{location}}", "opening_tc_lid": "Opening Thermocycler lid", + "partial_layout": "partial layout", "pause": "Pause", "pause_on": "Pause on {{robot_name}}", - "partial_layout": "partial layout", "pickup_tip": "Picking up tip(s) from {{well_range}} of {{labware}} in {{labware_location}}", "prepare_to_aspirate": "Preparing {{pipette}} to aspirate", "reloading_labware": "Reloading {{labware}}", diff --git a/app/src/assets/localization/en/protocol_details.json b/app/src/assets/localization/en/protocol_details.json index b93e675a1c5..e13d929b663 100644 --- a/app/src/assets/localization/en/protocol_details.json +++ b/app/src/assets/localization/en/protocol_details.json @@ -10,31 +10,31 @@ "connected": "connected", "connection_status": "connection status", "creation_method": "creation method", - "csv_file_type_required": "CSV file type required", "csv_file": "CSV file", + "csv_file_type_required": "CSV file type required", "deck_view": "Deck View", "default_value": "Default Value", - "delete_protocol_perm": "{{name}} and its run history will be permanently deleted.", "delete_protocol": "Delete Protocol", + "delete_protocol_perm": "{{name}} and its run history will be permanently deleted.", "delete_this_protocol": "Delete this protocol?", "description": "description", "extension_mount": "extension mount", "file_required": "File required", "go_to_labware_definition": "Go to labware definition", "go_to_timeline": "Go to timeline", - "gripper_pick_up_count_description": "individual move labware commands that use the gripper.", "gripper_pick_up_count": "Grip Count", + "gripper_pick_up_count_description": "individual move labware commands that use the gripper.", "hardware": "hardware", - "labware_name": "Labware name", "labware": "labware", + "labware_name": "Labware name", "last_analyzed": "last analyzed", "last_updated": "last updated", "left_and_right_mounts": "left + right mounts", "left_mount": "left mount", "left_right": "Left, Right", "liquid_name": "liquid name", - "liquids_not_in_protocol": "no liquids are specified for this protocol", "liquids": "liquids", + "liquids_not_in_protocol": "no liquids are specified for this protocol", "listed_values_are_view_only": "Listed values are view-only", "location": "location", "modules": "modules", @@ -50,16 +50,16 @@ "num_choices": "{{num}} choices", "num_options": "{{num}} options", "off": "Off", - "on_off": "On, off", "on": "On", + "on_off": "On, off", "org_or_author": "org/author", "parameters": "Parameters", - "pipette_aspirate_count_description": "individual aspirate commands per pipette.", "pipette_aspirate_count": "{{pipette}} aspirate count", - "pipette_dispense_count_description": "individual dispense commands per pipette.", + "pipette_aspirate_count_description": "individual aspirate commands per pipette.", "pipette_dispense_count": "{{pipette}} dispense count", - "pipette_pick_up_count_description": "individual pick up tip commands per pipette.", + "pipette_dispense_count_description": "individual dispense commands per pipette.", "pipette_pick_up_count": "{{pipette}} pick up tip count", + "pipette_pick_up_count_description": "individual pick up tip commands per pipette.", "proceed_to_setup": "Proceed to setup", "protocol_designer_version": "Protocol Designer {{version}}", "protocol_failed_app_analysis": "This protocol failed in-app analysis. It may be unusable on robots without custom software configurations.", @@ -73,24 +73,24 @@ "requires_upload": "Requires upload", "restore_defaults": "Restore default values", "right_mount": "right mount", + "robot": "robot", "robot_configuration": "robot configuration", - "robot_is_busy_with_protocol": "{{robotName}} is busy with {{protocolName}} in {{runStatus}} state. Do you want to clear it and proceed?", "robot_is_busy": "{{robotName}} is busy", - "robot": "robot", + "robot_is_busy_with_protocol": "{{robotName}} is busy with {{protocolName}} in {{runStatus}} state. Do you want to clear it and proceed?", "run_protocol": "Run protocol", "select_parameters_for_robot": "Select parameters for {{robot_name}}", "send": "Send", "sending": "Sending", "show_in_folder": "Show in folder", "slot": "Slot {{slotName}}", - "start_setup_customize_values": "Start setup to customize values", "start_setup": "Start setup", + "start_setup_customize_values": "Start setup to customize values", "successfully_sent": "Successfully sent", "total_volume": "total volume", - "unavailable_or_busy_robot_not_listed_plural": "{{count}} unavailable or busy robots are not listed.", "unavailable_or_busy_robot_not_listed": "{{count}} unavailable or busy robot is not listed.", - "unavailable_robot_not_listed_plural": "{{count}} unavailable robots are not listed.", + "unavailable_or_busy_robot_not_listed_plural": "{{count}} unavailable or busy robots are not listed.", "unavailable_robot_not_listed": "{{count}} unavailable robot is not listed.", + "unavailable_robot_not_listed_plural": "{{count}} unavailable robots are not listed.", "unsuccessfully_sent": "Unsuccessfully sent", "value_out_of_range": "Value must be between {{min}}-{{max}}", "view_run_details": "View run details", diff --git a/app/src/assets/localization/en/protocol_info.json b/app/src/assets/localization/en/protocol_info.json index 66c2fc9aa89..9278d55361e 100644 --- a/app/src/assets/localization/en/protocol_info.json +++ b/app/src/assets/localization/en/protocol_info.json @@ -23,9 +23,9 @@ "exit_modal_heading": "Confirm Close Protocol", "failed_analysis": "failed analysis", "get_labware_offset_data": "Get Labware Offset Data", + "import": "Import", "import_a_file": "Import a protocol to get started", "import_new_protocol": "Import a Protocol", - "import": "Import", "incompatible_file_type": "Incompatible file type", "instrument_cal_data_title": "Calibration data", "instrument_not_attached": "Not attached", @@ -38,8 +38,8 @@ "labware_offset_data_title": "Labware Offset data", "labware_offsets_info": "{{number}} Labware Offsets", "labware_position_check_complete_toast_no_offsets": "Labware Position Check complete. No Labware Offsets created.", - "labware_position_check_complete_toast_with_offsets_plural": "Labware Position Check complete. {{count}} Labware Offsets created.", "labware_position_check_complete_toast_with_offsets": "Labware Position Check complete. {{count}} Labware Offset created.", + "labware_position_check_complete_toast_with_offsets_plural": "Labware Position Check complete. {{count}} Labware Offsets created.", "labware_title": "Required Labware", "last_run": "Last Run", "last_run_time": "Last run {{time}}", @@ -83,7 +83,7 @@ "unpin_protocol": "Unpin protocol", "unpinned_protocol": "Unpinned protocol", "update_robot_for_custom_labware": "You have custom labware definitions saved to your app, but this robot needs to be updated before you can use these definitions with Python protocols", - "upload_and_simulate": "Open a protocol to run on {{robot_name}}", "upload": "Upload", + "upload_and_simulate": "Open a protocol to run on {{robot_name}}", "valid_file_types": "Valid file types: Python files (.py) or Protocol Designer files (.json)" } diff --git a/app/src/assets/localization/en/protocol_list.json b/app/src/assets/localization/en/protocol_list.json index d70d8e6e7b7..bfc177829c5 100644 --- a/app/src/assets/localization/en/protocol_list.json +++ b/app/src/assets/localization/en/protocol_list.json @@ -16,8 +16,8 @@ "reanalyze_to_view": "Reanalyze protocol", "right_mount": "right mount", "robot": "robot", - "send_to_robot_overflow": "Send to {{robot_display_name}}", "send_to_robot": "Send protocol to {{robot_display_name}}", + "send_to_robot_overflow": "Send to {{robot_display_name}}", "show_in_folder": "Show in folder", "start_setup": "Start setup", "this_protocol_will_be_trashed": "This protocol will be moved to this computer’s trash and may be unrecoverable.", diff --git a/app/src/assets/localization/en/protocol_setup.json b/app/src/assets/localization/en/protocol_setup.json index 17f60958d55..d740eec25a1 100644 --- a/app/src/assets/localization/en/protocol_setup.json +++ b/app/src/assets/localization/en/protocol_setup.json @@ -263,8 +263,8 @@ "restore_defaults": "Restore default values", "robot_cal_description": "Robot calibration establishes how the robot knows where it is in relation to the deck. Accurate Robot calibration is essential to run protocols successfully. Robot calibration has 3 parts: Deck calibration, Tip Length calibration and Pipette Offset calibration.", "robot_cal_help_title": "How Robot Calibration Works", - "robot_calibration_step_description_pipettes_only": "Review required instruments and calibrations for this protocol.", "robot_calibration_step_description": "Review required pipettes and tip length calibrations for this protocol.", + "robot_calibration_step_description_pipettes_only": "Review required instruments and calibrations for this protocol.", "robot_calibration_step_ready": "Calibration ready", "robot_calibration_step_title": "Instruments", "run": "Run", diff --git a/app/src/assets/localization/en/quick_transfer.json b/app/src/assets/localization/en/quick_transfer.json index 2ebdb5699b8..42717e3a1b6 100644 --- a/app/src/assets/localization/en/quick_transfer.json +++ b/app/src/assets/localization/en/quick_transfer.json @@ -37,6 +37,7 @@ "consolidate_volume_error": "The selected destination well is too small to consolidate into. Try consolidating from fewer wells.", "create_new_to_edit": "Create a new quick transfer to edit", "create_new_transfer": "Create new quick transfer", + "create_to_get_started": "Create a new quick transfer to get started.", "create_transfer": "Create transfer", "delay": "Delay", "delay_after_aspirating": "Delay after aspirating", @@ -44,7 +45,6 @@ "delay_duration_s": "Delay duration (seconds)", "delay_position_mm": "Delay position from bottom of well (mm)", "delay_value": "{{delay}}s, {{position}} mm from bottom", - "create_to_get_started": "Create a new quick transfer to get started.", "delete_this_transfer": "Delete this quick transfer?", "delete_transfer": "Delete quick transfer", "deleted_transfer": "Deleted quick transfer", @@ -63,8 +63,8 @@ "enter_characters": "Enter up to 60 characters", "error_analyzing": "An error occurred while attempting to analyze {{transferName}}.", "exit_quick_transfer": "Exit quick transfer?", - "flow_rate_value": "{{flow_rate}} µL/s", "failed_analysis": "failed analysis", + "flow_rate_value": "{{flow_rate}} µL/s", "got_it": "Got it", "grid": "grid", "grids": "grids", @@ -104,8 +104,8 @@ "reservoir": "Reservoirs", "right_mount": "Right Mount", "run_now": "Run now", - "run_transfer": "Run quick transfer", "run_quick_transfer_now": "Do you want to run your quick transfer now?", + "run_transfer": "Run quick transfer", "save": "Save", "save_for_later": "Save for later", "save_to_run_later": "Save your quick transfer to run it in the future.", @@ -129,15 +129,13 @@ "tip_position": "Tip position", "tip_position_value": "{{position}} mm from the bottom", "tip_rack": "Tip rack", + "too_many_pins_body": "Remove a quick transfer in order to add more transfers to your pinned list.", + "too_many_pins_header": "You've hit your max!", "touch_tip": "Touch tip", "touch_tip_after_aspirating": "Touch tip after aspirating", "touch_tip_before_dispensing": "Touch tip before dispensing", "touch_tip_position_mm": "Touch tip position from bottom of well (mm)", "touch_tip_value": "{{position}} mm from bottom", - "use_deck_slots": "Quick transfers use deck slots B2-D2. These slots hold a tip rack, a source labware, and a destination labware.Make sure that your deck configuration is up to date to avoid collisions.", - "value_out_of_range": "Value must be between {{min}}-{{max}}", - "too_many_pins_body": "Remove a quick transfer in order to add more transfers to your pinned list.", - "too_many_pins_header": "You've hit your max!", "transfer_analysis_failed": "quick transfer analysis failed", "transfer_name": "Transfer Name", "trashBin": "Trash bin", @@ -145,6 +143,8 @@ "tubeRack": "Tube racks", "unpin_transfer": "Unpin quick transfer", "unpinned_transfer": "Unpinned quick transfer", + "use_deck_slots": "Quick transfers use deck slots B2-D2. These slots hold a tip rack, a source labware, and a destination labware.Make sure that your deck configuration is up to date to avoid collisions.", + "value_out_of_range": "Value must be between {{min}}-{{max}}", "volume_per_well": "Volume per well", "volume_per_well_µL": "Volume per well (µL)", "wasteChute": "Waste chute", diff --git a/app/src/assets/localization/en/shared.json b/app/src/assets/localization/en/shared.json index f4e542e761b..6ea0f44ab7a 100644 --- a/app/src/assets/localization/en/shared.json +++ b/app/src/assets/localization/en/shared.json @@ -11,8 +11,8 @@ "change_robot": "Change robot", "clear_data": "clear data", "close": "close", - "closed": "closed", "close_robot_door": "Close the robot door before starting the run.", + "closed": "closed", "confirm": "Confirm", "confirm_placement": "Confirm placement", "confirm_position": "Confirm position", diff --git a/app/src/assets/localization/en/top_navigation.json b/app/src/assets/localization/en/top_navigation.json index 16d5e2d011d..c3391804a59 100644 --- a/app/src/assets/localization/en/top_navigation.json +++ b/app/src/assets/localization/en/top_navigation.json @@ -9,8 +9,8 @@ "instruments": "Instruments", "labware": "Labware", "modules": "modules", - "pipettes_not_calibrated": "Please calibrate all pipettes specified in loaded protocol to proceed", "pipettes": "pipettes", + "pipettes_not_calibrated": "Please calibrate all pipettes specified in loaded protocol to proceed", "please_connect_to_a_robot": "Please connect to a robot to proceed", "please_load_a_protocol": "Please load a protocol to proceed", "protocol_details": "Protocol Details", diff --git a/app/src/assets/localization/zh/anonymous.json b/app/src/assets/localization/zh/anonymous.json index 045245c84f7..7abd8f08615 100644 --- a/app/src/assets/localization/zh/anonymous.json +++ b/app/src/assets/localization/zh/anonymous.json @@ -1,9 +1,9 @@ { - "a_robot_software_update_is_available": "需要更新工作站软件版本才能使用该版本的桌面应用程序运行协议。转到工作站转到工作站", "about_flex_gripper": "关于转板抓手", "alternative_security_types_description": "工作站支持连接到各种企业接入点。通过USB连接并在桌面应用程序中完成设置。", - "attach_a_pipette_for_quick_transfer": "为创建快速移液,您需要在工作站上安装移液器。", "attach_a_pipette": "将移液器连接到工作站", + "attach_a_pipette_for_quick_transfer": "为创建快速移液,您需要在工作站上安装移液器。", "calibration_block_description": "这个金属块是一个特制的工具,完美适配您的甲板,有助于校准。如果您没有校准块,请发送电子邮件给支持团队,以便我们寄送一个给您。在您提供的信息中,请确保包括您的姓名、公司或机构名称和寄送地址。在等待校准块到达过程中,您可以暂时利用工作站里垃圾桶上的平面进行校准。", "calibration_on_opentrons_tips_is_important": "使用上述吸头和吸头盒进行校准非常重要,因为工作站的准确性是基于这些吸头的已知尺寸来确定的。", "choose_what_data_to_share": "选择要共享的工作站数据。", @@ -23,13 +23,14 @@ "find_your_robot": "在应用程序的“设备”栏找到您的工作站,以安装软件更新。", "firmware_update_download_logs": "请与支持人员联系以获得帮助。", "general_error_message": "如果该消息反复出现,请尝试重新启动您的应用程序和工作站。如果这不能解决问题,请与支持人员联系。", + "gripper": "转板抓手", "gripper_still_attached": "转板抓手仍处于连接状态", "gripper_successfully_attached_and_calibrated": "转板抓手已成功连接并校准", "gripper_successfully_calibrated": "转板抓手已成功校准", "gripper_successfully_detached": "转板抓手已成功卸下", - "gripper": "转板抓手", "help_us_improve_send_error_report": "通过向支持团队发送错误报告,帮助我们改进您的使用体验", "ip_description_second": "请联系网络管理员,为工作站分配静态IP地址。", + "language_preference_description": "除非您在下面选择其他语言,否则应用将与您的系统语言匹配。您可以稍后在应用设置中更改语言。", "learn_uninstalling": "了解更多有关卸载应用程序的信息", "loosen_screws_and_detach": "松开螺丝并卸下转板抓手", "modal_instructions": "有关设置模块的分步说明,请参阅随包装附带的快速指引。", @@ -48,8 +49,8 @@ "opentrons_def": "已验证的数据", "opentrons_flex_quickstart_guide": "快速入门指南", "opentrons_labware_def": "已验证的实验耗材数据", - "opentrons_tip_racks_recommended": "建议使用Opentrons吸头盒。其他吸头盒无法保证精度。", "opentrons_tip_rack_name": "opentrons", + "opentrons_tip_racks_recommended": "建议使用Opentrons吸头盒。其他吸头盒无法保证精度。", "previous_releases": "查看以前的版本", "receive_alert": "当软件更新可用时接收提醒。", "restore_description": "不建议恢复到过往的软件版本,但您可以访问下方的过往版本。为了获得最佳效果,请在安装过往版本之前卸载现有应用程序并删除其配置文件。", @@ -68,7 +69,10 @@ "show_labware_offset_snippets_description": "仅适用于需要在应用程序之外应用耗材校准数据的用户。启用后,在设置协议过程中可访问Jupyter Notebook和SSH的代码片段。", "something_seems_wrong": "您的移液器可能有问题。退出设置并联系支持人员以获取帮助。", "storage_limit_reached_description": "您的工作站已达到可存储的快速移液数量上限。在创建新的快速移液之前,您必须删除一个现有的快速移液。", + "system_language_preferences_update_description": "您系统的语言最近已更新。您想使用更新后的语言作为应用的默认语言吗?", "these_are_advanced_settings": "这些是高级设置。请勿在没有支持团队帮助的情况下尝试调整这些设置。更改这些设置可能会影响您的移液器寿命。这些设置不会覆盖协议中定义的任何移液器设置。", + "u2e_driver_description": "OT-2 通过此适配器,使用 USB 连接 Opentrons APP。", + "unexpected_error": "发生意外错误。", "update_requires_restarting_app": "更新需要重新启动应用程序。", "update_robot_software_description": "绕过自动更新过程并手动更新工作站软件", "update_robot_software_link": "启动软件更新页面", diff --git a/app/src/assets/localization/zh/app_settings.json b/app/src/assets/localization/zh/app_settings.json index ace4ca5fb4f..035963eacaa 100644 --- a/app/src/assets/localization/zh/app_settings.json +++ b/app/src/assets/localization/zh/app_settings.json @@ -1,7 +1,7 @@ { "__dev_internal__enableLabwareCreator": "启用应用实验耗材创建器", - "__dev_internal__forceHttpPolling": "强制轮询所有网络请求,而不是使用MQTT", "__dev_internal__enableRunNotes": "在协议运行期间显示备注", + "__dev_internal__forceHttpPolling": "强制轮询所有网络请求,而不是使用MQTT", "__dev_internal__protocolStats": "协议统计", "__dev_internal__protocolTimeline": "协议时间线", "add_folder_button": "添加实验耗材源文件夹", diff --git a/app/src/assets/localization/zh/branded.json b/app/src/assets/localization/zh/branded.json index c38888398f1..b7cbc41d684 100644 --- a/app/src/assets/localization/zh/branded.json +++ b/app/src/assets/localization/zh/branded.json @@ -2,8 +2,8 @@ "a_robot_software_update_is_available": "需要更新工作站软件才能使用此版本的Opentrons应用程序运行协议。转到工作站", "about_flex_gripper": "关于Flex转板抓手", "alternative_security_types_description": "Opentrons应用程序支持将Flex连接到各种企业接入点。通过USB连接并在应用程序中完成设置。", - "attach_a_pipette_for_quick_transfer": "要创建快速移液,您需要将移液器安装到您的Opentrons Flex上。", "attach_a_pipette": "将移液器连接到Flex", + "attach_a_pipette_for_quick_transfer": "要创建快速移液,您需要将移液器安装到您的Opentrons Flex上。", "calibration_block_description": "这个金属块是一个特制的工具,完美适配您的甲板,有助于校准。如果您没有校准块,请发送电子邮件至support@opentrons.com,以便我们寄送一个给您。在您提供的信息中,请确保包括您的姓名、公司或机构名称和寄送地址。在等待校准块到达过程中,您可以暂时利用工作站里垃圾桶上的平面进行校准。", "calibration_on_opentrons_tips_is_important": "使用上述Opentrons吸头和吸头盒进行校准非常重要,因为工作站的准确性是基于这些吸头的已知尺寸来确定的。", "choose_what_data_to_share": "选择要与Opentrons共享的数据。", @@ -23,13 +23,14 @@ "find_your_robot": "在Opentrons应用程序中找到您的工作站以安装软件更新。", "firmware_update_download_logs": "从Opentrons应用程序下载工作站日志并将其发送到support@opentrons.com寻求帮助。", "general_error_message": "如果您一直收到此消息,请尝试重新启动您的应用程序和工作站。如果这不能解决问题,请与Opentrons支持人员联系。", + "gripper": "Flex转板抓手", "gripper_still_attached": "Flex转板抓手仍处于连接状态", "gripper_successfully_attached_and_calibrated": "Flex转板抓手已成功连接并校准", "gripper_successfully_calibrated": "Flex转板抓手已成功校准", "gripper_successfully_detached": "Flex转板抓手已成功卸下", - "gripper": "Flex转板抓手", "help_us_improve_send_error_report": "通过向{{support_email}}发送错误报告,帮助我们改进您的使用体验", "ip_description_second": "Opentrons建议您联系网络管理员,为工作站分配静态IP地址。", + "language_preference_description": "Opentrons APP默认匹配与您的系统语言,您也可以选择使用下方其他语言。当然,后续您也可以在APP设置中进行语言更改。", "learn_uninstalling": "了解更多有关卸载Opentrons应用程序的信息", "loosen_screws_and_detach": "松开螺丝并卸下Flex转板抓手", "modal_instructions": "有关设置模块的分步说明,请参阅随包装附带的快速指引。您也可以单击下面的链接或扫描二维码访问Opentrons帮助中心的模块部分。", @@ -68,7 +69,10 @@ "show_labware_offset_snippets_description": "仅适用于需要在Opentrons应用程序之外应用耗材校准数据的用户。启用后,在设置协议过程中可访问Jupyter Notebook和SSH的代码片段。", "something_seems_wrong": "您的移液器可能有问题。退出设置并联系Opentrons支持人员以获取帮助。", "storage_limit_reached_description": "您的 Opentrons Flex 已达到可存储的快速移液数量上限。在创建新的快速移液之前,您必须删除一个现有的快速移液。", + "system_language_preferences_update_description": "您的系统语言最近已更新。您想将更新后的语言用作 Opentrons APP的默认语言吗?", "these_are_advanced_settings": "这些是高级设置。请勿在没有Opentrons支持团队帮助的情况下尝试调整这些设置。更改这些设置可能会影响您的移液器寿命。这些设置不会覆盖协议中定义的任何移液器设置。", + "u2e_driver_description": "OT-2 通过此适配器,使用 USB 连接 Opentrons APP。", + "unexpected_error": "发生意外错误。如果问题仍然存在,请联系 Opentrons 支持团队寻求帮助。", "update_requires_restarting_app": "更新需要重新启动Opentrons应用程序。", "update_robot_software_description": "绕过Opentrons应用程序自动更新过程并手动更新工作站软件", "update_robot_software_link": "启动Opentrons软件更新页面", diff --git a/app/src/assets/localization/zh/change_pipette.json b/app/src/assets/localization/zh/change_pipette.json index 9818fd56f85..3a7f16bb724 100644 --- a/app/src/assets/localization/zh/change_pipette.json +++ b/app/src/assets/localization/zh/change_pipette.json @@ -1,8 +1,8 @@ { "are_you_sure_exit": "您确定要在{{direction}}移液器之前退出吗?", "attach_name_pipette": "安装一个{{pipette}}移液器", - "attach_pipette_type": "安装一个{{pipetteName}}移液器", "attach_pipette": "安装一个移液器", + "attach_pipette_type": "安装一个{{pipetteName}}移液器", "attach_the_pipette": "

连接移液器

推入白色连接器,直到感觉它插入移液器。", "attached_pipette_does_not_match": "连接的{{name}}与您最初选择的{{pipette}}不匹配。", "attaching": "正在连接", @@ -16,10 +16,10 @@ "confirming_attachment": "正在确认连接", "confirming_detachment": "正在确认拆卸", "continue": "继续", - "detach_pipette_from_mount": "从{{mount}}安装支架上卸下移液器", + "detach": "卸下移液器", "detach_pipette": "从{{mount}}安装支架上卸下{{pipette}}", + "detach_pipette_from_mount": "从{{mount}}安装支架上卸下移液器", "detach_try_again": "卸下并重试", - "detach": "卸下移液器", "detaching": "正在卸下", "get_started": "开始", "go_back": "返回", diff --git a/app/src/assets/localization/zh/device_details.json b/app/src/assets/localization/zh/device_details.json index a19e61a365b..fdcab146c28 100644 --- a/app/src/assets/localization/zh/device_details.json +++ b/app/src/assets/localization/zh/device_details.json @@ -1,15 +1,16 @@ { "about_gripper": "关于转板抓手", "about_module": "关于{{name}}", - "about_pipette_name": "关于{{name}}移液器", "about_pipette": "关于移液器", + "about_pipette_name": "关于{{name}}移液器", + "abs_reader_lid_status": "上盖状态: {{status}}", "abs_reader_status": "吸光度读板器状态", + "add": "添加", "add_fixture_description": "将此硬件添加至甲板配置。它在协议分析期间将会被引用。", "add_to_slot": "添加到板位{{slotName}}", - "add": "添加", + "an_error_occurred_while_updating": "更新移液器设置时发生错误。", "an_error_occurred_while_updating_module": "更新{{moduleName}}时出现错误,请重试。", "an_error_occurred_while_updating_please_try_again": "更新移液器设置时出错,请重试。", - "an_error_occurred_while_updating": "更新移液器设置时发生错误。", "attach_gripper": "安装转板抓手", "attach_pipette": "安装移液器", "bad_run": "无法加载运行", @@ -17,13 +18,13 @@ "bundle_firmware_file_not_found": "未找到类型为{{module}}的模块固件包文件。", "calibrate_gripper": "校准转板抓手", "calibrate_now": "立即校准", - "calibrate_pipette_offset": "校准移液器数据", "calibrate_pipette": "校准移液器", - "calibration_needed_without_link": "需要校准。", + "calibrate_pipette_offset": "校准移液器数据", "calibration_needed": "需要校准。 立即校准", + "calibration_needed_without_link": "需要校准。", "canceled": "已取消", - "changes_will_be_lost_description": "确定不保存甲板配置直接退出而吗?", "changes_will_be_lost": "更改将丢失", + "changes_will_be_lost_description": "确定不保存甲板配置直接退出而吗?", "choose_protocol_to_run": "选择在{{name}}上运行的协议", "close_lid": "关闭上盖", "completed": "已完成", @@ -35,9 +36,9 @@ "current_temp": "当前:{{temp}}°C", "current_version": "当前版本", "deck_cal_missing": "缺少移液器校准数据,请先校准甲板。", + "deck_configuration": "甲板配置", "deck_configuration_is_not_available_when_robot_is_busy": "工作站忙碌时,甲板配置不可用", "deck_configuration_is_not_available_when_run_is_in_progress": "工作站运行时,甲板配置不可用", - "deck_configuration": "甲板配置", "deck_fixture_setup_instructions": "甲板配置安装说明", "deck_fixture_setup_modal_bottom_description_desktop": "针对不同类型的配置,扫描二维码或访问下方链接获取详细说明。", "deck_fixture_setup_modal_top_description": "首先,拧松并移除计划安装模组的甲板。然后放置模组,并进行固定。", @@ -57,14 +58,14 @@ "estop_pressed": "急停按钮被按下。工作站运动已停止。", "failed": "失败", "files": "文件", - "firmware_update_needed": "需要更新工作站固件。请在工作站的触摸屏上开始更新。", "firmware_update_available": "固件更新可用。", "firmware_update_failed": "未能更新模块固件", - "firmware_updated_successfully": "固件更新成功", + "firmware_update_needed": "需要更新工作站固件。请在工作站的触摸屏上开始更新。", "firmware_update_occurring": "固件更新正在进行中...", + "firmware_updated_successfully": "固件更新成功", "fixture": "配置模组", - "have_not_run_description": "运行一些协议后,它们会在这里显示。", "have_not_run": "无最近运行记录", + "have_not_run_description": "运行一些协议后,它们会在这里显示。", "heater": "加热器", "height_ranges": "{{gen}}高度范围", "hot_to_the_touch": "模块接触时很热", @@ -73,12 +74,12 @@ "instruments_and_modules": "设备与模块", "labware_bottom": "耗材底部", "last_run_time": "最后一次运行{{number}}", - "left_right": "左右支架", "left": "左侧", + "left_right": "左右支架", "lights": "灯光", "link_firmware_update": "查看固件更新", - "location_conflicts": "位置冲突", "location": "位置", + "location_conflicts": "位置冲突", "magdeck_gen1_height": "高度:{{height}}", "magdeck_gen2_height": "高度:{{height}}毫米", "max_engage_height": "最大可用高度", @@ -87,13 +88,13 @@ "missing_hardware": "缺少硬件", "missing_instrument": "缺少{{num}}个设备", "missing_instruments_plural": "缺少{{count}}个设备", - "missing_module_plural": "缺少{{count}}个模块", "missing_module": "缺少{{num}}个模块", + "missing_module_plural": "缺少{{count}}个模块", "module_actions_unavailable": "协议运行时模块操作不可用", + "module_calibration_required": "需要模块校准。", "module_calibration_required_no_pipette_attached": "需要模块校准。在运行模块校准前,请连接移液器。", "module_calibration_required_no_pipette_calibrated": "需要模块校准。在校准模块前,请先校准移液器。", "module_calibration_required_update_pipette_FW": "在进行必要的模块校准前,请先更新移液器固件。", - "module_calibration_required": "需要模块校准。", "module_controls": "模块控制", "module_error": "模块错误", "module_name_error": "{{moduleName}}错误", @@ -104,8 +105,8 @@ "no_deck_fixtures": "无甲板配置", "no_protocol_runs": "暂无协议运行记录!", "no_protocols_found": "未找到协议", - "no_recent_runs_description": "运行一些协议后,它们将显示在此处。", "no_recent_runs": "无最近运行记录", + "no_recent_runs_description": "运行一些协议后,它们将显示在此处。", "num_units": "{{num}}毫米", "offline_deck_configuration": "工作站必须连接网络才能查看甲板配置", "offline_instruments_and_modules": "工作站必须连接网络才能查看已连接的设备和模块", @@ -131,12 +132,12 @@ "protocol_analysis_failed": "协议APP分析失败。", "protocol_analysis_stale": "协议分析已过期。", "protocol_details_page_reanalyze": "前往协议详情页面重新分析。", - "ready_to_run": "运行工作准备完成", "ready": "准备就绪", + "ready_to_run": "运行工作准备完成", "recalibrate_gripper": "重新校准转板抓手", "recalibrate_now": "立即重新校准", - "recalibrate_pipette_offset": "重新校准移液器偏移", "recalibrate_pipette": "重新校准移液器", + "recalibrate_pipette_offset": "重新校准移液器偏移", "recent_protocol_runs": "最近的协议运行", "rerun_loading": "数据完全加载前,禁止协议重新运行", "rerun_now": "立即重新运行协议", @@ -146,17 +147,17 @@ "right": "右侧", "robot_control_not_available": "运行过程中某些工作站控制功能不可用", "robot_initializing": "初始化中...", + "run": "运行", "run_a_protocol": "运行协议", "run_again": "再次运行", "run_duration": "运行时长", - "run": "运行", "select_options": "选择选项", "serial_number": "序列号", "set_block_temp": "设置温度", "set_block_temperature": "设置模块温度", + "set_engage_height": "设置启用高度", "set_engage_height_and_enter_integer": "为此磁力模块设置启用高度。请输入一个介于{{lower}}和{{higher}}之间的整数。", "set_engage_height_for_module": "为{{name}}设置启用高度", - "set_engage_height": "设置启用高度", "set_lid_temperature": "设置上盖温度", "set_shake_of_hs": "为此模块设置转速。", "set_shake_speed": "设置震荡速度", @@ -173,8 +174,8 @@ "target_temp": "目标温度:{{temp}}°C", "tc_block": "模块", "tc_lid": "上盖", - "tc_set_temperature_body": "预热或预冷您的热循环模块的{{part}}。请输入介于{{min}}°C 和{{max}}°C之间的一个整数。", "tc_set_temperature": "为{{name}}设置温度{{part}}", + "tc_set_temperature_body": "预热或预冷您的热循环模块的{{part}}。请输入介于{{min}}°C 和{{max}}°C之间的一个整数。", "tempdeck_slideout_body": "预热或冷却您的{{model}}。输入4°C至96°C之间的一个整数。", "tempdeck_slideout_title": "为{{name}}设置温度", "temperature": "温度", @@ -184,12 +185,12 @@ "trash": "垃圾桶", "update_now": "立即更新", "updating_firmware": "正在更新固件...", - "usb_port_not_connected": "USB未连接", "usb_port": "USB端口-{{port}}", + "usb_port_not_connected": "USB未连接", "version": "版本{{version}}", + "view": "查看", "view_pipette_setting": "移液器设置", "view_run_record": "查看协议运行记录", - "view": "查看", "waste_chute": "外置垃圾槽", "welcome_modal_description": "运行协议、管理设备及查看工作站状态的地方。", "welcome_to_your_dashboard": "欢迎来到您的控制面板!", diff --git a/app/src/assets/localization/zh/device_settings.json b/app/src/assets/localization/zh/device_settings.json index ecd81c941dd..40e59b5c354 100644 --- a/app/src/assets/localization/zh/device_settings.json +++ b/app/src/assets/localization/zh/device_settings.json @@ -3,6 +3,7 @@ "about_calibration_description": "为了让工作站精确移动,您需要对其进行校准。位置校准分为三部分:甲板校准、移液器偏移校准和吸头长度校准。", "about_calibration_description_ot3": "为了让工作站精确移动,您需要对其进行校准。移液器和转板抓手校准是一个自动化过程,使用校准探头或销钉。校准完成后,您可以将校准数据以JSON文件的形式保存到计算机中。", "about_calibration_title": "关于校准", + "add_new": "添加新的...", "advanced": "高级", "alpha_description": "警告:alpha版本功能完整,但可能包含重大错误。", "alternative_security_types": "可选的安全类型", @@ -10,10 +11,12 @@ "apply_historic_offsets": "应用耗材偏移校准数据", "are_you_sure_you_want_to_disconnect": "您确定要断开与{{ssid}}的连接吗?", "attach_a_pipette_before_calibrating": "在执行校准之前,请安装移液器", + "authentication": "验证", "boot_scripts": "启动脚本", "both": "两者", "browse_file_system": "浏览文件系统", "bug_fixes": "错误修复", + "but_we_expected": "但我们预计", "calibrate_deck": "校准甲板", "calibrate_deck_description": "适用于没有在甲板上蚀刻十字的2019年之前的工作站。", "calibrate_deck_to_dots": "根据校准点校准甲板", @@ -24,11 +27,14 @@ "calibration": "校准", "calibration_health_check_description": "检查关键校准点的精度,无需重新校准工作站。", "calibration_health_check_title": "校准运行状况检查", + "cancel_software_update": "取消软件更新", "change_network": "更改网络", "characters_max": "最多17个字符", "check_for_updates": "检查更新", + "check_to_verify_update": "检查设备的设置页面以验证更新是否成功", "checking_for_updates": "正在检查更新", "choose": "选择...", + "choose_a_network": "选择网络...", "choose_file": "选择文件", "choose_network_type": "选择网络类型", "choose_reset_settings": "选择重置设置", @@ -50,13 +56,14 @@ "clear_option_runs_history": "清除协议运行历史", "clear_option_runs_history_subtext": "清除所有协议的过往运行信息。点击并应用", "clear_option_tip_length_calibrations": "清除吸头长度校准", - "cancel_software_update": "取消软件更新", "complete_and_restart_robot": "完成并重新启动工作站", "confirm_device_reset_description": "这将永久删除所有协议、校准和其他数据。您需要重新进行初始设置才能再次使用工作站。", "confirm_device_reset_heading": "您确定要重置您的设备吗?", "connect": "连接", "connect_the_estop_to_continue": "连接紧急停止按钮以继续", + "connect_to_ssid": "连接到 {{ssid}}", "connect_to_wifi_network": "连接到Wi-Fi网络", + "connect_to_wifi_network_failure": "您的设备无法连接到 Wi-Fi 网络 {{ssid}}", "connect_via": "通过{{type}}连接", "connect_via_usb_description_1": "1. 将 USB A-to-B 连接线连接到工作站的 USB-B 端口。", "connect_via_usb_description_2": "2. 将电缆连接到计算机上的一个空闲USB端口。", @@ -65,6 +72,7 @@ "connected_to_ssid": "已连接到{{ssid}}", "connected_via": "通过{{networkInterface}}连接", "connecting_to": "正在连接到{{ssid}}...", + "connecting_to_wifi_network": "连接到 Wi-Fi 网络 {{ssid}}", "connection_description_ethernet": "连接到您实验室的有线网络。", "connection_description_wifi": "在您的实验室中找到一个网络,或者输入您自己的网络。", "connection_to_robot_lost": "与工作站的连接中断", @@ -81,7 +89,6 @@ "device_reset_description": "将耗材校准、启动脚本和/或工作站校准重置为出厂设置。", "device_reset_slideout_description": "选择单独的设置以仅清除特定的数据类型。", "device_resets_cannot_be_undone": "重置无法撤销", - "release_notes": "发行说明", "directly_connected_to_this_computer": "直接连接到这台计算机。", "disconnect": "断开连接", "disconnect_from_ssid": "断开与{{ssid}}的连接", @@ -97,6 +104,7 @@ "display_sleep_settings": "屏幕睡眠设置", "do_not_turn_off": "这可能需要最多{{minutes}}分钟。请不要关闭工作站。", "done": "完成", + "downgrade": "降级", "download": "下载", "download_calibration_data": "下载校准日志", "download_error": "下载错误日志", @@ -110,6 +118,7 @@ "enable_status_light_description": "打开或关闭工作站前部的指示LED灯条。", "engaged": "已连接", "enter_factory_password": "输入工厂密码", + "enter_name_security_type": "输入网络名称和安全类型。", "enter_network_name": "输入网络名称", "enter_password": "输入密码", "estop": "紧急停止按钮", @@ -128,6 +137,8 @@ "factory_resets_cannot_be_undone": "工厂重置无法撤销。", "failed_to_connect_to_ssid": "无法连接到{{ssid}}", "feature_flags": "功能标志", + "field_is_required": "需要{{field}} ", + "find_and_join_network": "查找并加入 Wi-Fi 网络", "finish_setup": "完成设置", "firmware_version": "固件版本", "fully_calibrate_before_checking_health": "在检查校准健康之前,请完全校准您的工作站", @@ -155,6 +166,7 @@ "last_calibrated_label": "最后校准", "launch_jupyter_notebook": "启动Jupyter Notebook", "legacy_settings": "遗留设置", + "likely_incorrect_password": "可能网络密码不正确。", "mac_address": "MAC地址", "manage_oem_settings": "管理OEM设置", "minutes": "{{minute}}分钟", @@ -172,17 +184,22 @@ "name_your_robot": "给您的工作站起个名字", "name_your_robot_description": "别担心,您可以在设置中随时更改这个名称。", "need_another_security_type": "需要另一种安全类型吗?", + "network_is_unsecured": "Wi-Fi 网络 {{ssid}} 不安全", "network_name": "网络名称", + "network_requires_auth": "Wi-Fi 网络 {{ssid}} 需要 802.1X 身份验证", + "network_requires_wpa_password": "Wi-Fi 网络 {{ssid}} 需要 WPA2 密码", "network_settings": "网络设置", "networking": "网络连接", "never": "从不", "new_features": "新功能", "next_step": "下一步", + "no_calibration_required": "无需校准", "no_connection_found": "未找到连接", "no_gripper_attached": "未连接转板抓手", "no_modules_attached": "未连接模块", "no_network_found": "未找到网络", "no_pipette_attached": "未连接移液器", + "no_update_files": "无法检索此设备的更新状态。请确保您的计算机已连接到互联网,然后稍后重试。", "none_description": "不推荐", "not_calibrated": "尚未校准", "not_calibrated_short": "未校准", @@ -194,11 +211,13 @@ "not_now": "不是现在", "oem_mode": "OEM模式", "off": "关闭", - "one_hour": "1小时", "on": "开启", + "one_hour": "1小时", "other_networks": "其他网络", + "other_robot_updating": "无法更新,因为该APP目前正在更新其他设备。", "password": "密码", "password_error_message": "至少需要8个字符", + "password_not_long_enough": "密码必须至少为 {{minLength}} 字符", "pause_protocol": "当工作站前门打开时暂停协议", "pause_protocol_description": "启用后,在运行过程中打开工作站前门,工作站会在完成当前动作后暂停。", "pipette_calibrations_description": "使用校准探头来确定移液器相对于甲板槽上的精密切割方格的确切位置。", @@ -208,6 +227,7 @@ "pipette_offset_calibration_recommended": "建议进行移液器偏移校准", "pipette_offset_calibrations_history": "查看所有移液器偏移校准历史", "pipette_offset_calibrations_title": "移液器偏移校准", + "please_check_credentials": "请仔细检查你的网络凭证", "privacy": "隐私", "problem_during_update": "此次更新耗时比平常要长。", "proceed_without_updating": "跳过更新以继续", @@ -220,6 +240,7 @@ "recalibrate_tip_and_pipette": "重新校准吸头长度和移液器偏移量", "recalibration_recommended": "建议重新校准", "reinstall": "重新安装", + "release_notes": "发行说明", "remind_me_later": "稍后提醒我", "rename_robot": "重命名工作站", "rename_robot_input_error": "哎呀!工作站名称必须遵循字符计数和限制。", @@ -237,9 +258,12 @@ "returns_your_device_to_new_state": "这将使您的设备恢复到新的状态。", "robot_busy_protocol": "当协议正在运行时,此工作站无法更新", "robot_calibration_data": "工作站校准数据", + "robot_has_bad_capabilities": "设备配置不正确", "robot_initializing": "正在初始化工作站...", "robot_name": "工作站名称", "robot_operating_update_available": "工作站操作系统更新可用", + "robot_reconnected_with version": "设备重新获取版本", + "robot_requires_premigration": "系统必须先更新此设备,然后才能进行自定义更新", "robot_serial_number": "工作站序列号", "robot_server_version": "工作站服务器版本", "robot_settings": "工作站设置", @@ -258,7 +282,9 @@ "select_a_network": "选择一个网络", "select_a_security_type": "选择一个安全类型", "select_all_settings": "选择所有设置", + "select_auth_method_short": "选择身份验证方法", "select_authentication_method": "为您所选的网络选择身份验证方法。", + "select_file": "选择文件", "sending_software": "正在发送软件...", "serial": "序列号", "setup_mode": "设置模式", @@ -274,6 +300,9 @@ "subnet_mask": "子网掩码", "successfully_connected": "成功连接!", "successfully_connected_to_network": "已成功连接到{{ssid}}!", + "successfully_connected_to_ssid": "您的设备已成功连接至 Wi-Fi 网络 {{ssid}}", + "successfully_connected_to_wifi": "成功连接 Wi-Fi", + "successfully_disconnected_from_wifi": "已成功断开 Wi-Fi 连接", "supported_protocol_api_versions": "支持的协议API版本", "text_size": "文本大小", "text_size_description": "所有屏幕上的文本都会根据您在下方选择的大小进行调整。", @@ -285,18 +314,29 @@ "troubleshooting": "故障排查", "try_again": "再试一次", "try_restarting_the_update": "尝试重新启动更新。", + "unable_to_cancel_update": "无法取消正在进行的更新", + "unable_to_commit_update": "无法提交更新", + "unable_to_connect": "无法连接到 Wi-Fi", + "unable_to_disconnect": "无法断开 Wi-Fi 连接", + "unable_to_find_robot_with_name": "无法找到在线设备", + "unable_to_find_system_file": "无法找到要更新的系统文件", + "unable_to_restart": "无法重启设备", + "unable_to_start_update_session": "无法启动更新", "up_to_date": "最新的", "update_available": "有可用更新", "update_channel_description": "稳定版接收最新的稳定版发布。Beta 版允许您在新功能在稳定版发布前先行试用,但这些新功能尚未完成测试。", "update_complete": "更新完成!", "update_found": "发现更新!", + "update_requires_restarting_robot": "更新工作站软件需要重启工作站", "update_robot_now": "现在更新工作站", "update_robot_software": "使用本地文件(.zip)手动更新工作站软件", + "update_server_unavailable": "无法更新,因为您设备的更新服务器没有响应。", + "update_unavailable": "无法更新", "updating": "正在更新", - "update_requires_restarting_robot": "更新工作站软件需要重启工作站", + "upgrade": "升级", + "upload_custom_logo": "上传自定义Logo", "upload_custom_logo_description": "上传一个Logo,用于工作站启动时显示。", "upload_custom_logo_dimensions": "Logo必须符合 1024 x 600 的尺寸,且是 PNG 文件(.png)。", - "upload_custom_logo": "上传自定义Logo", "usage_settings": "使用设置", "usb": "USB", "usb_to_ethernet_description": "正在查找 USB-to-Ethernet 适配器信息?", diff --git a/app/src/assets/localization/zh/devices_landing.json b/app/src/assets/localization/zh/devices_landing.json index 8e6af9d5ba9..4c649c41b02 100644 --- a/app/src/assets/localization/zh/devices_landing.json +++ b/app/src/assets/localization/zh/devices_landing.json @@ -23,9 +23,9 @@ "lights_on": "开启灯光", "loading": "加载中", "looking_for_robots": "寻找工作站", - "ninety_six_mount": "左侧+右侧安装支架", "make_sure_robot_is_connected": "确保工作站已连接到此计算机", "modules": "模块", + "ninety_six_mount": "左侧+右侧安装支架", "no_robots_found": "未找到工作站", "not_available": "不可用({{count}})", "ot2_quickstart_guide": "OT-2 快速入门指南", diff --git a/app/src/assets/localization/zh/drop_tip_wizard.json b/app/src/assets/localization/zh/drop_tip_wizard.json index a5ae8faebfc..307c2aa7e72 100644 --- a/app/src/assets/localization/zh/drop_tip_wizard.json +++ b/app/src/assets/localization/zh/drop_tip_wizard.json @@ -16,9 +16,9 @@ "drop_tip_failed": "丢弃吸头操作未能完成,请联系技术支持获取帮助。", "drop_tips": "丢弃吸头", "error_dropping_tips": "丢弃吸头时发生错误", - "exit_and_home_pipette": "退出并归位移液器", - "exit_screen_title": "在完成吸头丢弃前退出?", "exit": "退出", + "exit_and_home_pipette": "退出并归位移液器", + "fixed_trash_in_12": "固定垃圾存放位置为12", "getting_ready": "正在准备…", "go_back": "返回", "jog_too_far": "移动过远?", @@ -30,7 +30,6 @@ "position_and_drop_tip": "确保移液器吸头尖端位于指定位置的正上方并保持水平。如果不是,请使用下面的控制键或键盘微调移液器直到正确位置。", "position_the_pipette": "调整移液器位置", "remove_any_attached_tips": "移除任何已安装的吸头", - "remove_the_tips": "在协议中再次使用前,您可能需要从{{mount}}移液器上移除吸头。", "remove_the_tips_from_pipette": "在协议中再次使用前,您可能需要从移液器上移除吸头。", "remove_the_tips_manually": "手动移除吸头,然后使龙门架回原点。在拾取吸头的状态下归位可能导致移液器吸入液体并损坏。", "remove_tips": "移除吸头", @@ -38,8 +37,8 @@ "select_blowout_slot_odd": "您可以将液体吹入耗材中。
龙门架移动到选定的板位后,使用位置控制按键将移液器移动到吹出液体的确切位置。", "select_drop_tip_slot": "您可以将吸头返回吸头架或丢弃它们。在右侧的甲板图上选择您想丢弃吸头的板位。确认后龙门架将移动到选定的板位。", "select_drop_tip_slot_odd": "您可以将吸头放回吸头架或丢弃它们。
龙门架移动到选定的板位后,使用位置控制按键将移液器移动到丢弃吸头的确切位置。", - "skip_and_home_pipette": "跳过并归位移液器", "skip": "跳过", + "skip_and_home_pipette": "跳过并归位移液器", "stand_back_blowing_out": "请远离,工作站正在吹出液体", "stand_back_dropping_tips": "请远离,工作站正在丢弃吸头", "stand_back_robot_in_motion": "请远离,工作站正在移动", diff --git a/app/src/assets/localization/zh/error_recovery.json b/app/src/assets/localization/zh/error_recovery.json index dddf7923d4b..a740eac779d 100644 --- a/app/src/assets/localization/zh/error_recovery.json +++ b/app/src/assets/localization/zh/error_recovery.json @@ -6,9 +6,9 @@ "before_you_begin": "开始前", "begin_removal": "开始移除", "blowout_failed": "吹出液体失败", - "overpressure_is_usually_caused": "探测器感应到压力过大通常是由吸头碰撞到实验用品、吸头堵塞或吸取/排出粘稠液体速度过快引起。如果问题持续存在,请取消运行并对协议进行必要的修改。", "cancel_run": "取消运行", "canceling_run": "正在取消运行", + "carefully_move_labware": "小心地移开放错位置的实验用品并清理溢出的液体。继续操作之前请关闭设备前门。", "change_location": "更改位置", "change_tip_pickup_location": "更换拾取吸头的位置", "choose_a_recovery_action": "选择恢复操作", @@ -19,10 +19,12 @@ "continue": "继续", "continue_run_now": "现在继续运行", "continue_to_drop_tip": "继续丢弃吸头", + "do_you_need_to_blowout": "首先,请问需要排出枪头内的液体吗?", + "door_open_robot_home": "在手动移动实验用品前,设备需要安全归位。", "ensure_lw_is_accurately_placed": "确保实验耗材已准确放置在甲板槽中,防止进一步出现错误", + "error": "错误", "error_details": "错误详情", "error_on_robot": "{{robot}}上的错误", - "error": "错误", "failed_dispense_step_not_completed": "中断运行的最后一步液体排出失败,恢复程序将不会继续运行这一步骤,请手动完成这一步的移液操作。运行将继续从下一步开始。继续之前,请关闭工作站门。", "failed_step": "失败步骤", "first_is_gripper_holding_labware": "首先,抓扳手是否夹着实验耗材?", @@ -31,6 +33,9 @@ "gripper_errors_occur_when": "当抓扳手停滞或与甲板上另一物体碰撞时,会发生抓扳手错误,这通常是由于实验耗材放置不当或实验耗材偏移不准确所致", "gripper_releasing_labware": "抓扳手正在释放实验耗材", "gripper_will_release_in_s": "抓扳手将在{{seconds}}秒后释放实验耗材", + "home_and_retry": "归位并重试该步骤", + "home_gantry": "归位", + "home_now": "现在归位", "homing_pipette_dangerous": "如果移液器中有液体,将{{mount}}移液器归位可能会损坏它。您必须在使用移液器之前取下所有吸头。", "if_issue_persists_gripper_error": "如果问题持续存在,请取消运行并重新运行抓扳手校准", "if_issue_persists_overpressure": "如果问题持续存在,请取消运行并对协议进行必要的更改", @@ -40,6 +45,7 @@ "ignore_error_and_skip": "忽略错误并跳到下一步", "ignore_only_this_error": "仅忽略此错误", "ignore_similar_errors_later_in_run": "要在后续的运行中忽略类似错误吗?", + "inspect_the_robot": "首先,检查设备以确保它已准备好从下一步继续运行。然后,关闭设备前门,再继续操作。", "labware_released_from_current_height": "将从当前高度释放实验耗材", "launch_recovery_mode": "启动恢复模式", "manually_fill_liquid_in_well": "手动填充孔位{{well}}中的液体", @@ -48,29 +54,36 @@ "manually_move_lw_on_deck": "手动移动实验耗材", "manually_replace_lw_and_retry": "手动更换实验耗材并重试此步骤", "manually_replace_lw_on_deck": "手动更换实验耗材", + "na": "N/A", "next_step": "下一步", "next_try_another_action": "接下来,您可以尝试另一个恢复操作或取消运行。", "no_liquid_detected": "未检测到液体", + "overpressure_is_usually_caused": "探测器感应到压力过大通常是由吸头碰撞到实验用品、吸头堵塞或吸取/排出粘稠液体速度过快引起。如果问题持续存在,请取消运行并对协议进行必要的修改。", "pick_up_tips": "取吸头", "pipette_overpressure": "移液器超压", - "preserve_aspirated_liquid": "首先,您需要保留已吸取的液体吗?", + "prepare_deck_for_homing": "整理甲板,准备归位", "proceed_to_cancel": "继续取消", + "proceed_to_home": "归位中", "proceed_to_tip_selection": "继续选择吸头", "recovery_action_failed": "{{action}}失败", "recovery_mode": "恢复模式", "recovery_mode_explanation": "恢复模式为您提供运行错误后的手动处理引导。
您可以进行调整以确保发生错误时正在进行的步骤可以完成,或者选择取消协议。当做出调整且未检测到后续错误时,该模式操作完成。根据导致错误的条件,系统将提供相应的调整选项。", - "release_labware_from_gripper": "从抓板手中释放实验耗材", "release": "释放", + "release_labware_from_gripper": "从抓板手中释放实验耗材", "remove_any_attached_tips": "移除任何已安装的吸头", + "replace_tips_and_select_loc_partial_tip": "更换吸头并选择最后用于偏转移液吸头拾取的位置。", "replace_tips_and_select_location": "建议更换吸头并选择最后一次取吸头的位置。", "replace_used_tips_in_rack_location": "在吸头板位{{location}}更换已使用的吸头", "replace_with_new_tip_rack": "更换新的吸头盒", "resume": "继续", - "retrying_step_succeeded": "重试步骤{{step}}成功", + "retry_dropping_tip": "重试弹出吸头", "retry_now": "现在重试", + "retry_picking_up_tip": "重试拾取吸头", "retry_step": "重试步骤", "retry_with_new_tips": "使用新吸头重试", "retry_with_same_tips": "使用相同吸头重试", + "retrying_step_succeeded": "重试步骤{{step}}成功", + "retrying_step_succeeded_na": "重试当前步骤成功。", "return_to_menu": "返回菜单", "robot_door_is_open": "工作站前门已打开", "robot_is_canceling_run": "工作站正在取消运行", @@ -83,25 +96,30 @@ "robot_will_retry_with_tips": "工作站将使用新吸头重试失败的步骤。", "run_paused": "运行暂停", "select_tip_pickup_location": "选择取吸头位置", - "skipping_to_step_succeeded": "跳转到步骤{{step}}成功", "skip_and_home_pipette": "跳过并归位移液器", "skip_to_next_step": "跳到下一步", "skip_to_next_step_new_tips": "使用新吸头跳到下一步", "skip_to_next_step_same_tips": "使用相同吸头跳到下一步", + "skipping_to_step_succeeded": "跳转到步骤{{step}}成功", + "skipping_to_step_succeeded_na": "跳至下一步成功。", + "stall_or_collision_detected_when": "当设备电机堵塞时,检测到失速或碰撞", + "stall_or_collision_error": "失速或碰撞", "stand_back": "请远离,工作站正在运行", "stand_back_picking_up_tips": "请远离,正在拾取吸头", "stand_back_resuming": "请远离,正在恢复当前步骤", "stand_back_retrying": "请远离,正在重试失败步骤", "stand_back_skipping_to_next_step": "请远离,正在跳到下一步骤", "take_any_necessary_precautions": "在接住实验耗材之前,请采取必要的预防措施。确认后,夹爪将开始倒计时再释放。", - "take_necessary_actions_failed_pickup": "首先,采取任何必要的行动,让工作站重新尝试移液器拾取。然后,在继续之前关闭工作站门。", "take_necessary_actions": "首先,采取任何必要的行动,让工作站重新尝试失败的步骤。然后,在继续之前关闭工作站门。", + "take_necessary_actions_failed_pickup": "首先,采取任何必要的行动,让工作站重新尝试移液器拾取。然后,在继续之前关闭工作站门。", + "take_necessary_actions_failed_tip_drop": "首先,采取一切必要的措施,让设备准备好重试弹出吸头。然后,关闭设备前门,再继续操作。", + "take_necessary_actions_home": "采取一切必要的措施,准备让设备归位。继续操作之前请关闭设备前门。", "terminate_remote_activity": "终止远程活动", + "the_robot_must_return_to_home_position": "设备必须归位才能继续", "tip_drop_failed": "丢弃吸头失败", "tip_not_detected": "未检测到吸头", "tip_presence_errors_are_caused": "吸头识别错误通常是由实验器皿放置不当或器皿偏移不准确引起的。", "view_error_details": "查看错误详情", "view_recovery_options": "查看恢复选项", - "you_can_still_drop_tips": "在继续选择吸头之前,您仍然可以丢弃移液器上现存的吸头。", - "you_may_want_to_remove": "在协议中再次使用之前,您可能需要从{{mount}}移液器上移除吸头。" + "you_can_still_drop_tips": "在继续选择吸头之前,您仍然可以丢弃移液器上现存的吸头。" } diff --git a/app/src/assets/localization/zh/gripper_wizard_flows.json b/app/src/assets/localization/zh/gripper_wizard_flows.json index 6617e15d83a..00319f11f6d 100644 --- a/app/src/assets/localization/zh/gripper_wizard_flows.json +++ b/app/src/assets/localization/zh/gripper_wizard_flows.json @@ -5,19 +5,17 @@ "before_you_begin": "开始之前", "begin_calibration": "开始校准", "calibrate_gripper": "校准转板抓手", - "calibration_pin": "校准钉", "calibration_pin_touching": "校准钉将触碰甲板{{slot}}中的校准块,以确定其精确位置。", "complete_calibration": "完成校准", "continue": "继续", "continue_calibration": "继续校准", "detach_gripper": "卸下转板抓手", - "firmware_updating": "需要固件更新,设备正在更新中...", "firmware_up_to_date": "固件已为最新版本。", + "firmware_updating": "需要固件更新,设备正在更新中...", "get_started": "开始操作", "gripper_calibration": "转板抓手校准", "gripper_recalibration": "转板抓手重新校准", "gripper_successfully_attached": "转板抓手已成功安装", - "hex_screwdriver": "2.5mm 六角螺丝刀", "hold_gripper_and_loosen_screws": "用手扶住转板抓手,首先松开上方螺丝,再松开下方螺丝。(螺丝固定于抓手上,不会脱落。)之后小心卸下抓手。", "insert_pin_into_front_jaw": "将校准钉插入前夹爪", "insert_pin_into_rear_jaw": "将校准钉插入后夹爪", diff --git a/app/src/assets/localization/zh/heater_shaker.json b/app/src/assets/localization/zh/heater_shaker.json index 249f1cc6138..efc48439868 100644 --- a/app/src/assets/localization/zh/heater_shaker.json +++ b/app/src/assets/localization/zh/heater_shaker.json @@ -4,43 +4,43 @@ "cannot_shake": "模块闩锁打开时无法执行震荡混匀命令", "close_labware_latch": "关闭耗材闩锁", "close_latch": "关闭闩锁", - "closed_and_locked": "关闭并锁定", "closed": "已关闭", + "closed_and_locked": "关闭并锁定", "closing": "正在关闭", "complete": "完成", "confirm_attachment": "确认已连接", "confirm_heater_shaker_modal_attachment": "确认热震荡模块已连接", "continue_shaking_protocol_start_prompt": "协议启动时是否继续执行震荡混匀命令?", + "deactivate": "停用", "deactivate_heater": "停止加热", "deactivate_shaker": "停止震荡混匀", - "deactivate": "停用", "heater_shaker_in_slot": "在继续前,请在板位{{slotName}}中安装{{moduleName}}", "heater_shaker_is_shaking": "热震荡模块当前正在震荡混匀", "keep_shaking_start_run": "继续震荡混匀并开始运行", - "labware_latch": "耗材闩锁", "labware": "耗材", + "labware_latch": "耗材闩锁", "min_max_rpm": "{{min}}-{{max}}rpm", "module_anchors_extended": "运行开始前,应将模块下方的固定位的漏丝拧紧,确保模块稳固跟甲板结合", "module_in_slot": "{{moduleName}}位于板位{{slotName}}槽中", "module_should_have_anchors": "模块应将两个固定锚完全伸出,以确保稳固地连接到甲板上", + "open": "打开", "open_labware_latch": "打开耗材闩锁", "open_latch": "打开闩锁", - "open": "打开", "opening": "正在打开", "proceed_to_run": "继续运行", "set_shake_speed": "设置震荡混匀速度", "set_temperature": "设置模块温度", "shake_speed": "震荡混匀速度", "show_attachment_instructions": "显示固定操作安装说明", - "stop_shaking_start_run": "停止震荡混匀并开始运行", "stop_shaking": "停止震荡混匀", + "stop_shaking_start_run": "停止震荡混匀并开始运行", "t10_torx_screwdriver": "{{name}}型螺丝刀", "t10_torx_screwdriver_subtitle": "热震荡模块附带。使用其他尺寸可能会损坏模块螺丝", + "test_shake": "测试震荡混匀", "test_shake_banner_information": "测试震荡混匀功能前,如果想往热震荡模块转移耗材,需要在控制页面控制模块开启闩锁", "test_shake_banner_labware_information": "测试震荡混匀功能前,如果想往热震荡模块转移{{labware}},需要控制模块闩锁", "test_shake_slideout_banner_info": "测试震荡混匀功能前,如果想往热震荡模块转移耗材,需要在控制页面控制模块开启闩锁", "test_shake_troubleshooting_slideout_description": "请重新查看模块固定安装及其适配器安装相关说明", - "test_shake": "测试震荡混匀", "thermal_adapter_attached_to_module": "适配器应已连接到模块上", "troubleshoot_step_1": "返回步骤1查看模块固定安装相关说明", "troubleshoot_step_3": "返回步骤3查看模块适配器安装相关说明", diff --git a/app/src/assets/localization/zh/incompatible_modules.json b/app/src/assets/localization/zh/incompatible_modules.json index 7e6da2f253e..0ff716c1326 100644 --- a/app/src/assets/localization/zh/incompatible_modules.json +++ b/app/src/assets/localization/zh/incompatible_modules.json @@ -1,7 +1,7 @@ { "incompatible_modules_attached": "检测到不适用模块,", - "remove_before_running_protocol": "运行协议前请移除以下硬件:", + "is_not_compatible": "{{module_name}}不适用于{{robot_type}},", "needs_your_assistance": "{{robot_name}}需要您的协助", - "remove_before_using": "使用此工作站前,请移除不适用模块.", - "is_not_compatible": "{{module_name}}不适用于{{robot_type}}," + "remove_before_running_protocol": "运行协议前请移除以下硬件:", + "remove_before_using": "使用此工作站前,请移除不适用模块." } diff --git a/app/src/assets/localization/zh/labware_details.json b/app/src/assets/localization/zh/labware_details.json index ba1183c2ea4..76ade48d727 100644 --- a/app/src/assets/localization/zh/labware_details.json +++ b/app/src/assets/localization/zh/labware_details.json @@ -8,8 +8,8 @@ "generic": "通用型", "height": "高度", "length": "长度", - "manufacturer_number": "制造商/目录编号", "manufacturer": "制造商", + "manufacturer_number": "制造商/目录编号", "max_volume": "最大容量", "measurements": "尺寸 (mm)", "na": "不适用", @@ -21,8 +21,8 @@ "u": "U型底", "v": "V型底", "various": "多种", - "well_count": "孔数", "well": "孔", + "well_count": "孔数", "width": "宽度", "x_offset": "X-初始位置", "x_size": "X-尺寸", diff --git a/app/src/assets/localization/zh/labware_landing.json b/app/src/assets/localization/zh/labware_landing.json index 386114541f3..f209e48c3e5 100644 --- a/app/src/assets/localization/zh/labware_landing.json +++ b/app/src/assets/localization/zh/labware_landing.json @@ -3,20 +3,20 @@ "cancel": "取消", "cannot-run-python-missing-labware": "工作站缺少耗材定义,无法运行Python协议。", "category": "类别", - "choose_file_to_upload": "或从您的计算机中选择文件上传。", "choose_file": "选择文件", + "choose_file_to_upload": "或从您的计算机中选择文件上传。", "copied": "已复制!", "create_new_def": "创建新的自定义耗材", "custom_def": "自定义耗材", "date_added": "添加日期", "def_moved_to_trash": "该耗材将被转移到这台电脑的回收站,可能无法恢复。", - "delete_this_labware": "删除此耗材?", "delete": "删除", + "delete_this_labware": "删除此耗材?", "duplicate_labware_def": "复制耗材", "error_importing_file": "{{filename}}导入错误。", "go_to_def": "前往耗材页面", - "import_custom_def": "导入自定义耗材", "import": "导入", + "import_custom_def": "导入自定义耗材", "imported": "{{filename}}已导入。", "invalid_labware_def": "无效耗材", "labware": "耗材", diff --git a/app/src/assets/localization/zh/labware_position_check.json b/app/src/assets/localization/zh/labware_position_check.json index cb27f78e66c..57fd1552a65 100644 --- a/app/src/assets/localization/zh/labware_position_check.json +++ b/app/src/assets/localization/zh/labware_position_check.json @@ -25,8 +25,8 @@ "confirm_position_and_pick_up_tip": "确认位置,取吸头", "confirm_position_and_return_tip": "确认位置,将吸头返回至板位{{next_slot}}并复位", "detach_probe": "移除校准探头", - "ensure_nozzle_position_odd": "请检查并确认{{tip_type}}位于{{item_location}}正上方并水平对齐。如果位置不正确,请点击移动移液器,然后微调移液器直至完全对齐。", "ensure_nozzle_position_desktop": "请检查并确认{{tip_type}}位于{{item_location}}正上方并水平对齐。如果位置不正确,请使用下方的控制按键或键盘微调移液器直至完全对齐。", + "ensure_nozzle_position_odd": "请检查并确认{{tip_type}}位于{{item_location}}正上方并水平对齐。如果位置不正确,请点击移动移液器,然后微调移液器直至完全对齐。", "exit_screen_confirm_exit": "不保存耗材校准数据并退出", "exit_screen_go_back": "返回耗材位置校准", "exit_screen_subtitle": "如果您现在退出,所有耗材校准数据都将不保留,且无法恢复。", @@ -35,9 +35,10 @@ "install_probe": "从存储位置取出校准探头,将探头的锁套旋钮按顺时针方向拧松。对准图示位置,将校准探头向上轻推并压到顶部,使探头在{{location}}移液器吸嘴上压紧。随后将锁套旋钮按逆时针方向拧紧,并轻拉确认是否固定稳妥。", "jog_controls_adjustment": "需要进行调整吗?", "jupyter_notebook": "Jupyter Notebook", + "labware": "耗材", "labware_display_location_text": "甲板板位{{slot}}", - "labware_offset_data": "耗材校准数据", "labware_offset": "耗材校准数据", + "labware_offset_data": "耗材校准数据", "labware_offsets_deleted_warning": "一旦开始耗材位置校准,之前创建的耗材校准数据将会丢失。", "labware_offsets_summary_labware": "耗材", "labware_offsets_summary_location": "位置", @@ -46,22 +47,21 @@ "labware_position_check_description": "耗材位置校准是一个引导式工作流程,为了提高实验中移液器的位置精确度,它会检查甲板上的每一个耗材位置。首先检查吸头盒,然后检查协议中使用到的其它所有耗材。", "labware_position_check_overview": "耗材位置校准概览", "labware_position_check_title": "耗材位置校准", - "labware_step_detail_labware_plural": "吸头应位于 {{labware_name}} 第一列正上方,居中对齐,并且与耗材顶部水平对齐。", "labware_step_detail_labware": "吸头应位于 {{labware_name}} 的A1孔正上方,居中对齐,并且与耗材顶部水平对齐。", + "labware_step_detail_labware_plural": "吸头应位于 {{labware_name}} 第一列正上方,居中对齐,并且与耗材顶部水平对齐。", "labware_step_detail_link": "查看如何判断移液器是否居中", "labware_step_detail_modal_heading": "如何判断移液器是否居中且水平对齐", + "labware_step_detail_modal_nozzle": "为确保移液器吸嘴完全居中,请额外从OT-2的另一侧进行检查。", "labware_step_detail_modal_nozzle_image_1_text": "从正前方看,似乎已经居中...", "labware_step_detail_modal_nozzle_image_2_nozzle_text": "移液器吸嘴未居中", "labware_step_detail_modal_nozzle_image_2_text": "...但从侧面看,需要调整", + "labware_step_detail_modal_nozzle_or_tip": "为确保吸嘴或吸头与耗材顶部水平对齐,请水平直视进行判断,或在吸嘴与吸头间插入一张纸片辅助判断。", "labware_step_detail_modal_nozzle_or_tip_image_1_text": "从俯视角度看,似乎是水平的...", "labware_step_detail_modal_nozzle_or_tip_image_2_nozzle_text": "移液器吸嘴不水平", "labware_step_detail_modal_nozzle_or_tip_image_2_text": "...但从水平高度看,需要调整", "labware_step_detail_modal_nozzle_or_tip_image_3_text": "如遇觉得难以判断,请在吸嘴与吸头之间放入一张常规纸张。当这张纸能刚好卡在两者之间时,可确认高度位置。", - "labware_step_detail_modal_nozzle_or_tip": "为确保吸嘴或吸头与耗材顶部水平对齐,请水平直视进行判断,或在吸嘴与吸头间插入一张纸片辅助判断。", - "labware_step_detail_modal_nozzle": "为确保移液器吸嘴完全居中,请额外从OT-2的另一侧进行检查。", - "labware_step_detail_tiprack_plural": "移液器吸嘴应位于{{tiprack_name}}第一列正上方并居中对齐,并且与吸头顶部水平对齐。", "labware_step_detail_tiprack": "移液器吸嘴应居中于{{tiprack_name}}的A1位置上方,并且与吸头顶部水平对齐。", - "labware": "耗材", + "labware_step_detail_tiprack_plural": "移液器吸嘴应位于{{tiprack_name}}第一列正上方并居中对齐,并且与吸头顶部水平对齐。", "learn_more": "了解更多", "location": "位置", "lpc_complete_summary_screen_heading": "耗材位置校准完成", @@ -73,9 +73,9 @@ "new_labware_offset_data": "新的耗材校准数据", "ninety_six_probe_location": "A1(左上角)", "no_labware_offsets": "无耗材校准数据", + "no_offset_data": "没有可用的校准数据", "no_offset_data_available": "没有可用的耗材校准数据", "no_offset_data_on_robot": "这轮运行中此工作站没有可用的耗材校准数据。", - "no_offset_data": "没有可用的校准数据", "offsets": "校准数据", "pick_up_tip_from_rack_in_location": "从位于{{location}}的吸头盒上拾取吸头", "picking_up_tip_title": "在板位{{slot}}拾取吸头", @@ -98,13 +98,13 @@ "robot_has_no_offsets_from_previous_runs": "耗材校准数据引用自之前运行的协议,以节省您的时间。如果本协议中的所有耗材已在之前的运行中检查过,这些数据将应用于本次运行。 您可以在后面的步骤中使用耗材位置校准添加新的偏移量。", "robot_has_offsets_from_previous_runs": "此工作站具有本协议中所用耗材的校准数据。如果您应用了这些校准数据,仍可通过耗材位置校准程序进行调整。", "robot_in_motion": "工作站正在运行,请远离。", - "run_labware_position_check": "运行耗材位置校准程序", "run": "运行", + "run_labware_position_check": "运行耗材位置校准程序", "secondary_pipette_tipracks_section": "使用{{secondary_mount}}移液器检查吸头盒", "see_how_offsets_work": "了解耗材校准的工作原理", + "slot": "板位{{slotName}}", "slot_location": "板位位置", "slot_name": "板位{{slotName}}", - "slot": "板位{{slotName}}", "start_position_check": "开始耗材位置校准程序,移至板位{{initial_labware_slot}}", "stored_offset_data": "应用已存储的耗材校准数据?", "stored_offsets_for_this_protocol": "适用于本协议的已存储耗材校准数据", diff --git a/app/src/assets/localization/zh/module_wizard_flows.json b/app/src/assets/localization/zh/module_wizard_flows.json index b1cd0b086d6..c2d6af09862 100644 --- a/app/src/assets/localization/zh/module_wizard_flows.json +++ b/app/src/assets/localization/zh/module_wizard_flows.json @@ -1,21 +1,21 @@ { "attach_probe": "将校准探头安装到移液器", "begin_calibration": "开始校准", - "calibrate_pipette": "在进行模块校准之前,请先校准移液器", "calibrate": "校准", + "calibrate_pipette": "在进行模块校准之前,请先校准移液器", + "calibration": "{{module}}校准", "calibration_adapter_heatershaker": "校准适配器", "calibration_adapter_temperature": "校准适配器", "calibration_adapter_thermocycler": "校准适配器", - "calibration_probe_touching_thermocycler": "校准探头将接触探测热循环仪的校准方块,以确定其确切位置", - "calibration_probe_touching": "校准探头将接触探测{{slotNumber}}板位中{{module}}的校准方块,以确定其确切位置", "calibration_probe": "从存储位置取出校准探头,将探头的锁套旋钮按顺时针方向拧松。对准图示位置,将校准探头向上轻推并压到顶部。随后将锁套旋钮按逆时针方向拧紧,并轻拉确认是否固定稳妥。", - "calibration": "{{module}}校准", + "calibration_probe_touching": "校准探头将接触探测{{slotNumber}}板位中{{module}}的校准方块,以确定其确切位置", + "calibration_probe_touching_thermocycler": "校准探头将接触探测热循环仪的校准方块,以确定其确切位置", "checking_firmware": "检查{{module}}固件", "complete_calibration": "完成校准", "confirm_location": "确认位置", "confirm_placement": "确认已放置", - "detach_probe_description": "解锁校准探头,将其从吸嘴上卸下并放回原储存位置。", "detach_probe": "卸下移液器校准探头", + "detach_probe_description": "解锁校准探头,将其从吸嘴上卸下并放回原储存位置。", "error_during_calibration": "校准过程中出现错误", "error_prepping_module": "模块校准出错", "exit": "退出", @@ -32,16 +32,16 @@ "move_gantry_to_front": "将龙门架移至前端", "next": "下一步", "pipette_probe": "移液器校准探头", + "place_flush": "将适配器水平放到模块上。", "place_flush_heater_shaker": "将适配器水平放到模块上。使用热震荡模块专用螺丝和 T10 Torx 螺丝刀将适配器固定到模块上。", "place_flush_thermocycler": "确保热循环仪盖子已打开,并将适配器水平放置到模块上,即通常放置pcr板的位置。", - "place_flush": "将适配器水平放到模块上。", "prepping_module": "正在准备{{module}}进行模块校准", "recalibrate": "重新校准", "select_location": "选择模块放置位置", "select_the_slot": "请在右侧的甲板图中选择放置了{{module}}的板位。请确认所选择位置的正确性以确保顺利完成校准。", "slot_unavailable": "板位不可用", - "stand_back_robot_in_motion": "工作站正在运行,请远离", "stand_back": "正在进行校准,请远离", + "stand_back_robot_in_motion": "工作站正在运行,请远离", "start_setup": "开始设置", "successfully_calibrated": "{{module}}已成功校准" } diff --git a/app/src/assets/localization/zh/pipette_wizard_flows.json b/app/src/assets/localization/zh/pipette_wizard_flows.json index 1e75fe6223d..a1bec2143bb 100644 --- a/app/src/assets/localization/zh/pipette_wizard_flows.json +++ b/app/src/assets/localization/zh/pipette_wizard_flows.json @@ -2,14 +2,14 @@ "align_the_connector": "对准对接孔,将移液器安装到工作站上。使用六角螺丝刀拧紧螺丝以固定移液器。然后手动检查其是否已完全固定。", "all_pipette_detached": "所有移液器已成功卸下", "are_you_sure_exit": "您确定要在完成{{flow}}之前退出吗?", - "attach_96_channel_plus_detach": "卸下{{pipetteName}}并安装96通道移液器", + "attach": "正在安装移液器", "attach_96_channel": "安装96通道移液器", - "attach_mounting_plate_instructions": "对准对接孔,将移液器安装到工作站上。为了准确对齐,您可能需要调整右侧移液器支架的位置。", + "attach_96_channel_plus_detach": "卸下{{pipetteName}}并安装96通道移液器", "attach_mounting_plate": "安装固定板", + "attach_mounting_plate_instructions": "对准对接孔,将移液器安装到工作站上。为了准确对齐,您可能需要调整右侧移液器支架的位置。", "attach_pip": "安装移液器", "attach_pipette": "安装{{mount}}移液器", "attach_probe": "安装校准探头", - "attach": "正在安装移液器", "backmost": "最后面的", "before_you_begin": "开始之前", "begin_calibration": "开始校准", @@ -25,6 +25,7 @@ "connect_and_secure_pipette": "连接并固定移液器", "continue": "继续", "critical_unskippable_step": "这是关键步骤,不应跳过", + "detach": "正在卸下移液器", "detach_96_attach_mount": "卸下96通道移液器并安装{{mount}}移液器", "detach_96_channel": "卸下96通道移液器", "detach_and_reattach": "卸下并重新安装移液器", @@ -32,14 +33,13 @@ "detach_mount_attach_96": "卸下{{mount}}移液器并安装96通道移液器", "detach_mounting_plate_instructions": "抓住板子,防止其掉落。拧开移液器固定板的销钉。", "detach_next_pipette": "卸下下一个移液器", - "detach_pipette_to_attach_96": "卸下{{pipetteName}}并安装96通道移液器", "detach_pipette": "卸下{{mount}}移液器", + "detach_pipette_to_attach_96": "卸下{{pipetteName}}并安装96通道移液器", "detach_pipettes_attach_96": "卸下移液器并安装96通道移液器", "detach_z_axis_screw_again": "在安装96通道移液器前,先拧开Z轴螺丝。", - "detach": "正在卸下移液器", "exit_cal": "退出校准", - "firmware_updating": "需要固件更新,仪器正在更新中...", "firmware_up_to_date": "已是最新版本。", + "firmware_updating": "需要固件更新,仪器正在更新中...", "gantry_empty_for_96_channel_success": "现在两个移液器支架都为空,您可以开始进行96通道移液器的安装。", "get_started_detach": "开始前,请移除甲板上的实验耗材,清理工作区以便卸载。同时准备好屏幕所示的所需设备。", "grab_screwdriver": "保持原位不动,用2.5毫米螺丝刀,按照引导动画所示拧紧螺丝。在继续操作前,手动测试移液器安装和固定情况。", @@ -67,11 +67,12 @@ "pipette_heavy": "96通道移液器较重({{weight}})。如有需要,可以请其他人员帮忙。", "please_install_correct_pip": "请改用{{pipetteName}}", "progress_will_be_lost": "{{flow}}的进度将会丢失", + "provided_with_robot": "随工作站提供。使用其他尺寸的工具可能会损坏机器的螺丝。", "reattach_carriage": "重新连接Z轴板", "recalibrate_pipette": "重新校准{{mount}}移液器", "remove_cal_probe": "移除校准探头", - "remove_labware_to_get_started": "开始前,请清除甲板上的实验耗材,清理工作区,以便校准。同时收集屏幕显示的所需设备。校准探头随工作站提供,应存放在工作站的右前方支柱上。", "remove_labware": "开始前,请清除甲板上的实验耗材,清理工作区,以便校准。同时收集屏幕显示的所需设备。校准探头随工作站提供,应存放在工作站的右前方支柱上。", + "remove_labware_to_get_started": "开始前,请清除甲板上的实验耗材,清理工作区,以便校准。同时收集屏幕显示的所需设备。校准探头随工作站提供,应存放在工作站的右前方支柱上。", "remove_probe": "拧松校准探头,将其从喷嘴上拆下,并放回存储位置。", "replace_pipette": "更换{{mount}}移液器", "return_probe_error": "退出前,请将校准探头放回其存放位置。 {{error}}", diff --git a/app/src/assets/localization/zh/protocol_command_text.json b/app/src/assets/localization/zh/protocol_command_text.json index 9d976c2bc88..fd5373b3183 100644 --- a/app/src/assets/localization/zh/protocol_command_text.json +++ b/app/src/assets/localization/zh/protocol_command_text.json @@ -1,11 +1,18 @@ { + "absorbance_reader_close_lid": "正在关闭吸光度读数器盖子", + "absorbance_reader_initialize": "正在初始化吸光度读数器,以便在{{wavelengths}}波长下执行{{mode}}测量", + "absorbance_reader_open_lid": "正在打开吸光度读数器盖子", + "absorbance_reader_read": "正在吸光度读数器中读取微孔板", "adapter_in_mod_in_slot": "{{adapter}}在{{slot}}的{{module}}上", "adapter_in_slot": "{{adapter}}在{{slot}}上", + "air_gap_in_place": "正在形成 {{volume}} µL 的空气间隙", + "all_nozzles": "所有移液喷嘴", "aspirate": "从{{labware_location}}的{{labware}}的{{well_name}}孔中以{{flow_rate}}µL/秒的速度吸液{{volume}}µL", "aspirate_in_place": "在原位以{{flow_rate}}µL/秒的速度吸液{{volume}}µL", "blowout": "在{{labware_location}}的{{labware}}的{{well_name}}孔中以{{flow_rate}}µL/秒的速度排空", "blowout_in_place": "在原位以{{flow_rate}}µL/秒的速度排空", "closing_tc_lid": "关闭热循环仪热盖", + "column_layout": "列布局", "comment": "解释", "configure_for_volume": "配置{{pipette}}以吸液{{volume}}µL", "configure_nozzle_layout": "配置{{pipette}}以使用{{amount}}个通道", @@ -18,55 +25,67 @@ "degrees_c": "{{temp}}°C", "detect_liquid_presence": "正在检测{{labware}}在{{labware_location}}中的{{well_name}}孔中的液体存在", "disengaging_magnetic_module": "下降磁力架模块", - "dispense_push_out": "以{{flow_rate}}µL/秒的速度将{{volume}}µL 排液至{{labware_location}}的{{labware}}的{{well_name}}孔中,并推出{{push_out_volume}}µL", "dispense": "以{{flow_rate}}µL/秒的速度将{{volume}}µL 排液至{{labware_location}}的{{labware}}的{{well_name}}孔中", "dispense_in_place": "在原位以{{flow_rate}}µL/秒的速度排液{{volume}}µL", + "dispense_push_out": "以{{flow_rate}}µL/秒的速度将{{volume}}µL 排液至{{labware_location}}的{{labware}}的{{well_name}}孔中,并推出{{push_out_volume}}µL", "drop_tip": "将吸头丢入{{labware}}的{{well_name}}孔中", "drop_tip_in_place": "在原位丢弃吸头", + "dropping_tip_in_trash": "将吸头丢入{{trash}}", "engaging_magnetic_module": "抬升磁力架模块", "fixed_trash": "垃圾桶", "home_gantry": "复位所有龙门架、移液器和柱塞轴", + "in_location": "在{{location}}", "latching_hs_latch": "在热震荡模块上锁定实验耗材", "left": "左", + "load_labware_to_display_location": "在{{display_location}}加载{{labware}}", "load_liquids_info_protocol_setup": "将{{liquid}}加载到{{labware}}中", "load_module_protocol_setup": "在甲板槽{{slot_name}}中加载模块{{module}}", "load_pipette_protocol_setup": "在{{mount_name}}支架上加载{{pipette_name}}", - "module_in_slot_plural": "{{module}}", "module_in_slot": "{{module}}在{{slot_name}}号板位", + "module_in_slot_plural": "{{module}}", + "move_labware": "移动实验耗材", "move_labware_manually": "手动将{{labware}}从{{old_location}}移动到{{new_location}}", "move_labware_on": "在{{robot_name}}上移动实验耗材", "move_labware_using_gripper": "使用转板抓手将{{labware}}从{{old_location}}移动到{{new_location}}", - "move_labware": "移动实验耗材", "move_relative": "沿{{axis}}轴移动{{distance}}毫米", + "move_to_addressable_area": "移动到{{addressable_area}}", + "move_to_addressable_area_drop_tip": "移动到{{addressable_area}}", "move_to_coordinates": "移动到 (X:{{x}}, Y:{{y}}, Z:{{z}})", "move_to_slot": "移动到{{slot_name}}号板位", "move_to_well": "移动到{{labware_location}}的{{labware}}的{{well_name}}孔", - "move_to_addressable_area": "移动到{{addressable_area}}", - "move_to_addressable_area_drop_tip": "移动到{{addressable_area}}", + "multiple": "多个", "notes": "备注", "off_deck": "甲板外", "offdeck": "甲板外", + "on_location": "在{{location}}", "opening_tc_lid": "打开热循环仪热盖", - "pause_on": "在{{robot_name}}上暂停", + "partial_layout": "部分布局", "pause": "暂停", + "pause_on": "在{{robot_name}}上暂停", "pickup_tip": "从{{labware_location}}的{{labware}}的{{well_range}}孔中拾取吸头", "prepare_to_aspirate": "准备使用{{pipette}}吸液", "reloading_labware": "正在重新加载{{labware}}", "return_tip": "将吸头返回到{{labware_location}}的{{labware}}的{{well_name}}孔中", "right": "右", + "row_layout": "行布局", "save_position": "保存位置", "set_and_await_hs_shake": "设置热震荡模块以{{rpm}}rpm 震动并等待达到该转速", "setting_hs_temp": "将热震荡模块的目标温度设置为{{temp}}", "setting_temperature_module_temp": "将温控模块设置为{{temp}}(四舍五入到最接近的整数)", "setting_thermocycler_block_temp": "将热循环仪加热块温度设置为{{temp}},并在达到目标后保持{{hold_time_seconds}}秒", "setting_thermocycler_lid_temp": "将热循环仪热盖温度设置为{{temp}}", + "single": "单个", + "single_nozzle_layout": "单个移液喷嘴布局", "slot": "板位{{slot_name}}", "target_temperature": "目标温度", "tc_awaiting_for_duration": "等待热循环仪程序完成", "tc_run_profile_steps": "温度:{{celsius}}°C,时间:{{seconds}}秒", + "tc_starting_extended_profile": "运行热循环仪程序,共有{{elementCount}}个步骤和循环:", + "tc_starting_extended_profile_cycle": "以下步骤重复{{repetitions}}次:", "tc_starting_profile": "热循环仪开始进行由以下步骤组成的{{repetitions}}次循环:", - "trash_bin_in_slot": "垃圾桶在{{slot_name}}", "touch_tip": "吸头接触内壁", + "trash_bin": "垃圾桶", + "trash_bin_in_slot": "垃圾桶在{{slot_name}}", "turning_rail_lights_off": "正在关闭导轨灯", "turning_rail_lights_on": "正在打开导轨灯", "unlatching_hs_latch": "解锁热震荡模块上的实验耗材", @@ -76,5 +95,6 @@ "waiting_for_tc_block_to_reach": "等待热循环仪加热块达到目标温度并保持指定时间", "waiting_for_tc_lid_to_reach": "等待热循环仪热盖达到目标温度", "waiting_to_reach_temp_module": "等待温控模块达到{{temp}}", - "waste_chute": "外置垃圾槽" + "waste_chute": "外置垃圾槽", + "with_reference_of": "以{{wavelength}} nm为基准" } diff --git a/app/src/assets/localization/zh/protocol_details.json b/app/src/assets/localization/zh/protocol_details.json index 22f4c0566fc..3bb53fe43c5 100644 --- a/app/src/assets/localization/zh/protocol_details.json +++ b/app/src/assets/localization/zh/protocol_details.json @@ -10,32 +10,31 @@ "connected": "已连接", "connection_status": "连接状态", "creation_method": "创建方法", - "csv_file_type_required": "需要CSV文件类型", "csv_file": "CSV文件", - "csv_required": "该协议需要CSV文件才能继续。", + "csv_file_type_required": "需要CSV文件类型", "deck_view": "甲板视图", "default_value": "默认值", - "delete_protocol_perm": "{{name}}及其运行历史将被永久删除。", "delete_protocol": "删除协议", + "delete_protocol_perm": "{{name}}及其运行历史将被永久删除。", "delete_this_protocol": "删除此协议?", "description": "描述", "extension_mount": "扩展安装支架", "file_required": "需要文件", "go_to_labware_definition": "转到实验耗材定义", "go_to_timeline": "转到时间线", - "gripper_pick_up_count_description": "使用转板抓手移动单个耗材的指令。", "gripper_pick_up_count": "转板次数", + "gripper_pick_up_count_description": "使用转板抓手移动单个耗材的指令。", "hardware": "硬件", - "labware_name": "耗材名称", "labware": "耗材", + "labware_name": "耗材名称", "last_analyzed": "上一次分析", "last_updated": "上一次更新", "left_and_right_mounts": "左+右安装架", "left_mount": "左移液器安装位", "left_right": "左,右", "liquid_name": "液体名称", - "liquids_not_in_protocol": "此协议未指定任何液体", "liquids": "液体", + "liquids_not_in_protocol": "此协议未指定任何液体", "listed_values_are_view_only": "列出的值仅供查看", "location": "位置", "modules": "模块", @@ -51,16 +50,16 @@ "num_choices": "{{num}}个选择", "num_options": "{{num}}个选项", "off": "关闭", - "on_off": "开,关", "on": "开启", + "on_off": "开,关", "org_or_author": "组织/作者", "parameters": "参数", - "pipette_aspirate_count_description": "每个移液器的单个吸液指令。", "pipette_aspirate_count": "{{pipette}}吸液次数", - "pipette_dispense_count_description": "每个移液器的单个排液指令。", + "pipette_aspirate_count_description": "每个移液器的单个吸液指令。", "pipette_dispense_count": "{{pipette}}分液次数", - "pipette_pick_up_count_description": "每个移液器的单个拾取吸头指令。", + "pipette_dispense_count_description": "每个移液器的单个排液指令。", "pipette_pick_up_count": "{{pipette}}拾取吸头次数", + "pipette_pick_up_count_description": "每个移液器的单个拾取吸头指令。", "proceed_to_setup": "继续进行设置", "protocol_designer_version": "在线协议编辑器{{version}}", "protocol_failed_app_analysis": "该协议在应用程序内分析失败。它可能在没有自定义软件配置的工作站上无法使用。", @@ -74,24 +73,24 @@ "requires_upload": "需要上传", "restore_defaults": "恢复默认值", "right_mount": "右移液器安装位", + "robot": "工作站", "robot_configuration": "工作站配置", - "robot_is_busy_with_protocol": "{{robotName}}正在运行{{protocolName}},状态为{{runStatus}}。是否要清除并继续?", "robot_is_busy": "{{robotName}}正在工作", - "robot": "工作站", + "robot_is_busy_with_protocol": "{{robotName}}正在运行{{protocolName}},状态为{{runStatus}}。是否要清除并继续?", "run_protocol": "运行协议", "select_parameters_for_robot": "选择{{robot_name}}的参数", "send": "发送", "sending": "发送中", "show_in_folder": "在文件夹中显示", "slot": "{{slotName}}号板位", - "start_setup_customize_values": "开始设置以自定义值", "start_setup": "开始设置", + "start_setup_customize_values": "开始设置以自定义值", "successfully_sent": "发送成功", "total_volume": "总体积", - "unavailable_or_busy_robot_not_listed_plural": "{{count}}台不可用或工作中的工作站未列出。", "unavailable_or_busy_robot_not_listed": "{{count}}台不可用或工作中的工作站未列出。", - "unavailable_robot_not_listed_plural": "{{count}}台不可用的工作站未列出。", + "unavailable_or_busy_robot_not_listed_plural": "{{count}}台不可用或工作中的工作站未列出。", "unavailable_robot_not_listed": "{{count}}台不可用的工作站未列出。.", + "unavailable_robot_not_listed_plural": "{{count}}台不可用的工作站未列出。", "unsuccessfully_sent": "发送失败", "value_out_of_range": "值必须在{{min}}-{{max}}之间", "view_run_details": "查看运行详情", diff --git a/app/src/assets/localization/zh/protocol_info.json b/app/src/assets/localization/zh/protocol_info.json index 073b4fd6319..0654a1134cd 100644 --- a/app/src/assets/localization/zh/protocol_info.json +++ b/app/src/assets/localization/zh/protocol_info.json @@ -10,6 +10,7 @@ "creation_method": "创建方法", "custom_labware_not_supported": "工作站不支持自定义耗材", "date_added": "添加日期", + "date_added_date": "添加日期:{{date}}", "delete_protocol": "删除协议", "description": "描述", "drag_file_here": "将协议文件拖放到此处", @@ -22,9 +23,9 @@ "exit_modal_heading": "确认关闭协议", "failed_analysis": "分析失败", "get_labware_offset_data": "获取耗材校准数据", + "import": "导入", "import_a_file": "导入协议以开始", "import_new_protocol": "导入协议", - "import": "导入", "incompatible_file_type": "不兼容的文件类型", "instrument_cal_data_title": "校准数据", "instrument_not_attached": "未连接", @@ -37,10 +38,11 @@ "labware_offset_data_title": "耗材校准数据", "labware_offsets_info": "{{number}}组耗材校准数据", "labware_position_check_complete_toast_no_offsets": "耗材位置校准完成。无新建的耗材校准数据。", - "labware_position_check_complete_toast_with_offsets_plural": "耗材位置校准完成。新建了{{count}}组耗材校准数据。", "labware_position_check_complete_toast_with_offsets": "耗材位置校准完成。创建了{{count}}组耗材校准数据。", + "labware_position_check_complete_toast_with_offsets_plural": "耗材位置校准完成。新建了{{count}}组耗材校准数据。", "labware_title": "所需耗材", "last_run": "上次运行", + "last_run_time": "上次运行时间:{{time}}", "last_updated": "最近更新", "launch_protocol_designer": "打开在线协议编辑器", "manual_steps_learn_more": "了解更多关于手动步骤的信息", diff --git a/app/src/assets/localization/zh/protocol_list.json b/app/src/assets/localization/zh/protocol_list.json index 9c2b3be0f59..bb931b9e39d 100644 --- a/app/src/assets/localization/zh/protocol_list.json +++ b/app/src/assets/localization/zh/protocol_list.json @@ -16,8 +16,8 @@ "reanalyze_to_view": " 重新分析 协议", "right_mount": "右移液器安装位", "robot": "工作站", - "send_to_robot_overflow": "发送到{{robot_display_name}}", "send_to_robot": "将协议发送到{{robot_display_name}}", + "send_to_robot_overflow": "发送到{{robot_display_name}}", "show_in_folder": "在文件夹中显示", "start_setup": "开始设置", "this_protocol_will_be_trashed": "该协议将被移至此计算机的回收站,可能无法恢复。", diff --git a/app/src/assets/localization/zh/protocol_setup.json b/app/src/assets/localization/zh/protocol_setup.json index 40a5c8c00f9..990fe911f5f 100644 --- a/app/src/assets/localization/zh/protocol_setup.json +++ b/app/src/assets/localization/zh/protocol_setup.json @@ -1,8 +1,8 @@ { "96_mount": "左+右移液器安装位", "action_needed": "需要操作", - "adapter_slot_location_module": "{{slotName}}号板位,{{adapterName}}在{{moduleName}}上", "adapter_slot_location": "{{slotName}}号板位,{{adapterName}}", + "adapter_slot_location_module": "{{slotName}}号板位,{{adapterName}}在{{moduleName}}上", "add_fixture": "将{{fixtureName}}添加到{{locationName}}", "add_this_deck_hardware": "将此硬件添加到您的甲板配置中。它将在协议分析期间被引用。", "add_to_slot": "添加到{{slotName}}号板位", @@ -12,17 +12,18 @@ "applied_labware_offset_data": "已应用的实验耗材偏移数据", "applied_labware_offsets": "已应用的实验耗材偏移", "are_you_sure_you_want_to_proceed": "您确定要继续运行吗?", - "attach_gripper_failure_reason": "连接所需的转板抓手以继续", + "attach": "连接", "attach_gripper": "连接转板抓手", + "attach_gripper_failure_reason": "连接所需的转板抓手以继续", "attach_module": "校准前连接模块", "attach_pipette_before_module_calibration": "在进行模块校准前连接移液器", "attach_pipette_calibration": "连接移液器以查看校准信息", "attach_pipette_cta": "连接移液器", "attach_pipette_failure_reason": "连接所需的移液器以继续", "attach_pipette_tip_length_calibration": "连接移液器以查看吸头长度校准信息", - "attach": "连接", "back_to_top": "回到顶部", "cal_all_pip": "首先校准移液器", + "calibrate": "校准", "calibrate_deck_failure_reason": "校准甲板以继续", "calibrate_deck_to_proceed_to_pipette_calibration": "校准甲板以继续进行移液器校准", "calibrate_deck_to_proceed_to_tip_length_calibration": "校准甲板以继续进行吸头长度校准", @@ -32,16 +33,15 @@ "calibrate_pipette_before_module_calibration": "在进行模块校准前校准移液器", "calibrate_pipette_failure_reason": "校准所需的移液器以继续", "calibrate_tiprack_failure_reason": "校准所需的吸头长度以继续", - "calibrate": "校准", "calibrated": "已校准", + "calibration": "校准", "calibration_data_not_available": "一旦运行开始,校准数据不可用", "calibration_needed": "需要校准", "calibration_ready": "校准就绪", + "calibration_required": "需要校准", "calibration_required_attach_pipette_first": "需要校准,请先连接移液器", "calibration_required_calibrate_pipette_first": "需要校准,请先校准移液器", - "calibration_required": "需要校准", "calibration_status": "校准状态", - "calibration": "校准", "cancel_and_restart_to_edit": "取消运行并重新启动设置以进行编辑", "choose_csv_file": "选择CSV文件", "choose_enum": "选择{{displayName}}", @@ -62,21 +62,21 @@ "connect_modules_for_controls": "连接模块以查看控制", "connection_info_not_available": "一旦运行开始,连接信息不可用", "connection_status": "连接状态", + "csv_file": "CSV 文件", "csv_files_on_robot": "工作站上的CSV文件", "csv_files_on_usb": "USB上的CSV文件", - "csv_file": "CSV 文件", "currently_configured": "当前已配置", "currently_unavailable": "当前不可用", "custom_values": "自定义值", + "deck_cal_description": "这测量了甲板的 X 和 Y 值相对于门架的值。甲板校准是吸头长度校准和移液器偏移校准的基础。", "deck_cal_description_bullet_1": "在新工作站设置期间执行甲板校准。", "deck_cal_description_bullet_2": "如果您搬迁了工作站,请重新进行甲板校准。", - "deck_cal_description": "这测量了甲板的 X 和 Y 值相对于门架的值。甲板校准是吸头长度校准和移液器偏移校准的基础。", "deck_calibration_title": "甲板校准(Deck Calibration)", - "deck_conflict_info_thermocycler": "通过移除位置 A1 和 B1 中的固定装置来更新甲板配置。从甲板配置中移除对应装置或更新协议。", - "deck_conflict_info": "通过移除位置 {{cutout}} 中的 {{currentFixture}} 来更新甲板配置。从甲板配置中移除对应装置或更新协议。", "deck_conflict": "甲板位置冲突", - "deck_hardware_ready": "甲板硬件准备", + "deck_conflict_info": "通过移除位置 {{cutout}} 中的 {{currentFixture}} 来更新甲板配置。从甲板配置中移除对应装置或更新协议。", + "deck_conflict_info_thermocycler": "通过移除位置 A1 和 B1 中的固定装置来更新甲板配置。从甲板配置中移除对应装置或更新协议。", "deck_hardware": "甲板硬件", + "deck_hardware_ready": "甲板硬件准备", "deck_map": "甲板布局图", "default_values": "默认值", "download_files": "下载文件", @@ -86,62 +86,63 @@ "extra_attention_warning_title": "在继续运行前固定耗材和模块", "extra_module_attached": "附加额外模块", "feedback_form_link": "请告诉我们", - "fixture_name": "装置", "fixture": "装置", - "fixtures_connected_plural": "已连接{{count}}个装置", + "fixture_name": "装置", "fixtures_connected": "已连接{{count}}个装置", + "fixtures_connected_plural": "已连接{{count}}个装置", "get_labware_offset_data": "获取耗材校准数据", "hardware_missing": "缺少硬件", "heater_shaker_extra_attention": "使用闩锁控制,便于放置耗材。", "heater_shaker_labware_list_view": "要添加耗材,请使用切换键来控制闩锁", "how_offset_data_works": "耗材校准数据如何工作", "individiual_well_volume": "单个孔体积", - "initial_liquids_num_plural": "{{count}}种初始液体", "initial_liquids_num": "{{count}}种初始液体", + "initial_liquids_num_plural": "{{count}}种初始液体", "initial_location": "初始位置", + "install_modules": "安装所需的模块。", "install_modules_and_fixtures": "安装并校准所需的模块。安装所需的装置。", "install_modules_plural": "安装所需的模块。", - "install_modules": "安装所需的模块。", - "instrument_calibrations_missing_plural": "缺少{{count}}个校准", "instrument_calibrations_missing": "缺少{{count}}个校准", - "instruments_connected_plural": "已连接{{count}}个硬件", - "instruments_connected": "已连接{{count}}个硬件", + "instrument_calibrations_missing_plural": "缺少{{count}}个校准", "instruments": "硬件", - "labware_latch_instructions": "使用闩锁控制,便于放置耗材。", + "instruments_connected": "已连接{{count}}个硬件", + "instruments_connected_plural": "已连接{{count}}个硬件", + "labware": "耗材", "labware_latch": "耗材闩锁", + "labware_latch_instructions": "使用闩锁控制,便于放置耗材。", "labware_location": "耗材位置", "labware_name": "耗材名称", "labware_placement": "实验耗材放置", + "labware_position_check": "耗材位置校准", + "labware_position_check_not_available": "运行开始后,耗材位置校准不可用", "labware_position_check_not_available_analyzing_on_robot": "在工作站上分析协议时,耗材位置校准不可用", "labware_position_check_not_available_empty_protocol": "耗材位置校准需要协议加载耗材和移液器", - "labware_position_check_not_available": "运行开始后,耗材位置校准不可用", "labware_position_check_step_description": "建议的工作流程可帮助您验证每个耗材在甲板上的位置。", "labware_position_check_step_title": "耗材位置校准", "labware_position_check_text": "耗材位置校准流程可帮助您验证甲板上每个耗材的位置。在此位置校准过程中,您可以创建耗材校准数据,以调整工作站在 X、Y 和 Z 方向上的移动。", - "labware_position_check": "耗材位置校准", + "labware_quantity": "数量:{{quantity}}", "labware_setup_step_description": "准备好以下耗材和完整的吸头盒。若不进行耗材位置校准直接运行协议,请将耗材放置在其初始位置并固定。", "labware_setup_step_title": "耗材", - "labware": "耗材", "last_calibrated": "最后校准:{{date}}", "learn_how_it_works": "了解它的工作原理", + "learn_more": "了解更多", "learn_more_about_offset_data": "了解更多关于耗材校准数据的信息", "learn_more_about_robot_cal_link": "了解更多关于工作站校准的信息", - "learn_more": "了解更多", "liquid_information": "液体信息", "liquid_name": "液体名称", "liquid_setup_step_description": "查看液体的起始位置和体积", "liquid_setup_step_title": "液体", + "liquids": "液体", "liquids_confirmed": "液体已确认", "liquids_not_in_setup": "此协议未使用液体", "liquids_not_in_the_protocol": "此协议未指定液体。", "liquids_ready": "液体准备", - "liquids": "液体", "list_view": "列表视图", "loading_data": "加载数据...", "loading_labware_offsets": "加载耗材校准数据", "loading_protocol_details": "加载详情...", - "location_conflict": "位置冲突", "location": "位置", + "location_conflict": "位置冲突", "lpc_and_offset_data_title": "耗材位置校准和耗材校准数据", "lpc_disabled_calibration_not_complete": "确保工作站校准完成后再运行耗材位置校准", "lpc_disabled_modules_and_calibration_not_complete": "确保工作站校准完成并且所有模块已连接后再运行耗材位置校准", @@ -149,36 +150,37 @@ "lpc_disabled_no_tipracks_loaded": "耗材位置校准需要在协议中加载一个吸头盒", "lpc_disabled_no_tipracks_used": "耗材位置校准要求协议中至少有一个吸头可供使用", "map_view": "布局视图", + "missing": "缺少", "missing_gripper": "缺少转板抓手", "missing_instruments": "缺少{{count}}个", - "missing_pipettes_plural": "缺少{{count}}个移液器", "missing_pipettes": "缺少{{count}}个移液器", - "missing": "缺少", + "missing_pipettes_plural": "缺少{{count}}个移液器", "modal_instructions_title": "{{moduleName}}设置说明", + "module": "模块", "module_connected": "已连接", "module_disconnected": "未连接", "module_instructions_link": "{{moduleName}}设置说明", + "module_instructions_manual": "要了解有关设置模块的分步说明,请查阅包装盒内的快速入门指南。您也可以点击下面的链接或扫描二维码,查看模块使用说明书。", "module_mismatch_body": "检查连接到该工作站的模块型号是否正确", "module_name": "模块", "module_not_connected": "未连接", "module_setup_step_ready": "校准准备", "module_setup_step_title": "甲板硬件", "module_slot_location": "{{slotName}}号板位,{{moduleName}}", - "module": "模块", - "modules_connected_plural": "连接了{{count}}个模块", + "modules": "模块", "modules_connected": "连接了{{count}}个模块", + "modules_connected_plural": "连接了{{count}}个模块", "modules_setup_step_title": "模块设置", - "modules": "模块", - "mount_title": "{{mount}}安装支架:", "mount": "{{mount}}安装支架", + "mount_title": "{{mount}}安装支架:", "multiple_fixtures_missing": "缺少{{count}}个装置", + "multiple_modules": "相同类型的多个模块", "multiple_modules_example": "您的协议包含两个温控模块。连接到左侧第一个端口的温控模块对应协议中的第一个温控模块,连接到下一个端口的温控模块对应协议中的第二个温控模块。如果使用集线器,遵循相同的端口排序逻辑。", "multiple_modules_explanation": "在协议中使用多个相同类型的模块时,首先需要将协议中第一个模块连接到工作站编号最小的USB端口,然后以相同方式连接其他模块。", "multiple_modules_help_link_title": "查看如何设置相同类型的多个模块", "multiple_modules_learn_more": "了解更多关于使用相同类型的多个模块的信息", "multiple_modules_missing_plural": "缺少{{count}}个模块", "multiple_modules_modal": "设置相同类型的多个模块", - "multiple_modules": "相同类型的多个模块", "multiple_of_most_modules": "通过以特定顺序连接和加载模块,可以在单个Python协议中使用多种模块类型。无论模块占用哪个甲板板位,工作站都将首先初始化连接到最小编号端口的匹配模块,。", "must_have_labware_and_pip": "协议中必须加载耗材和移液器", "n_a": "不可用", @@ -191,8 +193,8 @@ "no_modules_or_fixtures": "该协议中未指定任何模块或装置。", "no_modules_specified": "该协议中未指定任何模块。", "no_modules_used_in_this_protocol": "该协议中未使用硬件", - "no_parameters_specified_in_protocol": "协议中未指定任何参数", "no_parameters_specified": "未指定参数", + "no_parameters_specified_in_protocol": "协议中未指定任何参数", "no_tiprack_loaded": "协议中必须加载一个吸头盒", "no_tiprack_used": "协议中必须拾取一个吸头", "no_usb_connection_required": "无需USB连接", @@ -200,33 +202,32 @@ "no_usb_required": "无需USB", "not_calibrated": "尚未校准", "not_configured": "未配置", - "off_deck": "甲板外", "off": "关闭", + "off_deck": "甲板外", "offset_data": "偏移校准数据", - "offsets_applied_plural": "应用了{{count}}个偏移校准数据", "offsets_applied": "应用了{{count}}个偏移校准数据", "offsets_confirmed": "偏移校准数据已确认", "offsets_ready": "偏移校准数据准备", - "on_adapter_in_mod": "在{{moduleName}}中的{{adapterName}}上", + "on": "开启", + "on-deck_labware": "{{count}}个在甲板上的耗材", "on_adapter": "在{{adapterName}}上", + "on_adapter_in_mod": "在{{moduleName}}中的{{adapterName}}上", "on_deck": "在甲板上", - "on-deck_labware": "{{count}}个在甲板上的耗材", - "on": "开启", "opening": "打开中...", "parameters": "参数", "pipette_mismatch": "移液器型号不匹配。", "pipette_missing": "移液器缺失", + "pipette_offset_cal": "移液器偏移校准", + "pipette_offset_cal_description": "这会测量移液器相对于移液器安装支架和甲板的X、Y和Z值。移液器偏移校准依赖于甲板校准和吸头长度校准。 ", "pipette_offset_cal_description_bullet_1": "首次将移液器连接到新安装支架时执行移液器偏移校准。", "pipette_offset_cal_description_bullet_2": "在执行甲板校准后重新进行移液器偏移校准。", "pipette_offset_cal_description_bullet_3": "对用于校准移液器的吸头执行吸头长度校准后,重新进行移液器偏移校准。", - "pipette_offset_cal_description": "这会测量移液器相对于移液器安装支架和甲板的X、Y和Z值。移液器偏移校准依赖于甲板校准和吸头长度校准。 ", - "pipette_offset_cal": "移液器偏移校准", + "placement": "放置", "placements_confirmed": "位置已确认", "placements_ready": "位置准备", - "placement": "放置", "plug_in_module_to_configure": "插入{{module}}以将其添加到板位", - "plug_in_required_module_plural": "插入并启动所需模块以继续", "plug_in_required_module": "插入并启动所需模块以继续", + "plug_in_required_module_plural": "插入并启动所需模块以继续", "prepare_to_run": "准备运行", "proceed_to_labware_position_check": "继续进行耗材位置校准", "proceed_to_labware_setup_step": "继续进行耗材设置", @@ -248,34 +249,34 @@ "recalibrating_not_available": "无法重新进行吸头长度校准和耗材位置校准。", "recalibrating_tip_length_not_available": "运行开始后无法重新校准吸头长度", "recommended": "推荐", - "required_instrument_calibrations": "所需的硬件校准", "required": "必需", + "required_instrument_calibrations": "所需的硬件校准", "required_tip_racks_title": "所需的吸头长度校准", - "reset_parameter_values_body": "这将丢弃您所做的任何更改。所有参数将恢复默认值。", "reset_parameter_values": "重置参数值?", + "reset_parameter_values_body": "这将丢弃您所做的任何更改。所有参数将恢复默认值。", "reset_setup": "重新开始设置以进行编辑", "reset_values": "重置值", "resolve": "解决", - "restart_setup_and_try": "重新开始设置并尝试使用不同的参数值。", "restart_setup": "重新开始设置", + "restart_setup_and_try": "重新开始设置并尝试使用不同的参数值。", "restore_default": "恢复默认值", "restore_defaults": "恢复默认值", "robot_cal_description": "工作站校准用于确定其相对于甲板的位置。良好的工作站校准对于成功运行协议至关重要。工作站校准包括3个部分:甲板校准、吸头长度校准和移液器偏移校准。", "robot_cal_help_title": "工作站校准的工作原理", - "robot_calibration_step_description_pipettes_only": "查看该协议所需的硬件和校准。", "robot_calibration_step_description": "查看该协议所需的移液器和吸头长度校准。", + "robot_calibration_step_description_pipettes_only": "查看该协议所需的硬件和校准。", "robot_calibration_step_ready": "校准准备", "robot_calibration_step_title": "硬件", + "run": "运行", "run_disabled_calibration_not_complete": "确保工作站校准完成后再继续运行", "run_disabled_modules_and_calibration_not_complete": "确保工作站校准完成并且所有模块已连接后再继续运行", "run_disabled_modules_not_connected": "确保所有模块已连接后再继续运行", - "run_labware_position_check_to_get_offsets": "运行实验室位置检查以获取实验室偏移数据。", "run_labware_position_check": "运行耗材位置校准", + "run_labware_position_check_to_get_offsets": "运行实验室位置检查以获取实验室偏移数据。", "run_never_started": "运行未开始", - "run": "运行", + "secure": "固定", "secure_labware_instructions": "固定耗材说明", "secure_labware_modal": "将耗材固定到{{name}}", - "secure": "固定", "setup_for_run": "运行设置", "setup_instructions": "设置说明", "setup_is_view_only": "运行开始后设置仅供查看", @@ -287,22 +288,22 @@ "step": "步骤{{index}}", "there_are_no_unconfigured_modules": "没有连接{{module}}。请连接一个模块并放置在{{slot}}号板位中。", "there_are_other_configured_modules": "已有一个{{module}}配置在不同的板位中。退出运行设置,并更新甲板配置以转到已连接的模块。或连接另一个{{module}}继续设置。", - "tip_length_cal_description_bullet": "对移液器上将会用到的每种类型的吸头执行吸头长度校准。", "tip_length_cal_description": "这将测量吸头底部与移液器喷嘴之间的Z轴距离。如果对用于校准移液器的吸头重新进行吸头长度校准,也需要重新进行移液器偏移校准。", + "tip_length_cal_description_bullet": "对移液器上将会用到的每种类型的吸头执行吸头长度校准。", "tip_length_cal_title": "吸头长度校准", "tip_length_calibration": "吸头长度校准", "total_liquid_volume": "总体积", - "update_deck_config": "更新甲板配置", "update_deck": "更新甲板", + "update_deck_config": "更新甲板配置", "update_offsets": "更新偏移校准数据", "updated": "已更新", "usb_connected_no_port_info": "USB端口已连接", "usb_drive_notification": "在运行开始前,请保持USB处于连接状态", "usb_port_connected": "USB端口{{port}}", "usb_port_number": "USB-{{port}}", - "value_out_of_range_generic": "值必须在范围内", - "value_out_of_range": "值必须在{{min}}-{{max}}之间", "value": "值", + "value_out_of_range": "值必须在{{min}}-{{max}}之间", + "value_out_of_range_generic": "值必须在范围内", "values_are_view_only": "值仅供查看", "variable_well_amount": "可变孔数", "view_current_offsets": "查看当前偏移量", diff --git a/app/src/assets/localization/zh/quick_transfer.json b/app/src/assets/localization/zh/quick_transfer.json index 5ecce11bb9c..159b627daf4 100644 --- a/app/src/assets/localization/zh/quick_transfer.json +++ b/app/src/assets/localization/zh/quick_transfer.json @@ -1,23 +1,25 @@ { "a_way_to_move_liquid": "一种将单一液体从一个实验耗材移动到另一个实验耗材的方法。", - "add_or_remove_columns": "添加或移除列", "add_or_remove": "添加或移除", + "add_or_remove_columns": "添加或移除列", "advanced_setting_disabled": "此移液的高级设置已禁用", "advanced_settings": "高级设置", + "air_gap": "空气间隙", + "air_gap_after_aspirating": "吸液后形成空气间隙", "air_gap_before_dispensing": "在分液前设置空气间隙", "air_gap_capacity_error": "移液器空间已满,无法添加空气间隙。", "air_gap_value": "{{volume}} µL", "air_gap_volume_µL": "空气间隙体积(µL)", - "air_gap": "空气间隙", "all": "所有实验耗材", "always": "每次吸液前", - "aspirate_flow_rate_µL": "吸取流速(µL/s)", "aspirate_flow_rate": "吸取流速", + "aspirate_flow_rate_µL": "吸取流速(µL/s)", "aspirate_settings": "吸取设置", "aspirate_tip_position": "吸取移液器位置", "aspirate_volume": "每孔吸液体积", "aspirate_volume_µL": "每孔吸液体积(µL)", "attach_pipette": "连接移液器", + "blow_out": "吹出", "blow_out_after_dispensing": "分液后吹出", "blow_out_destination_well": "目标孔", "blow_out_into_destination_well": "到目标孔", @@ -27,7 +29,6 @@ "blow_out_source_well": "源孔", "blow_out_trash_bin": "垃圾桶", "blow_out_waste_chute": "外置垃圾槽", - "blow_out": "吹出", "both_mounts": "左侧+右侧支架", "change_tip": "更换吸头", "character_limit_error": "字数超出限制", @@ -38,23 +39,24 @@ "create_new_transfer": "创建新的快速移液命令", "create_to_get_started": "创建新的快速移液以开始操作。", "create_transfer": "创建移液命令", + "delay": "延迟", + "delay_after_aspirating": "吸液后延迟", "delay_before_dispensing": "分液前的延迟", "delay_duration_s": "延迟时长(秒)", "delay_position_mm": "距孔底延迟时的位置(mm)", "delay_value": "{{delay}}秒,距离孔底{{position}}mm", - "delay": "延迟", "delete_this_transfer": "确定删除此这个快速移液?", "delete_transfer": "删除快速移液", "deleted_transfer": "已删除快速移液", "destination": "目标", "destination_labware": "目标实验耗材", "disabled": "已禁用", - "dispense_flow_rate_µL": "分液流速(µL/s)", "dispense_flow_rate": "分液流速", + "dispense_flow_rate_µL": "分液流速(µL/s)", "dispense_settings": "分液设置", "dispense_tip_position": "分液吸头位置", - "dispense_volume_µL": "每孔排液体积(µL)", "dispense_volume": "每孔排液体积", + "dispense_volume_µL": "每孔排液体积(µL)", "disposal_volume_µL": "废液量(µL)", "distance_bottom_of_well_mm": "距离孔底的高度(mm)", "distribute_volume_error": "所选源孔太小,无法从中分液。请尝试向更少的孔中分液。", @@ -70,12 +72,12 @@ "learn_more": "了解更多", "left_mount": "左侧支架", "lose_all_progress": "您将失去所有此快速移液流程进度.", + "mix": "混匀", "mix_before_aspirating": "在吸液前混匀", "mix_before_dispensing": "在分液前混匀", "mix_repetitions": "混匀重复次数", "mix_value": "{{volume}} µL,混匀{{reps}}次", "mix_volume_µL": "混匀体积(µL)", - "mix": "混匀", "name_your_transfer": "为您的快速移液流程命名", "none_to_show": "没有快速移液可显示!", "number_wells_selected_error_learn_more": "具有多个源孔{{selectionUnits}}的快速移液是可以进行一对一或者多对多移液的(为此移液流程同样选择{{wellCount}}个目标孔位{{selectionUnits}})或进行多对一移液,即合并为单个孔位(选择1个目标孔{{selectionUnit}})。", @@ -89,24 +91,24 @@ "pin_transfer": "快速移液", "pinned_transfer": "固定快速移液", "pinned_transfers": "固定快速移液", + "pipette": "移液器", + "pipette_currently_attached": "快速移液移液器选项取决于当前您工作站上安装的移液器.", + "pipette_path": "移液器路径", "pipette_path_multi_aspirate": "多次吸取", - "pipette_path_multi_dispense_volume_blowout": "多次分液,{{volume}} 微升废弃量,在{{blowOutLocation}}吹出", "pipette_path_multi_dispense": "多次分液", + "pipette_path_multi_dispense_volume_blowout": "多次分液,{{volume}} 微升废弃量,在{{blowOutLocation}}吹出", "pipette_path_single": "单次转移", - "pipette_path": "移液器路径", - "pipette_currently_attached": "快速移液移液器选项取决于当前您工作站上安装的移液器.", - "pipette": "移液器", "pre_wet_tip": "润湿吸头", - "quick_transfer_volume": "快速移液{{volume}}µL", "quick_transfer": "快速移液", - "right_mount": "右侧支架", + "quick_transfer_volume": "快速移液{{volume}}µL", "reservoir": "储液槽", + "right_mount": "右侧支架", "run_now": "立即运行", "run_quick_transfer_now": "您想立即运行快速移液流程吗?", "run_transfer": "运行快速移液", "save": "保存", - "save_to_run_later": "保存您的快速移液流程以备后续运行.", "save_for_later": "保存备用", + "save_to_run_later": "保存您的快速移液流程以备后续运行.", "select_attached_pipette": "选择已连接的移液器", "select_by": "按...选择", "select_dest_labware": "选择目标实验耗材", @@ -117,23 +119,23 @@ "set_aspirate_volume": "设置吸液体积", "set_dispense_volume": "设置排液体积", "set_transfer_volume": "设置移液体积", + "source": "源", "source_labware": "源实验耗材", "source_labware_c2": "C2 中的源实验耗材", - "source": "源", "starting_well": "起始孔", "storage_limit_reached": "已达到存储限制", - "use_deck_slots": "快速移液将使用板位B2-D2。这些板位将用于放置吸头盒、源实验耗材和目标实验耗材。请确保使用最新的甲板配置,避免碰撞。", "tip_drop_location": "吸头丢弃位置", "tip_management": "吸头管理", - "tip_position_value": "距底部 {{position}} mm", "tip_position": "移液器位置", + "tip_position_value": "距底部 {{position}} mm", "tip_rack": "吸头盒", "too_many_pins_body": "删除一个快速移液,以便向您的固定列表中添加更多传输。", "too_many_pins_header": "您已达到上限!", + "touch_tip": "碰壁动作", + "touch_tip_after_aspirating": "吸液后触碰吸头", "touch_tip_before_dispensing": "在分液前做碰壁动作", "touch_tip_position_mm": "在孔底部做碰壁动作的高度(mm)", "touch_tip_value": "距底部 {{position}} mm", - "touch_tip": "碰壁动作", "transfer_analysis_failed": "快速移液分析失败", "transfer_name": "移液名称", "trashBin": "垃圾桶", @@ -141,16 +143,17 @@ "tubeRack": "试管架", "unpin_transfer": "取消固定的快速移液", "unpinned_transfer": "已取消固定的快速移液", + "use_deck_slots": "快速移液将使用板位B2-D2。这些板位将用于放置吸头盒、源实验耗材和目标实验耗材。请确保使用最新的甲板配置,避免碰撞。", + "value_out_of_range": "值必须在{{min}}-{{max}}之间", "volume_per_well": "每孔体积", "volume_per_well_µL": "每孔体积(µL)", - "value_out_of_range": "值必须在{{min}}-{{max}}之间", "wasteChute": "外置垃圾槽", "wasteChute_location": "位于{{slotName}}的外置垃圾槽", "welcome_to_quick_transfer": "欢迎使用快速移液!", + "well": "孔", "wellPlate": "孔板", - "well_selection": "孔位选择", "well_ratio": "快速移液可以一对一或者多对多进行移液的(为此移液操作选择同样数量的{{wells}})或可以多对一,也就是合并为单孔(选择1个目标孔位)。", - "well": "孔", + "well_selection": "孔位选择", "wells": "孔", "will_be_deleted": "{{transferName}} 将被永久删除。" } diff --git a/app/src/assets/localization/zh/run_details.json b/app/src/assets/localization/zh/run_details.json index 2bfa9c1a5e1..b6fabcfe08c 100644 --- a/app/src/assets/localization/zh/run_details.json +++ b/app/src/assets/localization/zh/run_details.json @@ -1,10 +1,11 @@ { "analysis_failure_on_robot": "尝试在{{robotName}}上分析{{protocolName}}时发生错误。请修复以下错误,然后再次尝试运行此协议。", "analyzing_on_robot": "移液工作站分析中", - "anticipated_step": "预期步骤", "anticipated": "预期步骤", + "anticipated_step": "预期步骤", "apply_stored_data": "应用存储的数据", "apply_stored_labware_offset_data": "应用已储存的耗材校准数据?", + "cancel_run": "取消运行", "cancel_run_alert_info_flex": "该动作将终止本次运行并使移液器归位。", "cancel_run_alert_info_ot2": "该动作将终止本次运行,已拾取的吸头将被丢弃,移液器将归位。", "cancel_run_and_restart": "取消运行,重新进行设置以进行编辑", @@ -12,56 +13,56 @@ "cancel_run_modal_confirm": "是,取消运行", "cancel_run_modal_heading": "确定要取消吗?", "cancel_run_module_info": "此外,协议中使用的模块将保持激活状态,直到被禁用。", - "cancel_run": "取消运行", - "canceling_run_dot": "正在取消运行...", "canceling_run": "正在取消运行", - "clear_protocol_to_make_available": "清除工作站的协议以使其可用", + "canceling_run_dot": "正在取消运行...", "clear_protocol": "清除协议", - "close_door_to_resume_run": "关闭工作站门以继续运行", - "close_door_to_resume": "关闭移液工作站的前门以继续运行", + "clear_protocol_to_make_available": "清除工作站的协议以使其可用", "close_door": "关闭移液工作站前门", + "close_door_to_resume": "关闭移液工作站的前门以继续运行", + "close_door_to_resume_run": "关闭工作站门以继续运行", "closing_protocol": "正在关闭协议", - "comment_step": "注释", "comment": "注释", + "comment_step": "注释", "complete_protocol_to_download": "完成协议以下载运行日志", - "current_step_pause_timer": "计时器", - "current_step_pause": "当前步骤 - 用户暂停", "current_step": "当前步骤", + "current_step_pause": "当前步骤 - 用户暂停", + "current_step_pause_timer": "计时器", "current_temperature": "当前:{{temperature}}°C", "custom_values": "自定义值", "data_out_of_date": "此数据可能已过期", "date": "日期", + "device_details": "设备详细信息", "door_is_open": "工作站前门已打开", "door_open_pause": "当前步骤 - 暂停 - 前门已打开", - "download_files": "下载文件", "download": "下载", + "download_files": "下载文件", "download_run_log": "下载运行日志", "downloading_run_log": "正在下载运行日志", "drop_tip": "在{{labware_location}}内的{{labware}}中的{{well_name}}中丢弃吸头", "duration": "持续时间", + "end": "结束", "end_of_protocol": "协议结束", "end_step_time": "结束", - "end": "结束", "error_details": "错误详情", "error_info": "错误{{errorCode}}:{{errorType}}", "error_type": "错误:{{errorType}}", "failed_step": "步骤失败", + "files_available_robot_details": "与协议运行相关的所有文件均可在工作站详情页面查看。", "final_step": "最后一步", "ignore_stored_data": "忽略已存储的数据", - "labware_offset_data": "耗材校准数据", "labware": "耗材", + "labware_offset_data": "耗材校准数据", "left": "左", "listed_values": "列出的值仅供查看", - "load_liquids_info_protocol_setup": "将{{liquid}}加载到{{labware}}中", + "load_labware_info_protocol_setup_plural": "在{{module_name}}中加载{{labware}}", "load_module_protocol_setup_plural": "加载{{module}}", - "load_module_protocol_setup": "在{{slot_name}}号板位中加载{{module}}", - "load_pipette_protocol_setup": "在{{mount_name}}安装位上加载{{pipette_name}}", - "loading_protocol": "正在加载协议", "loading_data": "正在加载数据...", + "loading_protocol": "正在加载协议", "location": "位置", "module_controls": "模块控制", "module_slot_number": "板位{{slot_number}}", "move_labware": "移动耗材", + "na": "不适用", "name": "名称", "no_files_included": "未包含协议文件", "no_of_error": "{{count}}个错误", @@ -74,9 +75,9 @@ "not_started_yet": "未开始", "off_deck": "甲板外", "parameters": "参数", + "pause": "暂停", "pause_protocol": "暂停协议", "pause_run": "暂停运行", - "pause": "暂停", "paused_for": "暂停原因", "pickup_tip": "从{{labware_location}}内的{{labware}}中的{{well_name}}孔位拾取吸头", "plus_more": "+{{count}}更多", @@ -100,39 +101,39 @@ "right": "右", "robot_has_previous_offsets": "该移液工作站已存储了之前运行协议的耗材校准数据。您想将这些数据应用于此协议的运行吗?您仍然可以通过实验器具位置检查调整校准数据。", "robot_was_recalibrated": "在储存此耗材校准数据后,移液工作站已重新校准", + "run": "运行", "run_again": "再次运行", + "run_canceled": "运行已取消。", "run_canceled_splash": "运行已取消", - "run_canceled_with_errors_splash": "因错误取消运行。", "run_canceled_with_errors": "因错误取消运行。", - "run_canceled": "运行已取消。", + "run_canceled_with_errors_splash": "因错误取消运行。", + "run_complete": "运行已完成", + "run_completed": "运行已完成。", "run_completed_splash": "运行完成", - "run_completed_with_warnings_splash": "运行完成,并伴有警告。", "run_completed_with_warnings": "运行完成,并伴有警告。", - "run_completed": "运行已完成。", - "run_complete_splash": "运行已完成", - "run_complete": "运行已完成", + "run_completed_with_warnings_splash": "运行完成,并伴有警告。", "run_cta_disabled": "在开始运行之前,请完成协议选项卡上的所有必要步骤。", + "run_failed": "运行失败。", "run_failed_modal_body": "在协议执行{{command}}时发生错误。", "run_failed_modal_header": "{{errorName}}:{{errorCode}}协议步骤{{count}}", "run_failed_modal_title": "运行失败", "run_failed_splash": "运行失败", - "run_failed": "运行失败。", "run_has_diverged_from_predicted": "运行已偏离预期状态。无法执行新的预期步骤。", "run_preview": "运行预览", "run_protocol": "运行协议", "run_status": "状态:{{status}}", "run_time": "运行时间", - "run": "运行", - "setup_incomplete": "完成“设置”选项卡中所需的步骤", "setup": "设置", + "setup_incomplete": "完成“设置”选项卡中所需的步骤", "slot": "板位{{slotName}}", + "start": "开始", "start_run": "开始运行", "start_step_time": "开始", "start_time": "开始时间", - "start": "开始", + "status": "状态", + "status_awaiting-recovery": "等待恢复", "status_awaiting-recovery-blocked-by-open-door": "暂停 - 门已打开", "status_awaiting-recovery-paused": "暂停", - "status_awaiting-recovery": "等待恢复", "status_blocked-by-open-door": "暂停 - 前门打开", "status_failed": "失败", "status_finishing": "结束中", @@ -142,9 +143,9 @@ "status_stop-requested": "请求停止", "status_stopped": "已取消", "status_succeeded": "已完成", - "status": "状态", "step": "步骤", "step_failed": "步骤失败", + "step_na": "步骤:不适用", "step_number": "步骤{{step_number}}:", "steps_total": "总计{{count}}步", "stored_labware_offset_data": "已储存适用于此协议的耗材校准数据", @@ -152,13 +153,13 @@ "temperature_not_available": "{{temperature_type}}: n/a", "thermocycler_error_tooltip": "模块遇到异常,请联系技术支持。", "total_elapsed_time": "总耗时", - "total_step_count_plural": "总计{{count}}步", "total_step_count": "总计{{count}}步", + "total_step_count_plural": "总计{{count}}步", "unable_to_determine_steps": "无法确定步骤", "view_analysis_error_details": "查看 错误详情", "view_current_step": "查看当前步骤", - "view_error_details": "查看错误详情", "view_error": "查看错误", + "view_error_details": "查看错误详情", "view_warning_details": "查看警告详情", "warning_details": "警告详情" } diff --git a/app/src/assets/localization/zh/shared.json b/app/src/assets/localization/zh/shared.json index 90b597b2820..694e7b80037 100644 --- a/app/src/assets/localization/zh/shared.json +++ b/app/src/assets/localization/zh/shared.json @@ -10,15 +10,16 @@ "change_protocol": "更改协议", "change_robot": "更换工作站", "clear_data": "清除数据", - "close_robot_door": "开始运行前请关闭工作站前门。", "close": "关闭", + "close_robot_door": "开始运行前请关闭工作站前门。", + "closed": "已关闭", + "confirm": "确认", "confirm_placement": "确认放置", "confirm_position": "确认位置", "confirm_values": "确认这些值", - "confirm": "确认", + "continue": "继续", "continue_activity": "继续活动", "continue_to_param": "继续设置参数", - "continue": "继续", "delete": "删除", "did_pipette_pick_up_tip": "移液器是否成功拾取吸头?", "disabled_cannot_connect": "无法连接到工作站", @@ -29,8 +30,8 @@ "drag_and_drop": "拖放或 浏览 您的文件", "empty": "空闲", "ending": "结束中", - "error_encountered": "遇到错误", "error": "错误", + "error_encountered": "遇到错误", "exit": "退出", "extension_mount": "扩展安装支架", "flow_complete": "{{flowName}}完成!", @@ -40,8 +41,8 @@ "instruments": "硬件", "loading": "加载中...", "next": "下一步", - "no_data": "无数据", "no": "否", + "no_data": "无数据", "none": "无", "not_used": "未使用", "off": "关闭", @@ -51,18 +52,18 @@ "proceed_to_setup": "继续设置", "protocol_run_general_error_msg": "无法在工作站上创建协议运行。", "reanalyze": "重新分析", - "refresh_list": "刷新列表", "refresh": "刷新", + "refresh_list": "刷新列表", "remember_my_selection_and_do_not_ask_again": "记住我的选择,不再询问", - "reset_all": "全部重置", "reset": "重置", + "reset_all": "全部重置", "restart": "重新启动", "resume": "继续", "return": "返回", "reverse": "按字母倒序排序", "robot_is_analyzing": "工作站正在分析", - "robot_is_busy_no_protocol_run_allowed": "此工作站正忙,无法运行此协议。转到工作站", "robot_is_busy": "工作站正忙", + "robot_is_busy_no_protocol_run_allowed": "此工作站正忙,无法运行此协议。转到工作站", "robot_is_reachable_but_not_responding": "此工作站的API服务器未能正确响应IP地址{{hostname}}处的请求", "robot_was_seen_but_is_unreachable": "最近看到此工作站,但当前无法访问IP地址{{hostname}}", "save": "保存", @@ -73,11 +74,11 @@ "starting": "启动中", "step": "步骤{{current}}/{{max}}", "stop": "停止", - "terminate_activity": "终止活动", "terminate": "终止远程活动", + "terminate_activity": "终止活动", "try_again": "重试", - "unknown_error": "发生未知错误", "unknown": "未知", + "unknown_error": "发生未知错误", "update": "更新", "view_latest_release_notes": "查看最新发布说明:", "yes": "是", diff --git a/app/src/assets/localization/zh/top_navigation.json b/app/src/assets/localization/zh/top_navigation.json index cb831731be9..79de9180bb8 100644 --- a/app/src/assets/localization/zh/top_navigation.json +++ b/app/src/assets/localization/zh/top_navigation.json @@ -1,20 +1,25 @@ { - "all_protocols": "全部协议", + "app_settings": "APP设置", "attached_pipettes_do_not_match": "安装的移液器与加载的协议中指定的移液器不匹配", "calibrate_deck_to_proceed": "校准甲板以继续", + "calibration_dashboard": "校准面板", "deck_setup": "甲板设置", + "device": "设备", "devices": "设备", "instruments": "硬件", "labware": "耗材", "modules": "模块", - "pipettes_not_calibrated": "请校准加载的协议中指定的所有移液器以继续", "pipettes": "移液器", + "pipettes_not_calibrated": "请校准加载的协议中指定的所有移液器以继续", "please_connect_to_a_robot": "请连接到工作站以继续", "please_load_a_protocol": "请加载协议以继续", + "protocol_details": "协议详细信息", "protocol_runs": "协议运行", + "protocol_timeline": "协议时间线", "protocols": "协议", "quick_transfer": "快速移液", "robot_settings": "工作站设置", "run": "运行", + "run_details": "运行详细信息", "settings": "设置" } From 18690a646aa9ffdb8c750967dc5aa7bd16845df1 Mon Sep 17 00:00:00 2001 From: Seth Foster Date: Thu, 9 Jan 2025 15:10:42 -0500 Subject: [PATCH 012/150] chore(build): update to actions/*-artifact v4 (#17231) Came up for PD ( #17229 ), probably will come up here too. Let's get ahead of it. If the build passes this should be fine. --- .github/workflows/app-test-build-deploy.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/app-test-build-deploy.yaml b/.github/workflows/app-test-build-deploy.yaml index da43d601115..873bfe65c07 100644 --- a/.github/workflows/app-test-build-deploy.yaml +++ b/.github/workflows/app-test-build-deploy.yaml @@ -370,7 +370,7 @@ jobs: - name: 'upload github artifact' if: matrix.target == 'desktop' - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: 'opentrons-${{matrix.variant}}-${{ matrix.os }}' path: app-shell/dist/publish @@ -392,7 +392,7 @@ jobs: if: contains(fromJSON(needs.determine-build-type.outputs.variants), 'release') || contains(fromJSON(needs.determine-build-type.outputs.variants), 'internal-release') steps: - name: 'download run app builds' - uses: 'actions/download-artifact@v3' + uses: 'actions/download-artifact@v4' with: path: ./artifacts - name: 'separate release and internal-release artifacts' From cf940fe03745d73e3883ae0e5278574b8c004a14 Mon Sep 17 00:00:00 2001 From: Jamey Huffnagle Date: Fri, 10 Jan 2025 08:35:14 -0700 Subject: [PATCH 013/150] fix(app): fix terminal banner render state (#17240) Closes RQA-3840 --- .../RunHeaderBannerContainer/TerminalRunBannerContainer.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderBannerContainer/TerminalRunBannerContainer.tsx b/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderBannerContainer/TerminalRunBannerContainer.tsx index c6428c2f385..ec70dcdf189 100644 --- a/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderBannerContainer/TerminalRunBannerContainer.tsx +++ b/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderBannerContainer/TerminalRunBannerContainer.tsx @@ -40,12 +40,15 @@ export function useTerminalRunBannerContainer({ const completedWithErrors = (commandErrorList != null && commandErrorList.length > 0) || highestPriorityError != null + // TODO(jh, 01-10-25): Adding /commandErrors to notifications accomplishes the below with reduced latency. + const completedWithNoErrors = + commandErrorList != null && commandErrorList.length === 0 const showSuccessBanner = runStatus === RUN_STATUS_SUCCEEDED && isRunCurrent && !isResetRunLoading && - !completedWithErrors + completedWithNoErrors // TODO(jh, 08-14-24): Ideally, the backend never returns the "user cancelled a run" error and // cancelledWithoutRecovery becomes unnecessary. From b13cd27329c8f70a72bbc616a9cd70b451c6302b Mon Sep 17 00:00:00 2001 From: Jamey Huffnagle Date: Fri, 10 Jan 2025 09:11:35 -0700 Subject: [PATCH 014/150] fix(app): Fix gripper recovery loop (#17241) Closes RQA-3841 --- .../ErrorRecoveryFlows/shared/GripperIsHoldingLabware.tsx | 2 +- .../shared/__tests__/GripperIsHoldingLabware.test.tsx | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/organisms/ErrorRecoveryFlows/shared/GripperIsHoldingLabware.tsx b/app/src/organisms/ErrorRecoveryFlows/shared/GripperIsHoldingLabware.tsx index 6f4157bc909..d198dcc8dac 100644 --- a/app/src/organisms/ErrorRecoveryFlows/shared/GripperIsHoldingLabware.tsx +++ b/app/src/organisms/ErrorRecoveryFlows/shared/GripperIsHoldingLabware.tsx @@ -55,6 +55,7 @@ export function GripperIsHoldingLabware({ // after the user has extricated the labware from the gripper jaws. void handleMotionRouting(true) .then(() => homeExceptPlungers()) + .finally(() => handleMotionRouting(false)) .then(() => { switch (selectedRecoveryOption) { case MANUAL_MOVE_AND_SKIP.ROUTE: @@ -73,7 +74,6 @@ export function GripperIsHoldingLabware({ } } }) - .finally(() => handleMotionRouting(false)) } const primaryOnClick = (): void => { diff --git a/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/GripperIsHoldingLabware.test.tsx b/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/GripperIsHoldingLabware.test.tsx index 3279bdfea7c..875c79fe09c 100644 --- a/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/GripperIsHoldingLabware.test.tsx +++ b/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/GripperIsHoldingLabware.test.tsx @@ -96,16 +96,16 @@ describe('GripperIsHoldingLabware', () => { expect(mockHomeExceptPlungers).toHaveBeenCalled() }) + await waitFor(() => { + expect(mockHandleMotionRouting).toHaveBeenCalledWith(false) + }) + await waitFor(() => { expect(mockProceedToRouteAndStep).toHaveBeenCalledWith( RECOVERY_MAP.MANUAL_MOVE_AND_SKIP.ROUTE, RECOVERY_MAP.MANUAL_MOVE_AND_SKIP.STEPS.MANUAL_MOVE ) }) - - await waitFor(() => { - expect(mockHandleMotionRouting).toHaveBeenCalledWith(false) - }) }) it(`proceeds to the correct step when the no option is clicked for ${RECOVERY_MAP.MANUAL_REPLACE_AND_RETRY.ROUTE}`, async () => { From 02b6a422e6fd89e9bb6280142e758dad9c342605 Mon Sep 17 00:00:00 2001 From: Ryan Howard Date: Fri, 10 Jan 2025 12:05:18 -0500 Subject: [PATCH 015/150] chore(hardware): Add some logging around what I think is causing some can errors (#17117) # Overview We occasionally get some ABR issues where the can bus says it's not receiving ACKs or that a move group says it didn't get all expected nodes, but reports [] as the missing nodes. I think the second bug is because we're checking with `if not self._moves[group_id]` instead of checking `if len(self._moves[group_id]) == 0:` Which should be equivalent but I think there may be some python cleanup bug that reports the list as true due to a remnant that hasn't been garbage collected yet. ## Test Plan and Hands on Testing ## Changelog ## Review requests ## Risk assessment --- .../opentrons_hardware/drivers/can_bus/can_messenger.py | 6 ++++-- .../hardware_control/move_group_runner.py | 4 ++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/hardware/opentrons_hardware/drivers/can_bus/can_messenger.py b/hardware/opentrons_hardware/drivers/can_bus/can_messenger.py index c0b49e376bb..0184c5e5c1f 100644 --- a/hardware/opentrons_hardware/drivers/can_bus/can_messenger.py +++ b/hardware/opentrons_hardware/drivers/can_bus/can_messenger.py @@ -152,7 +152,7 @@ async def send_and_verify_recieved(self) -> ErrorCode: ) except asyncio.TimeoutError: log.error( - f"Message did not receive ack for message index {self._message.payload.message_index}" + f"Message did not receive ack for message index {self._message.payload.message_index} Missing node(s) {self._expected_nodes}" ) return ErrorCode.timeout finally: @@ -278,12 +278,14 @@ async def _ensure_send( exclusive: bool = False, ) -> ErrorCode: if len(expected_nodes) == 0: - log.warning("Expected Nodes should have been specified") if node_id == NodeId.broadcast: if not expected_nodes: expected_nodes = list(self._known_nodes) else: expected_nodes = [node_id] + log.warning( + f"Expected Nodes should have been specified, Setting expected nodes to {expected_nodes}" + ) listener = AcknowledgeListener( can_messenger=self, diff --git a/hardware/opentrons_hardware/hardware_control/move_group_runner.py b/hardware/opentrons_hardware/hardware_control/move_group_runner.py index 1b7baf61d6d..9d9ff583ec7 100644 --- a/hardware/opentrons_hardware/hardware_control/move_group_runner.py +++ b/hardware/opentrons_hardware/hardware_control/move_group_runner.py @@ -469,6 +469,10 @@ def _remove_move_group( f"Received completion for {node_id} group {group_id} seq {seq_id}" f", which {'is' if in_group else 'isn''t'} in group" ) + if self._moves[group_id] and len(self._moves[group_id]) == 0: + log.error( + f"Python bug proven if check {bool(not self._moves[group_id])} len check {len(self._moves[group_id]) == 0}" + ) if not self._moves[group_id]: log.debug(f"Move group {group_id+self._start_at_index} has completed.") self._event.set() From 3a46ebe7dd219dff386f980255283d2db0ecb59c Mon Sep 17 00:00:00 2001 From: Jamey Huffnagle Date: Fri, 10 Jan 2025 10:15:52 -0700 Subject: [PATCH 016/150] fix(app): Fix persistent "run in progress" settings banner after run cancel (#17235) Closes RQA-3838 --- .../local-resources/commands/utils/index.ts | 1 - .../lastRunCommandPromptedErrorRecovery.ts | 13 -------- .../TerminalRunBannerContainer.tsx | 8 ++--- .../hooks/useRunHeaderDropTip.ts | 32 +++---------------- .../ProtocolRunHeader/hooks/useRunErrors.ts | 6 +--- app/src/pages/ODD/RunSummary/index.tsx | 18 ++--------- 6 files changed, 9 insertions(+), 69 deletions(-) delete mode 100644 app/src/local-resources/commands/utils/lastRunCommandPromptedErrorRecovery.ts diff --git a/app/src/local-resources/commands/utils/index.ts b/app/src/local-resources/commands/utils/index.ts index cc4e9c2579a..7aa84d14de5 100644 --- a/app/src/local-resources/commands/utils/index.ts +++ b/app/src/local-resources/commands/utils/index.ts @@ -1,2 +1 @@ export * from './getCommandTextData' -export * from './lastRunCommandPromptedErrorRecovery' diff --git a/app/src/local-resources/commands/utils/lastRunCommandPromptedErrorRecovery.ts b/app/src/local-resources/commands/utils/lastRunCommandPromptedErrorRecovery.ts deleted file mode 100644 index dd07756ef43..00000000000 --- a/app/src/local-resources/commands/utils/lastRunCommandPromptedErrorRecovery.ts +++ /dev/null @@ -1,13 +0,0 @@ -import type { RunCommandSummary } from '@opentrons/api-client' - -// Whether the last run protocol command prompted Error Recovery. -export function lastRunCommandPromptedErrorRecovery( - summary: RunCommandSummary[] -): boolean { - const lastProtocolCommand = summary.findLast( - command => command.intent !== 'fixit' && command.error != null - ) - - // All recoverable protocol commands have defined errors. - return lastProtocolCommand?.error?.isDefined ?? false -} diff --git a/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderBannerContainer/TerminalRunBannerContainer.tsx b/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderBannerContainer/TerminalRunBannerContainer.tsx index ec70dcdf189..4148a791611 100644 --- a/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderBannerContainer/TerminalRunBannerContainer.tsx +++ b/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderBannerContainer/TerminalRunBannerContainer.tsx @@ -121,14 +121,10 @@ function ProtocolRunErrorBanner({ const { closeCurrentRun } = useCloseCurrentRun() - const { highestPriorityError, commandErrorList } = runErrors + const { highestPriorityError } = runErrors const handleFailedRunClick = (): void => { - // TODO(jh, 08-15-24): Revisit the control flow here here after - // commandErrorList may be fetched for a non-current run. - if (commandErrorList == null) { - closeCurrentRun() - } + closeCurrentRun() runHeaderModalContainerUtils.runFailedModalUtils.toggleModal() } diff --git a/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderModalContainer/hooks/useRunHeaderDropTip.ts b/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderModalContainer/hooks/useRunHeaderDropTip.ts index 82d9c30c84b..0ff96a562df 100644 --- a/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderModalContainer/hooks/useRunHeaderDropTip.ts +++ b/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderModalContainer/hooks/useRunHeaderDropTip.ts @@ -5,13 +5,8 @@ import { FLEX_ROBOT_TYPE, OT2_ROBOT_TYPE } from '@opentrons/shared-data' import { useDropTipWizardFlows } from '/app/organisms/DropTipWizardFlows' import { useProtocolDropTipModal } from '../modals' -import { - useCloseCurrentRun, - useCurrentRunCommands, - useIsRunCurrent, -} from '/app/resources/runs' +import { useCloseCurrentRun, useIsRunCurrent } from '/app/resources/runs' import { isTerminalRunStatus } from '../../utils' -import { lastRunCommandPromptedErrorRecovery } from '/app/local-resources/commands' import { useTipAttachmentStatus } from '/app/resources/instruments' import type { RobotType } from '@opentrons/shared-data' @@ -104,35 +99,17 @@ export function useRunHeaderDropTip({ : { showDTWiz: false, dtWizProps: null } } - const runSummaryNoFixit = useCurrentRunCommands( - { - includeFixitCommands: false, - pageLength: 1, - }, - { enabled: isTerminalRunStatus(runStatus) } - ) // Manage tip checking useEffect(() => { // If a user begins a new run without navigating away from the run page, reset tip status. if (robotType === FLEX_ROBOT_TYPE) { if (runStatus === RUN_STATUS_IDLE) { resetTipStatus() - } - // Only determine tip status when necessary as this can be an expensive operation. Error Recovery handles tips, so don't - // have to do it here if done during Error Recovery. - else if ( - runSummaryNoFixit != null && - runSummaryNoFixit.length > 0 && - !lastRunCommandPromptedErrorRecovery(runSummaryNoFixit) && - isTerminalRunStatus(runStatus) - ) { + } else if (isRunCurrent && isTerminalRunStatus(runStatus)) { void determineTipStatus() } } - }, [runStatus, robotType, runSummaryNoFixit]) - - // TODO(jh, 08-15-24): The enteredER condition is a hack, because errorCommands are only returned when a run is current. - // Ideally the run should not need to be current to view errorCommands. + }, [runStatus, robotType, isRunCurrent]) // If the run terminates with a "stopped" status, close the run if no tips are attached after running tip check at least once. // This marks the robot as "not busy" if drop tip CTAs are unnecessary. @@ -140,8 +117,7 @@ export function useRunHeaderDropTip({ if ( runStatus === RUN_STATUS_STOPPED && isRunCurrent && - (initialPipettesWithTipsCount === 0 || robotType === OT2_ROBOT_TYPE) && - !enteredER + (initialPipettesWithTipsCount === 0 || robotType === OT2_ROBOT_TYPE) ) { closeCurrentRun() } diff --git a/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/hooks/useRunErrors.ts b/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/hooks/useRunErrors.ts index 4d66b367a0e..593c435029b 100644 --- a/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/hooks/useRunErrors.ts +++ b/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/hooks/useRunErrors.ts @@ -1,7 +1,6 @@ import { useRunCommandErrors } from '@opentrons/react-api-client' import { isTerminalRunStatus } from '../utils' -import { useMostRecentRunId } from '/app/resources/runs' import { getHighestPriorityError } from '/app/transformations/runs' import type { RunStatus, Run } from '@opentrons/api-client' @@ -27,14 +26,11 @@ export function useRunErrors({ runRecord, runStatus, }: UseRunErrorsProps): UseRunErrorsResult { - const mostRecentRunId = useMostRecentRunId() - const isMostRecentRun = mostRecentRunId === runId - const { data: commandErrorList } = useRunCommandErrors( runId, { cursor: 0, pageLength: ALL_COMMANDS_PAGE_LENGTH }, { - enabled: isTerminalRunStatus(runStatus) && isMostRecentRun, + enabled: isTerminalRunStatus(runStatus), } ) diff --git a/app/src/pages/ODD/RunSummary/index.tsx b/app/src/pages/ODD/RunSummary/index.tsx index 86aec6aaf87..9d1f73d7e3b 100644 --- a/app/src/pages/ODD/RunSummary/index.tsx +++ b/app/src/pages/ODD/RunSummary/index.tsx @@ -65,10 +65,8 @@ import { useRunCreatedAtTimestamp, useCloseCurrentRun, EMPTY_TIMESTAMP, - useCurrentRunCommands, } from '/app/resources/runs' import { handleTipsAttachedModal } from '/app/organisms/DropTipWizardFlows' -import { lastRunCommandPromptedErrorRecovery } from '/app/local-resources/commands' import { useTipAttachmentStatus } from '/app/resources/instruments' import type { IconName } from '@opentrons/components' @@ -236,21 +234,9 @@ export function RunSummary(): JSX.Element { runRecord: runRecord ?? null, }) - // Determine tip status on initial render only. Error Recovery always handles tip status, so don't show it twice. - const runSummaryNoFixit = useCurrentRunCommands({ - includeFixitCommands: false, - pageLength: 1, - }) useEffect(() => { - if ( - isRunCurrent && - runSummaryNoFixit != null && - runSummaryNoFixit.length > 0 && - !lastRunCommandPromptedErrorRecovery(runSummaryNoFixit) - ) { - void determineTipStatus() - } - }, [runSummaryNoFixit, isRunCurrent]) + void determineTipStatus() + }, []) const returnToQuickTransfer = (): void => { closeCurrentRunIfValid(() => { From ec494101a6aff31784a0cdbbab082d43d0962bcc Mon Sep 17 00:00:00 2001 From: Jamey Huffnagle Date: Fri, 10 Jan 2025 13:37:56 -0700 Subject: [PATCH 017/150] fix(app): Inject labware definitions into Error Recovery (#17248) Closes RQA-3814 --- .../RunHeaderModalContainer.tsx | 1 + .../ErrorRecoveryFlows/__fixtures__/index.ts | 1 + .../__tests__/ErrorRecoveryFlows.test.tsx | 25 ++++++++- .../hooks/__tests__/useDeckMapUtils.test.ts | 24 +++------ .../hooks/useDeckMapUtils.ts | 52 ++++++++---------- .../ErrorRecoveryFlows/hooks/useERUtils.ts | 11 ++-- .../organisms/ErrorRecoveryFlows/index.tsx | 53 +++++++++++++------ .../__tests__/RunningProtocol.test.tsx | 2 + app/src/pages/ODD/RunningProtocol/index.tsx | 6 ++- .../useRunLoadedLabwareDefinitionsByUri.ts | 24 +++++---- 10 files changed, 116 insertions(+), 83 deletions(-) diff --git a/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderModalContainer/RunHeaderModalContainer.tsx b/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderModalContainer/RunHeaderModalContainer.tsx index 0c306339f69..8486296122b 100644 --- a/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderModalContainer/RunHeaderModalContainer.tsx +++ b/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderModalContainer/RunHeaderModalContainer.tsx @@ -52,6 +52,7 @@ export function RunHeaderModalContainer( runStatus={runStatus} runId={runId} unvalidatedFailedCommand={recoveryModalUtils.failedCommand} + runLwDefsByUri={recoveryModalUtils.runLwDefsByUri} protocolAnalysis={robotProtocolAnalysis} /> ) : null} diff --git a/app/src/organisms/ErrorRecoveryFlows/__fixtures__/index.ts b/app/src/organisms/ErrorRecoveryFlows/__fixtures__/index.ts index 1a815b99c1e..aaf0b89e062 100644 --- a/app/src/organisms/ErrorRecoveryFlows/__fixtures__/index.ts +++ b/app/src/organisms/ErrorRecoveryFlows/__fixtures__/index.ts @@ -58,6 +58,7 @@ export const mockRecoveryContentProps: RecoveryContentProps = { byRunRecord: mockFailedCommand, byAnalysis: mockFailedCommand, }, + runLwDefsByUri: {} as any, errorKind: 'GENERAL_ERROR', robotType: FLEX_ROBOT_TYPE, runId: 'MOCK_RUN_ID', diff --git a/app/src/organisms/ErrorRecoveryFlows/__tests__/ErrorRecoveryFlows.test.tsx b/app/src/organisms/ErrorRecoveryFlows/__tests__/ErrorRecoveryFlows.test.tsx index 53bc8c15a8b..47f1668af87 100644 --- a/app/src/organisms/ErrorRecoveryFlows/__tests__/ErrorRecoveryFlows.test.tsx +++ b/app/src/organisms/ErrorRecoveryFlows/__tests__/ErrorRecoveryFlows.test.tsx @@ -45,6 +45,7 @@ vi.mock('react-redux', async () => { describe('useErrorRecoveryFlows', () => { beforeEach(() => { vi.mocked(useCurrentlyRecoveringFrom).mockReturnValue('mockCommand' as any) + vi.mocked(useRunLoadedLabwareDefinitionsByUri).mockReturnValue({}) }) it('should have initial state of isERActive as false', () => { @@ -89,12 +90,32 @@ describe('useErrorRecoveryFlows', () => { expect(result.current.failedCommand).toEqual('mockCommand') }) + it("should return the run's labware definitions", () => { + const { result } = renderHook(() => + useErrorRecoveryFlows('MOCK_ID', RUN_STATUS_RUNNING) + ) + + expect(result.current.failedCommand).toEqual('mockCommand') + }) + it(`should return isERActive false if the run status is ${RUN_STATUS_STOP_REQUESTED} before seeing ${RUN_STATUS_AWAITING_RECOVERY}`, () => { const { result } = renderHook(() => useErrorRecoveryFlows('MOCK_ID', RUN_STATUS_STOP_REQUESTED) ) - expect(result.current.isERActive).toEqual(false) + expect(result.current.runLwDefsByUri).toEqual({}) + }) + + it('should not return isERActive if the run labware defintions is null', () => { + vi.mocked(useRunLoadedLabwareDefinitionsByUri).mockReturnValue(null) + + const { result } = renderHook( + runStatus => useErrorRecoveryFlows('MOCK_ID', runStatus), + { + initialProps: RUN_STATUS_AWAITING_RECOVERY, + } + ) + expect(result.current.isERActive).toBe(false) }) it('should set hasSeenAwaitingRecovery to true when runStatus is RUN_STATUS_AWAITING_RECOVERY', () => { @@ -143,6 +164,7 @@ describe('ErrorRecoveryFlows', () => { unvalidatedFailedCommand: mockFailedCommand, runId: 'MOCK_RUN_ID', protocolAnalysis: null, + runLwDefsByUri: {}, } vi.mocked(ErrorRecoveryWizard).mockReturnValue(
MOCK WIZARD
) vi.mocked(RecoverySplash).mockReturnValue(
MOCK RUN PAUSED SPLASH
) @@ -167,7 +189,6 @@ describe('ErrorRecoveryFlows', () => { intent: 'recovering', showTakeover: false, }) - vi.mocked(useRunLoadedLabwareDefinitionsByUri).mockReturnValue({}) }) it('renders the wizard when showERWizard is true', () => { diff --git a/app/src/organisms/ErrorRecoveryFlows/hooks/__tests__/useDeckMapUtils.test.ts b/app/src/organisms/ErrorRecoveryFlows/hooks/__tests__/useDeckMapUtils.test.ts index 1a6d07ba634..5b6855a9e7d 100644 --- a/app/src/organisms/ErrorRecoveryFlows/hooks/__tests__/useDeckMapUtils.test.ts +++ b/app/src/organisms/ErrorRecoveryFlows/hooks/__tests__/useDeckMapUtils.test.ts @@ -198,17 +198,7 @@ describe('getRunCurrentModulesInfo', () => { const result = getRunCurrentModulesInfo({ runRecord: null as any, deckDef: mockDeckDef, - labwareDefinitionsByUri: {}, - }) - - expect(result).toEqual([]) - }) - - it('should return an empty array if protocolAnalysis is null', () => { - const result = getRunCurrentModulesInfo({ - runRecord: mockRunRecord, - deckDef: mockDeckDef, - labwareDefinitionsByUri: null, + runLwDefsByUri: {}, }) expect(result).toEqual([]) @@ -219,7 +209,7 @@ describe('getRunCurrentModulesInfo', () => { const result = getRunCurrentModulesInfo({ runRecord: mockRunRecord, deckDef: mockDeckDef, - labwareDefinitionsByUri: { + runLwDefsByUri: { 'opentrons/opentrons_96_pcr_adapter/1': 'MOCK_LW_DEF', } as any, }) @@ -242,7 +232,7 @@ describe('getRunCurrentModulesInfo', () => { data: { modules: [mockModule], labware: [] }, }, deckDef: mockDeckDef, - labwareDefinitionsByUri: {}, + runLwDefsByUri: {}, }) expect(result).toEqual([ { @@ -261,7 +251,7 @@ describe('getRunCurrentModulesInfo', () => { const result = getRunCurrentModulesInfo({ runRecord: mockRunRecord, deckDef: mockDeckDef, - labwareDefinitionsByUri: null, + runLwDefsByUri: {}, }) expect(result).toEqual([]) }) @@ -286,7 +276,7 @@ describe('getRunCurrentLabwareInfo', () => { it('should return an empty array if runRecord is null', () => { const result = getRunCurrentLabwareInfo({ runRecord: undefined, - labwareDefinitionsByUri: {} as any, + runLwDefsByUri: {} as any, }) expect(result).toEqual([]) @@ -295,7 +285,7 @@ describe('getRunCurrentLabwareInfo', () => { it('should return an empty array if protocolAnalysis is null', () => { const result = getRunCurrentLabwareInfo({ runRecord: { data: { labware: [] } } as any, - labwareDefinitionsByUri: null, + runLwDefsByUri: {}, }) expect(result).toEqual([]) @@ -309,7 +299,7 @@ describe('getRunCurrentLabwareInfo', () => { const result = getRunCurrentLabwareInfo({ runRecord: { data: { labware: [mockPickUpTipLwSlotName] } } as any, - labwareDefinitionsByUri: { + runLwDefsByUri: { [mockPickUpTipLabware.definitionUri]: mockLabwareDef, }, }) diff --git a/app/src/organisms/ErrorRecoveryFlows/hooks/useDeckMapUtils.ts b/app/src/organisms/ErrorRecoveryFlows/hooks/useDeckMapUtils.ts index 458747f5b07..22dd645835a 100644 --- a/app/src/organisms/ErrorRecoveryFlows/hooks/useDeckMapUtils.ts +++ b/app/src/organisms/ErrorRecoveryFlows/hooks/useDeckMapUtils.ts @@ -42,7 +42,7 @@ interface UseDeckMapUtilsProps { runId: ErrorRecoveryFlowsProps['runId'] protocolAnalysis: ErrorRecoveryFlowsProps['protocolAnalysis'] failedLabwareUtils: UseFailedLabwareUtilsResult - labwareDefinitionsByUri: ERUtilsProps['labwareDefinitionsByUri'] + runLwDefsByUri: ERUtilsProps['runLwDefsByUri'] runRecord: Run | undefined } @@ -65,7 +65,7 @@ export function useDeckMapUtils({ runRecord, runId, failedLabwareUtils, - labwareDefinitionsByUri, + runLwDefsByUri, }: UseDeckMapUtilsProps): UseDeckMapUtilsResult { const robotType = protocolAnalysis?.robotType ?? OT2_ROBOT_TYPE const deckConfig = getSimplestDeckConfigForProtocol(protocolAnalysis) @@ -78,9 +78,9 @@ export function useDeckMapUtils({ getRunCurrentModulesInfo({ runRecord, deckDef, - labwareDefinitionsByUri, + runLwDefsByUri, }), - [runRecord, deckDef, labwareDefinitionsByUri] + [runRecord, deckDef, runLwDefsByUri] ) const runCurrentModules = useMemo( @@ -94,8 +94,8 @@ export function useDeckMapUtils({ ) const currentLabwareInfo = useMemo( - () => getRunCurrentLabwareInfo({ runRecord, labwareDefinitionsByUri }), - [runRecord, labwareDefinitionsByUri] + () => getRunCurrentLabwareInfo({ runRecord, runLwDefsByUri }), + [runRecord, runLwDefsByUri] ) const { updatedModules, remainingLabware } = useMemo( @@ -114,32 +114,24 @@ export function useDeckMapUtils({ ) const movedLabwareDef = - labwareDefinitionsByUri != null && failedLabwareUtils.failedLabware != null - ? labwareDefinitionsByUri[failedLabwareUtils.failedLabware.definitionUri] + runLwDefsByUri != null && failedLabwareUtils.failedLabware != null + ? runLwDefsByUri[failedLabwareUtils.failedLabware.definitionUri] : null const moduleRenderInfo = useMemo( () => - runRecord != null && labwareDefinitionsByUri != null - ? getRunModuleRenderInfo( - runRecord.data, - deckDef, - labwareDefinitionsByUri - ) + runRecord != null && runLwDefsByUri != null + ? getRunModuleRenderInfo(runRecord.data, deckDef, runLwDefsByUri) : [], - [deckDef, labwareDefinitionsByUri, runRecord] + [deckDef, runLwDefsByUri, runRecord] ) const labwareRenderInfo = useMemo( () => - runRecord != null && labwareDefinitionsByUri != null - ? getRunLabwareRenderInfo( - runRecord.data, - labwareDefinitionsByUri, - deckDef - ) + runRecord != null && runLwDefsByUri != null + ? getRunLabwareRenderInfo(runRecord.data, runLwDefsByUri, deckDef) : [], - [deckDef, labwareDefinitionsByUri, runRecord] + [deckDef, runLwDefsByUri, runRecord] ) return { @@ -258,13 +250,13 @@ interface RunCurrentModuleInfo { export const getRunCurrentModulesInfo = ({ runRecord, deckDef, - labwareDefinitionsByUri, + runLwDefsByUri, }: { runRecord: UseDeckMapUtilsProps['runRecord'] deckDef: DeckDefinition - labwareDefinitionsByUri?: LabwareDefinitionsByUri | null + runLwDefsByUri: UseDeckMapUtilsProps['runLwDefsByUri'] }): RunCurrentModuleInfo[] => { - if (runRecord == null || labwareDefinitionsByUri == null) { + if (runRecord == null) { return [] } else { return runRecord.data.modules.reduce( @@ -281,7 +273,7 @@ export const getRunCurrentModulesInfo = ({ const nestedLabwareDef = nestedLabware != null - ? labwareDefinitionsByUri[nestedLabware.definitionUri] + ? runLwDefsByUri[nestedLabware.definitionUri] : null const slotPosition = getPositionFromSlotId( @@ -325,12 +317,12 @@ interface RunCurrentLabwareInfo { // Derive the labware info necessary to render labware on the deck. export function getRunCurrentLabwareInfo({ runRecord, - labwareDefinitionsByUri, + runLwDefsByUri, }: { runRecord: UseDeckMapUtilsProps['runRecord'] - labwareDefinitionsByUri?: LabwareDefinitionsByUri | null + runLwDefsByUri: UseDeckMapUtilsProps['runLwDefsByUri'] }): RunCurrentLabwareInfo[] { - if (runRecord == null || labwareDefinitionsByUri == null) { + if (runRecord == null) { return [] } else { const allLabware = runRecord.data.labware.reduce( @@ -341,7 +333,7 @@ export function getRunCurrentLabwareInfo({ runRecord, true ) // Exclude modules since handled separately. - const labwareDef = getLabwareDefinition(lw, labwareDefinitionsByUri) + const labwareDef = getLabwareDefinition(lw, runLwDefsByUri) if (slotName == null || labwareLocation == null) { return acc diff --git a/app/src/organisms/ErrorRecoveryFlows/hooks/useERUtils.ts b/app/src/organisms/ErrorRecoveryFlows/hooks/useERUtils.ts index 72e9bb481bc..4bd4a93643f 100644 --- a/app/src/organisms/ErrorRecoveryFlows/hooks/useERUtils.ts +++ b/app/src/organisms/ErrorRecoveryFlows/hooks/useERUtils.ts @@ -22,11 +22,7 @@ import { useCleanupRecoveryState } from './useCleanupRecoveryState' import { useFailedPipetteUtils } from './useFailedPipetteUtils' import { getRunningStepCountsFrom } from '/app/resources/protocols' -import type { - LabwareDefinition2, - LabwareDefinitionsByUri, - RobotType, -} from '@opentrons/shared-data' +import type { LabwareDefinition2, RobotType } from '@opentrons/shared-data' import type { IRecoveryMap, RouteStep, RecoveryRoute } from '../types' import type { ErrorRecoveryFlowsProps } from '..' import type { UseRouteUpdateActionsResult } from './useRouteUpdateActions' @@ -54,7 +50,6 @@ export type ERUtilsProps = Omit & { failedCommand: ReturnType isActiveUser: UseRecoveryTakeoverResult['isActiveUser'] allRunDefs: LabwareDefinition2[] - labwareDefinitionsByUri: LabwareDefinitionsByUri | null } export interface ERUtilsResults { @@ -90,7 +85,7 @@ export function useERUtils({ isActiveUser, allRunDefs, unvalidatedFailedCommand, - labwareDefinitionsByUri, + runLwDefsByUri, }: ERUtilsProps): ERUtilsResults { const { data: attachedInstruments } = useInstrumentsQuery() const { data: runRecord } = useNotifyRunQuery(runId) @@ -185,7 +180,7 @@ export function useERUtils({ runRecord, protocolAnalysis, failedLabwareUtils, - labwareDefinitionsByUri, + runLwDefsByUri, }) const recoveryActionMutationUtils = useRecoveryActionMutation( diff --git a/app/src/organisms/ErrorRecoveryFlows/index.tsx b/app/src/organisms/ErrorRecoveryFlows/index.tsx index 84938e2db77..24834c86305 100644 --- a/app/src/organisms/ErrorRecoveryFlows/index.tsx +++ b/app/src/organisms/ErrorRecoveryFlows/index.tsx @@ -28,11 +28,12 @@ import { useRecoveryTakeover, useRetainedFailedCommandBySource, } from './hooks' +import { useRunLoadedLabwareDefinitionsByUri } from '/app/resources/runs' import type { RunStatus } from '@opentrons/api-client' import type { CompletedProtocolAnalysis } from '@opentrons/shared-data' import type { FailedCommand } from './types' -import { useRunLoadedLabwareDefinitionsByUri } from '/app/resources/runs' +import type { RunLoadedLabwareDefinitionsByUri } from '/app/resources/runs' const VALID_ER_RUN_STATUSES: RunStatus[] = [ RUN_STATUS_AWAITING_RECOVERY, @@ -53,10 +54,24 @@ const INVALID_ER_RUN_STATUSES: RunStatus[] = [ RUN_STATUS_IDLE, ] -export interface UseErrorRecoveryResult { +interface UseErrorRecoveryResultBase { isERActive: boolean failedCommand: FailedCommand | null + runLwDefsByUri: ReturnType +} +export interface UseErrorRecoveryActiveResult + extends UseErrorRecoveryResultBase { + isERActive: true + failedCommand: FailedCommand + runLwDefsByUri: RunLoadedLabwareDefinitionsByUri +} +export interface UseErrorRecoveryInactiveResult + extends UseErrorRecoveryResultBase { + isERActive: false } +export type UseErrorRecoveryResult = + | UseErrorRecoveryInactiveResult + | UseErrorRecoveryActiveResult export function useErrorRecoveryFlows( runId: string, @@ -64,6 +79,7 @@ export function useErrorRecoveryFlows( ): UseErrorRecoveryResult { const [isERActive, setIsERActive] = useState(false) const failedCommand = useCurrentlyRecoveringFrom(runId, runStatus) + const runLwDefsByUri = useRunLoadedLabwareDefinitionsByUri(runId) // The complexity of this logic exists to persist Error Recovery screens past the server's definition of Error Recovery. // Ex, show a "cancelling run" modal in Error Recovery flows despite the robot no longer being in a recoverable state. @@ -85,8 +101,7 @@ export function useErrorRecoveryFlows( if (runStatus != null) { const isAwaitingRecovery = VALID_ER_RUN_STATUSES.includes(runStatus) && - runStatus !== RUN_STATUS_STOP_REQUESTED && - failedCommand != null // Prevents one render cycle of an unknown failed command. + runStatus !== RUN_STATUS_STOP_REQUESTED if (isAwaitingRecovery) { setIsERActive(isValidERStatus(runStatus, true)) @@ -96,10 +111,14 @@ export function useErrorRecoveryFlows( } }, [runStatus, failedCommand]) - return { - isERActive, - failedCommand, - } + // Gate ER rendering on data derived from key network requests. + return isERActive && failedCommand != null && runLwDefsByUri != null + ? { + isERActive: true, + failedCommand, + runLwDefsByUri, + } + : { isERActive: false, failedCommand, runLwDefsByUri } } export interface ErrorRecoveryFlowsProps { @@ -109,14 +128,20 @@ export interface ErrorRecoveryFlowsProps { * information derived from the failed command from the run record even if there is no matching command in protocol analysis. * Using a failed command that is not matched to a protocol analysis command is unsafe in most circumstances (ie, in * non-generic recovery flows. Prefer using failedCommandBySource in most circumstances. */ - unvalidatedFailedCommand: FailedCommand | null + unvalidatedFailedCommand: UseErrorRecoveryActiveResult['failedCommand'] + runLwDefsByUri: UseErrorRecoveryActiveResult['runLwDefsByUri'] protocolAnalysis: CompletedProtocolAnalysis | null } export function ErrorRecoveryFlows( props: ErrorRecoveryFlowsProps ): JSX.Element | null { - const { protocolAnalysis, runStatus, unvalidatedFailedCommand, runId } = props + const { + protocolAnalysis, + runStatus, + unvalidatedFailedCommand, + runLwDefsByUri, + } = props const failedCommandBySource = useRetainedFailedCommandBySource( unvalidatedFailedCommand, @@ -128,11 +153,7 @@ export function ErrorRecoveryFlows( const robotType = protocolAnalysis?.robotType ?? OT2_ROBOT_TYPE const robotName = useHost()?.robotName ?? 'robot' - const labwareDefinitionsByUri = useRunLoadedLabwareDefinitionsByUri(runId) - const allRunDefs = - labwareDefinitionsByUri != null - ? Object.values(labwareDefinitionsByUri) - : [] + const allRunDefs = runLwDefsByUri != null ? Object.values(runLwDefsByUri) : [] const { showTakeover, @@ -150,7 +171,7 @@ export function ErrorRecoveryFlows( isActiveUser, failedCommand: failedCommandBySource, allRunDefs, - labwareDefinitionsByUri, + runLwDefsByUri, }) const renderWizard = diff --git a/app/src/pages/ODD/RunningProtocol/__tests__/RunningProtocol.test.tsx b/app/src/pages/ODD/RunningProtocol/__tests__/RunningProtocol.test.tsx index 33d6f79e9a7..cbb45387a5a 100644 --- a/app/src/pages/ODD/RunningProtocol/__tests__/RunningProtocol.test.tsx +++ b/app/src/pages/ODD/RunningProtocol/__tests__/RunningProtocol.test.tsx @@ -161,6 +161,7 @@ describe('RunningProtocol', () => { vi.mocked(useErrorRecoveryFlows).mockReturnValue({ isERActive: false, failedCommand: {} as any, + runLwDefsByUri: {} as any, }) vi.mocked(useInterventionModal).mockReturnValue({ showModal: false, @@ -224,6 +225,7 @@ describe('RunningProtocol', () => { vi.mocked(useErrorRecoveryFlows).mockReturnValue({ isERActive: true, failedCommand: {} as any, + runLwDefsByUri: {} as any, }) render(`/runs/${RUN_ID}/run`) screen.getByText('MOCK ERROR RECOVERY') diff --git a/app/src/pages/ODD/RunningProtocol/index.tsx b/app/src/pages/ODD/RunningProtocol/index.tsx index 33d9d515930..eee50894ebb 100644 --- a/app/src/pages/ODD/RunningProtocol/index.tsx +++ b/app/src/pages/ODD/RunningProtocol/index.tsx @@ -122,7 +122,10 @@ export function RunningProtocol(): JSX.Element { const { trackProtocolRunEvent } = useTrackProtocolRunEvent(runId, robotName) const robotAnalyticsData = useRobotAnalyticsData(robotName) const robotType = useRobotType(robotName) - const { isERActive, failedCommand } = useErrorRecoveryFlows(runId, runStatus) + const { isERActive, failedCommand, runLwDefsByUri } = useErrorRecoveryFlows( + runId, + runStatus + ) const { showModal: showIntervention, modalProps: interventionProps, @@ -169,6 +172,7 @@ export function RunningProtocol(): JSX.Element { runStatus={runStatus} runId={runId} unvalidatedFailedCommand={failedCommand} + runLwDefsByUri={runLwDefsByUri} protocolAnalysis={robotSideAnalysis} /> ) : null} diff --git a/app/src/resources/runs/useRunLoadedLabwareDefinitionsByUri.ts b/app/src/resources/runs/useRunLoadedLabwareDefinitionsByUri.ts index d7ffb086d10..9a785cb99df 100644 --- a/app/src/resources/runs/useRunLoadedLabwareDefinitionsByUri.ts +++ b/app/src/resources/runs/useRunLoadedLabwareDefinitionsByUri.ts @@ -18,23 +18,29 @@ export type RunLoadedLabwareDefinitionsByUri = Record< // Returns a record of labware definitions keyed by URI for the labware that // has been loaded with a "loadLabware" command. Errors if the run is not the current run. +// Returns null if the network request is pending. export function useRunLoadedLabwareDefinitionsByUri( runId: string | null, options: UseQueryOptions = {}, hostOverride?: HostConfig -): RunLoadedLabwareDefinitionsByUri { +): RunLoadedLabwareDefinitionsByUri | null { const { data } = useRunLoadedLabwareDefinitions(runId, options, hostOverride) return useMemo(() => { const result: Record = {} - // @ts-expect-error TODO(jh, 10-12-24): Update the app's typing to support LabwareDefinition3. - data?.data.forEach((def: LabwareDefinition2) => { - if ('schemaVersion' in def) { - const lwUri = getLabwareDefURI(def) - result[lwUri] = def - } - }) - return result + if (data == null) { + return null + } else { + // @ts-expect-error TODO(jh, 10-12-24): Update the app's typing to support LabwareDefinition3. + data?.data.forEach((def: LabwareDefinition2) => { + if ('schemaVersion' in def) { + const lwUri = getLabwareDefURI(def) + result[lwUri] = def + } + }) + + return result + } }, [data]) } From 871aa94696da8ad6c4975c6db8a7fdb5f77f0360 Mon Sep 17 00:00:00 2001 From: Sarah Breen Date: Tue, 14 Jan 2025 13:05:47 -0500 Subject: [PATCH 018/150] feat(app): Block evotips labware from appearing in labware tab (#17251) fix EXEC-1085 --- .../local-resources/labware/hooks/useAllLabware.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/app/src/local-resources/labware/hooks/useAllLabware.ts b/app/src/local-resources/labware/hooks/useAllLabware.ts index 28d4325b2eb..b118113ad55 100644 --- a/app/src/local-resources/labware/hooks/useAllLabware.ts +++ b/app/src/local-resources/labware/hooks/useAllLabware.ts @@ -3,12 +3,21 @@ import { getValidCustomLabware } from '/app/redux/custom-labware' import { getAllDefinitions } from '../utils' import type { LabwareSort, LabwareFilter, LabwareDefAndDate } from '../types' +// labware to filter out from the labware tab of the desktop app +// TODO (sb:1/14/25) remove evotips from blocklist before public launch +const LABWARE_LOADNAME_BLOCKLIST = [ + 'evotips_flex_96_tiprack_adapter', + 'evotips_opentrons_96_labware', +] + export function useAllLabware( sortBy: LabwareSort, filterBy: LabwareFilter ): LabwareDefAndDate[] { const fullLabwareList: LabwareDefAndDate[] = [] - const labwareDefinitions = getAllDefinitions() + const labwareDefinitions = getAllDefinitions().filter( + def => !LABWARE_LOADNAME_BLOCKLIST.includes(def.parameters.loadName) + ) labwareDefinitions.forEach(def => fullLabwareList.push({ definition: def })) const customLabwareList = useSelector(getValidCustomLabware) customLabwareList.forEach(customLabware => From 271ad5872a2376e4f52500b992952032e5010dae Mon Sep 17 00:00:00 2001 From: Max Marrone Date: Tue, 14 Jan 2025 15:04:00 -0500 Subject: [PATCH 019/150] fix(api): Fix Pydantic error when parsing commands that did not succeed (#17264) robot-server sometimes stores, in its database, run commands that do not have a `result`. For example, if a command failed, it has an `error` instead of a `result`. After the recent Pydantic v1->v2 upgrade, parsing these commands was broken for about 1/3rd of our command types. The server would raise a 500 error. Their Pydantic models were defined like: ``` result: Optional[FooResult] ``` In Pydantic v1, that parses JSON where `result` is `null` or omitted, but in Pydantic v2, it only parses JSON where `result` is `null`. We need to change it to: ``` result: Optional[FooResult] = None ``` --- .../protocol_engine/commands/absorbance_reader/close_lid.py | 2 +- .../protocol_engine/commands/absorbance_reader/initialize.py | 2 +- .../protocol_engine/commands/absorbance_reader/open_lid.py | 2 +- .../protocol_engine/commands/absorbance_reader/read.py | 2 +- .../opentrons/protocol_engine/commands/air_gap_in_place.py | 2 +- api/src/opentrons/protocol_engine/commands/get_next_tip.py | 2 +- api/src/opentrons/protocol_engine/commands/liquid_probe.py | 4 ++-- api/src/opentrons/protocol_engine/commands/load_lid.py | 2 +- api/src/opentrons/protocol_engine/commands/load_lid_stack.py | 2 +- .../opentrons/protocol_engine/commands/load_liquid_class.py | 2 +- .../protocol_engine/commands/robot/close_gripper_jaw.py | 2 +- .../protocol_engine/commands/robot/move_axes_relative.py | 2 +- .../opentrons/protocol_engine/commands/robot/move_axes_to.py | 2 +- api/src/opentrons/protocol_engine/commands/robot/move_to.py | 2 +- .../protocol_engine/commands/robot/open_gripper_jaw.py | 2 +- .../commands/thermocycler/run_extended_profile.py | 2 +- .../commands/unsafe/unsafe_blow_out_in_place.py | 2 +- .../commands/unsafe/unsafe_drop_tip_in_place.py | 2 +- .../protocol_engine/commands/unsafe/unsafe_engage_axes.py | 2 +- .../protocol_engine/commands/unsafe/unsafe_place_labware.py | 2 +- .../protocol_engine/commands/unsafe/unsafe_ungrip_labware.py | 2 +- .../commands/unsafe/update_position_estimators.py | 2 +- 22 files changed, 23 insertions(+), 23 deletions(-) diff --git a/api/src/opentrons/protocol_engine/commands/absorbance_reader/close_lid.py b/api/src/opentrons/protocol_engine/commands/absorbance_reader/close_lid.py index 41c1e65bce9..fd6e279d659 100644 --- a/api/src/opentrons/protocol_engine/commands/absorbance_reader/close_lid.py +++ b/api/src/opentrons/protocol_engine/commands/absorbance_reader/close_lid.py @@ -132,7 +132,7 @@ class CloseLid(BaseCommand[CloseLidParams, CloseLidResult, ErrorOccurrence]): commandType: CloseLidCommandType = "absorbanceReader/closeLid" params: CloseLidParams - result: Optional[CloseLidResult] + result: Optional[CloseLidResult] = None _ImplementationCls: Type[CloseLidImpl] = CloseLidImpl diff --git a/api/src/opentrons/protocol_engine/commands/absorbance_reader/initialize.py b/api/src/opentrons/protocol_engine/commands/absorbance_reader/initialize.py index bcb2639d0a5..5fa810455ec 100644 --- a/api/src/opentrons/protocol_engine/commands/absorbance_reader/initialize.py +++ b/api/src/opentrons/protocol_engine/commands/absorbance_reader/initialize.py @@ -137,7 +137,7 @@ class Initialize(BaseCommand[InitializeParams, InitializeResult, ErrorOccurrence commandType: InitializeCommandType = "absorbanceReader/initialize" params: InitializeParams - result: Optional[InitializeResult] + result: Optional[InitializeResult] = None _ImplementationCls: Type[InitializeImpl] = InitializeImpl diff --git a/api/src/opentrons/protocol_engine/commands/absorbance_reader/open_lid.py b/api/src/opentrons/protocol_engine/commands/absorbance_reader/open_lid.py index 96495a2bcde..3fa965e33b3 100644 --- a/api/src/opentrons/protocol_engine/commands/absorbance_reader/open_lid.py +++ b/api/src/opentrons/protocol_engine/commands/absorbance_reader/open_lid.py @@ -133,7 +133,7 @@ class OpenLid(BaseCommand[OpenLidParams, OpenLidResult, ErrorOccurrence]): commandType: OpenLidCommandType = "absorbanceReader/openLid" params: OpenLidParams - result: Optional[OpenLidResult] + result: Optional[OpenLidResult] = None _ImplementationCls: Type[OpenLidImpl] = OpenLidImpl diff --git a/api/src/opentrons/protocol_engine/commands/absorbance_reader/read.py b/api/src/opentrons/protocol_engine/commands/absorbance_reader/read.py index c8f7dca8706..fc230d1dee9 100644 --- a/api/src/opentrons/protocol_engine/commands/absorbance_reader/read.py +++ b/api/src/opentrons/protocol_engine/commands/absorbance_reader/read.py @@ -209,7 +209,7 @@ class ReadAbsorbance( commandType: ReadAbsorbanceCommandType = "absorbanceReader/read" params: ReadAbsorbanceParams - result: Optional[ReadAbsorbanceResult] + result: Optional[ReadAbsorbanceResult] = None _ImplementationCls: Type[ReadAbsorbanceImpl] = ReadAbsorbanceImpl diff --git a/api/src/opentrons/protocol_engine/commands/air_gap_in_place.py b/api/src/opentrons/protocol_engine/commands/air_gap_in_place.py index 461a446f3e4..f8c6bcf859b 100644 --- a/api/src/opentrons/protocol_engine/commands/air_gap_in_place.py +++ b/api/src/opentrons/protocol_engine/commands/air_gap_in_place.py @@ -146,7 +146,7 @@ class AirGapInPlace( commandType: AirGapInPlaceCommandType = "airGapInPlace" params: AirGapInPlaceParams - result: Optional[AirGapInPlaceResult] + result: Optional[AirGapInPlaceResult] = None _ImplementationCls: Type[AirGapInPlaceImplementation] = AirGapInPlaceImplementation diff --git a/api/src/opentrons/protocol_engine/commands/get_next_tip.py b/api/src/opentrons/protocol_engine/commands/get_next_tip.py index f9f2cb8ba61..9e0cf3b50cf 100644 --- a/api/src/opentrons/protocol_engine/commands/get_next_tip.py +++ b/api/src/opentrons/protocol_engine/commands/get_next_tip.py @@ -120,7 +120,7 @@ class GetNextTip(BaseCommand[GetNextTipParams, GetNextTipResult, ErrorOccurrence commandType: GetNextTipCommandType = "getNextTip" params: GetNextTipParams - result: Optional[GetNextTipResult] + result: Optional[GetNextTipResult] = None _ImplementationCls: Type[GetNextTipImplementation] = GetNextTipImplementation diff --git a/api/src/opentrons/protocol_engine/commands/liquid_probe.py b/api/src/opentrons/protocol_engine/commands/liquid_probe.py index a0418d53c9a..419dca03b40 100644 --- a/api/src/opentrons/protocol_engine/commands/liquid_probe.py +++ b/api/src/opentrons/protocol_engine/commands/liquid_probe.py @@ -361,7 +361,7 @@ class LiquidProbe( commandType: LiquidProbeCommandType = "liquidProbe" params: LiquidProbeParams - result: Optional[LiquidProbeResult] + result: Optional[LiquidProbeResult] = None _ImplementationCls: Type[LiquidProbeImplementation] = LiquidProbeImplementation @@ -373,7 +373,7 @@ class TryLiquidProbe( commandType: TryLiquidProbeCommandType = "tryLiquidProbe" params: TryLiquidProbeParams - result: Optional[TryLiquidProbeResult] + result: Optional[TryLiquidProbeResult] = None _ImplementationCls: Type[ TryLiquidProbeImplementation diff --git a/api/src/opentrons/protocol_engine/commands/load_lid.py b/api/src/opentrons/protocol_engine/commands/load_lid.py index 4f2e49c7447..c348ffbc3ea 100644 --- a/api/src/opentrons/protocol_engine/commands/load_lid.py +++ b/api/src/opentrons/protocol_engine/commands/load_lid.py @@ -132,7 +132,7 @@ class LoadLid(BaseCommand[LoadLidParams, LoadLidResult, ErrorOccurrence]): commandType: LoadLidCommandType = "loadLid" params: LoadLidParams - result: Optional[LoadLidResult] + result: Optional[LoadLidResult] = None _ImplementationCls: Type[LoadLidImplementation] = LoadLidImplementation diff --git a/api/src/opentrons/protocol_engine/commands/load_lid_stack.py b/api/src/opentrons/protocol_engine/commands/load_lid_stack.py index 7b430dfaf45..1a19831b1f9 100644 --- a/api/src/opentrons/protocol_engine/commands/load_lid_stack.py +++ b/api/src/opentrons/protocol_engine/commands/load_lid_stack.py @@ -175,7 +175,7 @@ class LoadLidStack( commandType: LoadLidStackCommandType = "loadLidStack" params: LoadLidStackParams - result: Optional[LoadLidStackResult] + result: Optional[LoadLidStackResult] = None _ImplementationCls: Type[LoadLidStackImplementation] = LoadLidStackImplementation diff --git a/api/src/opentrons/protocol_engine/commands/load_liquid_class.py b/api/src/opentrons/protocol_engine/commands/load_liquid_class.py index 8cb3d4a06fb..2dfcb089414 100644 --- a/api/src/opentrons/protocol_engine/commands/load_liquid_class.py +++ b/api/src/opentrons/protocol_engine/commands/load_liquid_class.py @@ -128,7 +128,7 @@ class LoadLiquidClass( commandType: LoadLiquidClassCommandType = "loadLiquidClass" params: LoadLiquidClassParams - result: Optional[LoadLiquidClassResult] + result: Optional[LoadLiquidClassResult] = None _ImplementationCls: Type[ LoadLiquidClassImplementation diff --git a/api/src/opentrons/protocol_engine/commands/robot/close_gripper_jaw.py b/api/src/opentrons/protocol_engine/commands/robot/close_gripper_jaw.py index 36b027c351a..5ff11891a1b 100644 --- a/api/src/opentrons/protocol_engine/commands/robot/close_gripper_jaw.py +++ b/api/src/opentrons/protocol_engine/commands/robot/close_gripper_jaw.py @@ -70,7 +70,7 @@ class closeGripperJaw( commandType: closeGripperJawCommandType = "robot/closeGripperJaw" params: closeGripperJawParams - result: Optional[closeGripperJawResult] + result: Optional[closeGripperJawResult] = None _ImplementationCls: Type[ closeGripperJawImplementation diff --git a/api/src/opentrons/protocol_engine/commands/robot/move_axes_relative.py b/api/src/opentrons/protocol_engine/commands/robot/move_axes_relative.py index 99b30e9595a..c334e4017ce 100644 --- a/api/src/opentrons/protocol_engine/commands/robot/move_axes_relative.py +++ b/api/src/opentrons/protocol_engine/commands/robot/move_axes_relative.py @@ -85,7 +85,7 @@ class MoveAxesRelative( commandType: MoveAxesRelativeCommandType = "robot/moveAxesRelative" params: MoveAxesRelativeParams - result: Optional[MoveAxesRelativeResult] + result: Optional[MoveAxesRelativeResult] = None _ImplementationCls: Type[ MoveAxesRelativeImplementation diff --git a/api/src/opentrons/protocol_engine/commands/robot/move_axes_to.py b/api/src/opentrons/protocol_engine/commands/robot/move_axes_to.py index 93fc2746c84..81c4462af57 100644 --- a/api/src/opentrons/protocol_engine/commands/robot/move_axes_to.py +++ b/api/src/opentrons/protocol_engine/commands/robot/move_axes_to.py @@ -86,7 +86,7 @@ class MoveAxesTo(BaseCommand[MoveAxesToParams, MoveAxesToResult, ErrorOccurrence commandType: MoveAxesToCommandType = "robot/moveAxesTo" params: MoveAxesToParams - result: Optional[MoveAxesToResult] + result: Optional[MoveAxesToResult] = None _ImplementationCls: Type[MoveAxesToImplementation] = MoveAxesToImplementation diff --git a/api/src/opentrons/protocol_engine/commands/robot/move_to.py b/api/src/opentrons/protocol_engine/commands/robot/move_to.py index e2a3af07767..e0b5365c048 100644 --- a/api/src/opentrons/protocol_engine/commands/robot/move_to.py +++ b/api/src/opentrons/protocol_engine/commands/robot/move_to.py @@ -80,7 +80,7 @@ class MoveTo(BaseCommand[MoveToParams, MoveToResult, ErrorOccurrence]): commandType: MoveToCommandType = "robot/moveTo" params: MoveToParams - result: Optional[MoveToResult] + result: Optional[MoveToResult] = None _ImplementationCls: Type[MoveToImplementation] = MoveToImplementation diff --git a/api/src/opentrons/protocol_engine/commands/robot/open_gripper_jaw.py b/api/src/opentrons/protocol_engine/commands/robot/open_gripper_jaw.py index 22aa1debd42..83b58647394 100644 --- a/api/src/opentrons/protocol_engine/commands/robot/open_gripper_jaw.py +++ b/api/src/opentrons/protocol_engine/commands/robot/open_gripper_jaw.py @@ -61,7 +61,7 @@ class openGripperJaw( commandType: openGripperJawCommandType = "robot/openGripperJaw" params: openGripperJawParams - result: Optional[openGripperJawResult] + result: Optional[openGripperJawResult] = None _ImplementationCls: Type[ openGripperJawImplementation diff --git a/api/src/opentrons/protocol_engine/commands/thermocycler/run_extended_profile.py b/api/src/opentrons/protocol_engine/commands/thermocycler/run_extended_profile.py index 40f87af7772..ec294d5965c 100644 --- a/api/src/opentrons/protocol_engine/commands/thermocycler/run_extended_profile.py +++ b/api/src/opentrons/protocol_engine/commands/thermocycler/run_extended_profile.py @@ -157,7 +157,7 @@ class RunExtendedProfile( commandType: RunExtendedProfileCommandType = "thermocycler/runExtendedProfile" params: RunExtendedProfileParams - result: Optional[RunExtendedProfileResult] + result: Optional[RunExtendedProfileResult] = None _ImplementationCls: Type[RunExtendedProfileImpl] = RunExtendedProfileImpl diff --git a/api/src/opentrons/protocol_engine/commands/unsafe/unsafe_blow_out_in_place.py b/api/src/opentrons/protocol_engine/commands/unsafe/unsafe_blow_out_in_place.py index 4c767625782..bd48c3c1c8b 100644 --- a/api/src/opentrons/protocol_engine/commands/unsafe/unsafe_blow_out_in_place.py +++ b/api/src/opentrons/protocol_engine/commands/unsafe/unsafe_blow_out_in_place.py @@ -82,7 +82,7 @@ class UnsafeBlowOutInPlace( commandType: UnsafeBlowOutInPlaceCommandType = "unsafe/blowOutInPlace" params: UnsafeBlowOutInPlaceParams - result: Optional[UnsafeBlowOutInPlaceResult] + result: Optional[UnsafeBlowOutInPlaceResult] = None _ImplementationCls: Type[ UnsafeBlowOutInPlaceImplementation diff --git a/api/src/opentrons/protocol_engine/commands/unsafe/unsafe_drop_tip_in_place.py b/api/src/opentrons/protocol_engine/commands/unsafe/unsafe_drop_tip_in_place.py index 56a87a468dd..d6b0652a4c0 100644 --- a/api/src/opentrons/protocol_engine/commands/unsafe/unsafe_drop_tip_in_place.py +++ b/api/src/opentrons/protocol_engine/commands/unsafe/unsafe_drop_tip_in_place.py @@ -99,7 +99,7 @@ class UnsafeDropTipInPlace( commandType: UnsafeDropTipInPlaceCommandType = "unsafe/dropTipInPlace" params: UnsafeDropTipInPlaceParams - result: Optional[UnsafeDropTipInPlaceResult] + result: Optional[UnsafeDropTipInPlaceResult] = None _ImplementationCls: Type[ UnsafeDropTipInPlaceImplementation diff --git a/api/src/opentrons/protocol_engine/commands/unsafe/unsafe_engage_axes.py b/api/src/opentrons/protocol_engine/commands/unsafe/unsafe_engage_axes.py index 4f80db24f42..c38bc1ed481 100644 --- a/api/src/opentrons/protocol_engine/commands/unsafe/unsafe_engage_axes.py +++ b/api/src/opentrons/protocol_engine/commands/unsafe/unsafe_engage_axes.py @@ -66,7 +66,7 @@ class UnsafeEngageAxes( commandType: UnsafeEngageAxesCommandType = "unsafe/engageAxes" params: UnsafeEngageAxesParams - result: Optional[UnsafeEngageAxesResult] + result: Optional[UnsafeEngageAxesResult] = None _ImplementationCls: Type[ UnsafeEngageAxesImplementation diff --git a/api/src/opentrons/protocol_engine/commands/unsafe/unsafe_place_labware.py b/api/src/opentrons/protocol_engine/commands/unsafe/unsafe_place_labware.py index c69cea29243..cd105867524 100644 --- a/api/src/opentrons/protocol_engine/commands/unsafe/unsafe_place_labware.py +++ b/api/src/opentrons/protocol_engine/commands/unsafe/unsafe_place_labware.py @@ -192,7 +192,7 @@ class UnsafePlaceLabware( commandType: UnsafePlaceLabwareCommandType = "unsafe/placeLabware" params: UnsafePlaceLabwareParams - result: Optional[UnsafePlaceLabwareResult] + result: Optional[UnsafePlaceLabwareResult] = None _ImplementationCls: Type[ UnsafePlaceLabwareImplementation diff --git a/api/src/opentrons/protocol_engine/commands/unsafe/unsafe_ungrip_labware.py b/api/src/opentrons/protocol_engine/commands/unsafe/unsafe_ungrip_labware.py index 6f8f5b71fce..dd7248a1932 100644 --- a/api/src/opentrons/protocol_engine/commands/unsafe/unsafe_ungrip_labware.py +++ b/api/src/opentrons/protocol_engine/commands/unsafe/unsafe_ungrip_labware.py @@ -61,7 +61,7 @@ class UnsafeUngripLabware( commandType: UnsafeUngripLabwareCommandType = "unsafe/ungripLabware" params: UnsafeUngripLabwareParams - result: Optional[UnsafeUngripLabwareResult] + result: Optional[UnsafeUngripLabwareResult] = None _ImplementationCls: Type[ UnsafeUngripLabwareImplementation diff --git a/api/src/opentrons/protocol_engine/commands/unsafe/update_position_estimators.py b/api/src/opentrons/protocol_engine/commands/unsafe/update_position_estimators.py index 6b050d6472f..0f6e4c5d7eb 100644 --- a/api/src/opentrons/protocol_engine/commands/unsafe/update_position_estimators.py +++ b/api/src/opentrons/protocol_engine/commands/unsafe/update_position_estimators.py @@ -74,7 +74,7 @@ class UpdatePositionEstimators( commandType: UpdatePositionEstimatorsCommandType = "unsafe/updatePositionEstimators" params: UpdatePositionEstimatorsParams - result: Optional[UpdatePositionEstimatorsResult] + result: Optional[UpdatePositionEstimatorsResult] = None _ImplementationCls: Type[ UpdatePositionEstimatorsImplementation From 061ab89b8b971698f1d5b7a1995ce24416a4f84e Mon Sep 17 00:00:00 2001 From: Josh McVey Date: Tue, 14 Jan 2025 15:40:39 -0600 Subject: [PATCH 020/150] test(analyses): add refactored 8.2 smoke test (#17214) --- .../automation/data/protocols.py | 7 + ...S_v2_21_P1000_96_GRIP_HS_MB_TC_TM_Smoke.py | 458 + ...2_21_P1000_96_GRIP_HS_MB_TC_TM_Smoke].json | 15120 ++++++++++++++++ 3 files changed, 15585 insertions(+) create mode 100644 analyses-snapshot-testing/files/protocols/Flex_S_v2_21_P1000_96_GRIP_HS_MB_TC_TM_Smoke.py create mode 100644 analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2b866b03f3][Flex_S_v2_21_P1000_96_GRIP_HS_MB_TC_TM_Smoke].json diff --git a/analyses-snapshot-testing/automation/data/protocols.py b/analyses-snapshot-testing/automation/data/protocols.py index ada74a736e0..4acad3c0702 100644 --- a/analyses-snapshot-testing/automation/data/protocols.py +++ b/analyses-snapshot-testing/automation/data/protocols.py @@ -709,6 +709,13 @@ class Protocols: robot="Flex", ) + # analyses-snapshot-testing/files/protocols/Flex_S_v2_21_P1000_96_GRIP_HS_MB_TC_TM_Smoke.py + Flex_S_v2_21_P1000_96_GRIP_HS_MB_TC_TM_Smoke: Protocol = Protocol( + file_stem="Flex_S_v2_21_P1000_96_GRIP_HS_MB_TC_TM_Smoke", + file_extension="py", + robot="Flex", + ) + OT2_X_v2_18_None_None_duplicateRTPVariableName: Protocol = Protocol( file_stem="OT2_X_v2_18_None_None_duplicateRTPVariableName", file_extension="py", diff --git a/analyses-snapshot-testing/files/protocols/Flex_S_v2_21_P1000_96_GRIP_HS_MB_TC_TM_Smoke.py b/analyses-snapshot-testing/files/protocols/Flex_S_v2_21_P1000_96_GRIP_HS_MB_TC_TM_Smoke.py new file mode 100644 index 00000000000..20d77fd560f --- /dev/null +++ b/analyses-snapshot-testing/files/protocols/Flex_S_v2_21_P1000_96_GRIP_HS_MB_TC_TM_Smoke.py @@ -0,0 +1,458 @@ +############# +# CHANGELOG # +############# + +# ---- +# 2.21 +# ---- + +# - - Run protocols that use the Absorbance Plate Reader and check the status of the module on the robot details screen for your Flex. +# - - Run protocols that use the new Opentrons Tough PCR Auto-Sealing Lid with the Thermocycler Module GEN2. Stacks of these lids appear in a consolidated view when setting up labware. +# - - Error recovery now works in more situations and has more options - Gripper Errors, Drop Tip Errors, additional recovery options for tip errors, disable error recovery entirely (8.2.0) + +# ---- +# 2.20 +# ---- + +# - configure_nozzle_layout() now accepts row, single, and partial column layout constants. See Partial Tip Pickup. +# - You can now call ProtocolContext.define_liquid() without supplying a description or display_color. +# - You can now call ProtocolContext.liquid_presence_detection() or ProtocolContext.require_liquid_presence() to use LLD on instrument context or on well +# - You now have the option to set RTP using CSV files +# - Error Recovery will now initiate for miss tip pick up, overpressure on aspirate and dispense, and if liquid presence isn't detected (8.0.0) + +# ---- +# 2.19 +# ---- + +# - NO FEATURES OR API CHANGES +# - New values for how much a tip overlaps with the pipette nozzle when the pipette picks up tips + +# ---- +# 2.18 +# ---- + +# - labware.set_offset +# - Runtime Parameters added +# - TrashContainer.top() and Well.top() now return objects of the same type +# - pipette.drop_tip() if location argument not specified the tips will be dropped at different locations in the bin +# - pipette.drop_tip() if location is specified, the tips will be dropped in the same place every time + +# ---- +# 2.17 +# ---- + +# NOTHING NEW +# This protocol is exactly the same as 2.16 Smoke Test V3 +# The only difference is the API version in the metadata +# There were no new positive test cases for 2.17 +# The negative test cases are captured in the 2.17 dispense changes protocol + +# ---- +# 2.16 +# ---- + +# - prepare_to_aspirate added +# - fixed_trash property changed +# - instrument_context.trash_container property changed + +# ---- +# 2.15 +# ---- + +# - move_labware added - Manual Deck State Modification +# - ProtocolContext.load_adapter added +# - OFF_DECK location added + +from typing import List +from opentrons import protocol_api, types +from opentrons.protocol_api import Labware + + +metadata = { + "protocolName": "Flex Smoke Test - v2.21", + "author": "QA team", +} + +requirements = { + "robotType": "Flex", + "apiLevel": "2.21", +} + + +################# +### CONSTANTS ### +################# + +DeckSlots = [ + "A1", + "A2", + "A3", + "A4", + "B1", + "B2", + "B3", + "B4", + "C1", + "C2", + "C3", + "C4", + "D1", + "D2", + "D3", + "D4", +] + +HEATER_SHAKER_ADAPTER_NAME = "opentrons_96_pcr_adapter" +HEATER_SHAKER_NAME = "heaterShakerModuleV1" +MAGNETIC_BLOCK_NAME = "magneticBlockV1" +TEMPERATURE_MODULE_ADAPTER_NAME = "opentrons_96_well_aluminum_block" +TEMPERATURE_MODULE_NAME = "temperature module gen2" +THERMOCYCLER_NAME = "thermocycler module gen2" +ABSORBANCE_READER = "absorbanceReaderV1" +DECK_RISER_NAME = "opentrons_flex_deck_riser" +TC_LID = "opentrons_tough_pcr_auto_sealing_lid" +LID_COUNT = 5 +TIPRACK_96_ADAPTER_NAME = "opentrons_flex_96_tiprack_adapter" +TIPRACK_96_NAME = "opentrons_flex_96_tiprack_1000ul" +PIPETTE_96_CHANNEL_NAME = "flex_96channel_1000" +WELL_PLATE_STARTING_POSITION = "C2" +RESERVOIR_STARTING_POSITION = "D2" + + +def comment_tip_rack_status(ctx, tip_rack): + """ + Print out the tip status for each row in a tip rack. + Each row (A-H) will print the well statuses for columns 1-12 in a single comment, + with a '🟢' for present tips and a '❌' for missing tips. + """ + range_A_to_H = [chr(i) for i in range(ord("A"), ord("H") + 1)] + range_1_to_12 = range(1, 13) + + ctx.comment(f"Tip rack in {tip_rack.parent}") + + for row in range_A_to_H: + status_line = f"{row}: " + for col in range_1_to_12: + well = f"{row}{col}" + has_tip = tip_rack.wells_by_name()[well].has_tip + status_emoji = "🟢" if has_tip else "❌" + status_line += f"{well} {status_emoji} " + + # Print the full status line for the row + ctx.comment(status_line) + + +############################## +# Runtime Parameters Support # +############################## + +# -------------------------- # +# Added in API version: 2.18 # +# -------------------------- # + + +def add_parameters(parameters: protocol_api.Parameters): + """This is the standard use of parameters""" + + # We are using the defaults for every case. + # Other tests cover regression testing for + # other types of parameters and UI appearance + # there are many tests in Analyses Battery that cover errors and edge cases + + parameters.add_str( + variable_name="test_configuration", + display_name="Test Configuration", + description="Configuration of QA test to perform", + default="full", + choices=[{"display_name": "Full Smoke Test", "value": "full"}], + ) + + parameters.add_str( + variable_name="reservoir_name", + display_name="Reservoir Name", + description="Name of the reservoir", + default="nest_1_reservoir_290ml", + choices=[{"display_name": "Nest 1 Well 290 mL", "value": "nest_1_reservoir_290ml"}], + ) + + parameters.add_str( + variable_name="well_plate_name", + display_name="Well Plate Name", + description="Name of the well plate", + default="opentrons_96_wellplate_200ul_pcr_full_skirt", + choices=[{"display_name": "Opentrons Tough 96 Well 200 µL", "value": "opentrons_96_wellplate_200ul_pcr_full_skirt"}], + ) + + +def log_position(ctx, item): + ctx.comment(f"Item {item.load_name} is at {item.parent}") + + +def run(ctx: protocol_api.ProtocolContext) -> None: + + ################ + ### FIXTURES ### + ################ + + waste_chute = ctx.load_waste_chute() + + ############### + ### MODULES ### + ############### + deck_riser_adapter = ctx.load_adapter(DECK_RISER_NAME, "A4") + thermocycler = ctx.load_module(THERMOCYCLER_NAME) # A1 & B1 + magnetic_block = ctx.load_module(MAGNETIC_BLOCK_NAME, "A3") + heater_shaker = ctx.load_module(HEATER_SHAKER_NAME, "C1") + temperature_module = ctx.load_module(TEMPERATURE_MODULE_NAME, "D1") + absorbance_module = ctx.load_module(ABSORBANCE_READER, "B3") + + lids: List[Labware] = [deck_riser_adapter.load_labware(TC_LID)] + for i in range(LID_COUNT - 1): + lids.append(lids[-1].load_labware(TC_LID)) + lids.reverse() + + thermocycler.open_lid() + heater_shaker.open_labware_latch() + absorbance_module.close_lid() + absorbance_module.initialize("single", [600], 450) + absorbance_module.open_lid() + + ####################### + ### MODULE ADAPTERS ### + ####################### + + temperature_module_adapter = temperature_module.load_adapter(TEMPERATURE_MODULE_ADAPTER_NAME) + heater_shaker_adapter = heater_shaker.load_adapter(HEATER_SHAKER_ADAPTER_NAME) + adapters = [temperature_module_adapter, heater_shaker_adapter] + + ############### + ### LABWARE ### + ############### + + # Load these directly with the RTP + source_reservoir = ctx.load_labware(ctx.params.reservoir_name, RESERVOIR_STARTING_POSITION) + dest_pcr_plate = ctx.load_labware(ctx.params.well_plate_name, WELL_PLATE_STARTING_POSITION) + + tip_rack_1 = ctx.load_labware(TIPRACK_96_NAME, "A2", adapter=TIPRACK_96_ADAPTER_NAME) + tip_rack_adapter = tip_rack_1.parent + + tip_rack_2 = ctx.load_labware(TIPRACK_96_NAME, "C3") + tip_rack_3 = ctx.load_labware(TIPRACK_96_NAME, "C4") + tip_rack_5 = ctx.load_labware(TIPRACK_96_NAME, protocol_api.OFF_DECK) + + tip_racks = [tip_rack_1, tip_rack_2, tip_rack_3] + + ########################## + ### PIPETTE DEFINITION ### + ########################## + + pipette_96_channel = ctx.load_instrument(PIPETTE_96_CHANNEL_NAME, mount="left", tip_racks=tip_racks, liquid_presence_detection=True) + pipette_96_channel.trash_container = waste_chute + + assert isinstance(pipette_96_channel.trash_container, protocol_api.WasteChute) + + ######################## + ### LOAD SOME LIQUID ### + ######################## + + water = ctx.define_liquid(name="water", description="High Quality H₂O", display_color="#42AB2D") + source_reservoir.wells_by_name()["A1"].load_liquid(liquid=water, volume=29000) + + ################################ + ### GRIPPER LABWARE MOVEMENT ### + ################################ + + log_position(ctx, dest_pcr_plate) + ctx.move_labware(dest_pcr_plate, thermocycler, use_gripper=True) + log_position(ctx, dest_pcr_plate) + # Move it back to the deck + ctx.move_labware(dest_pcr_plate, "C2", use_gripper=True) + log_position(ctx, dest_pcr_plate) + + # Other important moves? + + # manual move + log_position(ctx, source_reservoir) + ctx.move_labware(source_reservoir, "D4", use_gripper=False) + log_position(ctx, source_reservoir) + ctx.move_labware(source_reservoir, RESERVOIR_STARTING_POSITION, use_gripper=True) + log_position(ctx, source_reservoir) + + # Other important manual moves? + + # 96 channel column pickup + pipette_96_channel.configure_nozzle_layout(style=protocol_api.COLUMN, start="A12") + pipette_96_channel.pick_up_tip(tip_rack_2["A1"]) + comment_tip_rack_status(ctx, tip_rack_2) + pipette_96_channel.aspirate(5, source_reservoir["A1"]) + pipette_96_channel.touch_tip() + pipette_96_channel.dispense(5, dest_pcr_plate[f"A1"]) + pipette_96_channel.drop_tip(waste_chute) + + # 96 channel single pickup + pipette_96_channel.configure_nozzle_layout(style=protocol_api.SINGLE, start="H12") + pipette_96_channel.pick_up_tip(tip_rack_2) + pipette_96_channel.aspirate(5, source_reservoir["A1"]) + pipette_96_channel.touch_tip() + pipette_96_channel.dispense(5, source_reservoir["A1"]) + pipette_96_channel.aspirate(500, source_reservoir["A1"]) + pipette_96_channel.dispense(500, source_reservoir["A1"]) + pipette_96_channel.drop_tip(waste_chute) + comment_tip_rack_status(ctx, tip_rack_2) + + # put the tip rack in the trash + # since it cannot have a row pickup + ctx.move_labware(tip_rack_2, waste_chute, use_gripper=True) + ctx.move_labware(tip_rack_3, "C3", use_gripper=True) + + # 96 channel row pickup + pipette_96_channel.configure_nozzle_layout(style=protocol_api.ROW, start="H1") + pipette_96_channel.pick_up_tip(tip_rack_3) + pipette_96_channel.mix(3, 500, source_reservoir["A1"]) + pipette_96_channel.drop_tip(waste_chute) + comment_tip_rack_status(ctx, tip_rack_3) + + # 96 channel full rack pickup + pipette_96_channel.configure_nozzle_layout(style=protocol_api.ALL, start="A1") + pipette_96_channel.pick_up_tip(tip_rack_1["A1"]) + comment_tip_rack_status(ctx, tip_rack_1) + pipette_96_channel.aspirate(5, source_reservoir["A1"]) + pipette_96_channel.touch_tip() + pipette_96_channel.air_gap(height=30) + pipette_96_channel.blow_out(waste_chute) + pipette_96_channel.prepare_to_aspirate() + pipette_96_channel.aspirate(5, source_reservoir["A1"]) + pipette_96_channel.touch_tip() + pipette_96_channel.air_gap(height=30) + pipette_96_channel.blow_out(waste_chute) + pipette_96_channel.prepare_to_aspirate() + pipette_96_channel.aspirate(10, source_reservoir["A1"]) + pipette_96_channel.touch_tip() + pipette_96_channel.dispense(10, dest_pcr_plate["A1"]) + pipette_96_channel.mix(repetitions=5, volume=15) + pipette_96_channel.return_tip() + comment_tip_rack_status(ctx, tip_rack_1) + pipette_96_channel.pick_up_tip(tip_rack_1["A1"]) + pipette_96_channel.transfer( + volume=10, + source=source_reservoir["A1"], + dest=dest_pcr_plate["A1"], + new_tip="never", + touch_tip=True, + blow_out=True, + blowout_location="trash", + mix_before=(3, 5), + mix_after=(1, 5), + ) + comment_tip_rack_status(ctx, tip_rack_1) + pipette_96_channel.return_tip(home_after=False) + comment_tip_rack_status(ctx, tip_rack_1) + ctx.comment("I think the above should not be empty?") + # Thermocycler lid moves + ctx.move_labware(dest_pcr_plate, thermocycler, use_gripper=True) + ctx.move_labware(lids[0], dest_pcr_plate, use_gripper=True) # we reversed this list earlier + thermocycler.close_lid() + thermocycler.set_block_temperature(38, hold_time_seconds=5.0) + thermocycler.set_lid_temperature(38) + thermocycler.open_lid() + ctx.move_labware(lids[0], waste_chute, use_gripper=True) + thermocycler.deactivate() + + heater_shaker.open_labware_latch() + ctx.move_labware(dest_pcr_plate, heater_shaker_adapter, use_gripper=True) + heater_shaker.close_labware_latch() + + heater_shaker.set_target_temperature(38) + heater_shaker.set_and_wait_for_shake_speed(777) + heater_shaker.wait_for_temperature() + + heater_shaker.deactivate_heater() + heater_shaker.deactivate_shaker() + heater_shaker.open_labware_latch() + + ctx.move_labware(dest_pcr_plate, temperature_module_adapter, use_gripper=True) + temperature_module.set_temperature(38) + temperature_module.deactivate() + + ctx.move_labware(dest_pcr_plate, absorbance_module, use_gripper=True) + absorbance_module.close_lid() + + result = absorbance_module.read(export_filename="smoke_APR_data.csv") + msg = f"single: {result}" + ctx.comment(msg=msg) + ctx.pause(msg=msg) + absorbance_module.open_lid() + ctx.move_labware(dest_pcr_plate, "C2", use_gripper=True) + + # ###################### + # # labware.set_offset # + # ###################### + + # # -------------------------- # + # # Added in API version: 2.18 # + # # -------------------------- # + + SET_OFFSET_AMOUNT = 10.0 + ctx.move_labware(labware=source_reservoir, new_location=protocol_api.OFF_DECK, use_gripper=False) + pipette_96_channel.pick_up_tip(tip_rack_1["A1"]) + pipette_96_channel.move_to(dest_pcr_plate.wells_by_name()["A1"].top()) + + ctx.pause("Is the pipette tip in the middle of the PCR Plate, well A1, in slot C2? It should be at the LPC calibrated height.") + + dest_pcr_plate.set_offset( + x=0.0, + y=0.0, + z=SET_OFFSET_AMOUNT, + ) + + pipette_96_channel.move_to(dest_pcr_plate.wells_by_name()["A1"].top()) + ctx.pause( + "Is the pipette tip in the middle of the PCR Plate, well A1, in slot C2? It should be 10mm higher than the LPC calibrated height." + ) + + ctx.move_labware(labware=dest_pcr_plate, new_location="D2", use_gripper=False) + pipette_96_channel.move_to(dest_pcr_plate.wells_by_name()["A1"].top()) + + ctx.pause("Is the pipette tip in the middle of the PCR Plate, well A1, in slot D2? It should be at the LPC calibrated height.") + + dest_pcr_plate.set_offset( + x=0.0, + y=0.0, + z=SET_OFFSET_AMOUNT, + ) + + pipette_96_channel.move_to(dest_pcr_plate.wells_by_name()["A1"].top()) + ctx.pause( + "Is the pipette tip in the middle of the PCR Plate, well A1, in slot D2? It should be 10mm higher than the LPC calibrated height." + ) + + ctx.move_labware(labware=dest_pcr_plate, new_location="C2", use_gripper=False) + pipette_96_channel.move_to(dest_pcr_plate.wells_by_name()["A1"].top()) + + ctx.pause( + "Is the pipette tip in the middle of the PCR Plate, well A1, in slot C2? It should be 10mm higher than the LPC calibrated height." + ) + + ctx.move_labware(labware=source_reservoir, new_location="D2", use_gripper=False) + pipette_96_channel.move_to(source_reservoir.wells_by_name()["A1"].top()) + + ctx.pause("Is the pipette tip in the middle of the reservoir , well A1, in slot D2? It should be at the LPC calibrated height.") + + pipette_96_channel.return_tip() + ctx.move_labware(tip_rack_3, waste_chute, use_gripper=True) + + ctx.pause("!!!!!!!!!!YOU NEED TO REDO LPC!!!!!!!!!!") + + # Test the unique top() methods for TrashBin and WasteChute. + # Well objects should remain the same + + ######################## + # unique top() methods # + ######################## + + # ---------------------------- # + # Changed in API version: 2.18 # + # ---------------------------- # + + assert isinstance(waste_chute.top(), protocol_api.WasteChute) + assert isinstance(source_reservoir.wells_by_name()["A1"].top(), types.Location) diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2b866b03f3][Flex_S_v2_21_P1000_96_GRIP_HS_MB_TC_TM_Smoke].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2b866b03f3][Flex_S_v2_21_P1000_96_GRIP_HS_MB_TC_TM_Smoke].json new file mode 100644 index 00000000000..0454e8ec9c9 --- /dev/null +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2b866b03f3][Flex_S_v2_21_P1000_96_GRIP_HS_MB_TC_TM_Smoke].json @@ -0,0 +1,15120 @@ +{ + "commandAnnotations": [], + "commands": [ + { + "commandType": "home", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "50c7ae73a4e3f7129874f39dfb514803", + "notes": [], + "params": {}, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "73d9d4d55ae8466f3a793ceb70545fa5", + "notes": [], + "params": { + "loadName": "opentrons_flex_deck_riser", + "location": { + "addressableAreaName": "A4" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [ + "adapter" + ], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": -6.125, + "y": -6.125, + "z": 0 + }, + "dimensions": { + "xDimension": 140, + "yDimension": 98, + "zDimension": 55 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [] + } + ], + "metadata": { + "displayCategory": "adapter", + "displayName": "Opentrons Flex Deck Riser", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "opentrons_flex_deck_riser", + "quirks": [] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": {} + }, + "labwareId": "UUID" + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "loadModule", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "a3a7eed460d8d94a91747f23820a180d", + "notes": [], + "params": { + "location": { + "slotName": "B1" + }, + "model": "thermocyclerModuleV2" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 14.4, + "y": 64.93, + "z": 97.8 + }, + "compatibleWith": [], + "dimensions": { + "bareOverallHeight": 108.96, + "lidHeight": 61.7, + "overLabwareHeight": 0.0 + }, + "displayName": "Thermocycler Module GEN2", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 5.6 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 4.6 + } + } + }, + "labwareOffset": { + "x": 0.0, + "y": 68.8, + "z": 108.96 + }, + "model": "thermocyclerModuleV2", + "moduleType": "thermocyclerModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot3_standard": { + "B1": { + "cornerOffsetFromSlot": [ + [ + -98, + 0, + 0, + 1 + ], + [ + -20.005, + 0, + 0, + 1 + ], + [ + -0.84, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ], + "labwareOffset": [ + [ + -98, + 0, + 0, + 1 + ], + [ + -20.005, + 0, + 0, + 1 + ], + [ + -0.84, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + } + } + }, + "model": "thermocyclerModuleV2", + "moduleId": "UUID", + "serialNumber": "UUID" + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "loadModule", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "d023a31e37dd4dd97dbd40857a7508ed", + "notes": [], + "params": { + "location": { + "slotName": "A3" + }, + "model": "magneticBlockV1" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "compatibleWith": [], + "dimensions": { + "bareOverallHeight": 45.0, + "overLabwareHeight": 0.0 + }, + "displayName": "Magnetic Block GEN1", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + } + }, + "labwareOffset": { + "x": 0.0, + "y": 0.0, + "z": 38.0 + }, + "model": "magneticBlockV1", + "moduleType": "magneticBlockType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": {}, + "ot2_standard": {}, + "ot3_standard": {} + } + }, + "model": "magneticBlockV1", + "moduleId": "UUID" + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "loadModule", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "82d736bcccf3c45130f7959c3031b04c", + "notes": [], + "params": { + "location": { + "slotName": "C1" + }, + "model": "heaterShakerModuleV1" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 12.0, + "y": 8.75, + "z": 68.275 + }, + "compatibleWith": [], + "dimensions": { + "bareOverallHeight": 82.0, + "overLabwareHeight": 0.0 + }, + "displayName": "Heater-Shaker Module GEN1", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + } + }, + "labwareOffset": { + "x": -0.125, + "y": 1.125, + "z": 68.275 + }, + "model": "heaterShakerModuleV1", + "moduleType": "heaterShakerModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": { + "3": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot2_standard": { + "3": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + 0, + 0, + 0 + ], + [ + -1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot3_standard": { + "A1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "A3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "B1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "B3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "C1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "C3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "D1": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + }, + "D3": { + "labwareOffset": [ + [ + -49.325, + 0, + 0, + 1 + ], + [ + -1.125, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.125, + 1 + ] + ] + } + } + } + }, + "model": "heaterShakerModuleV1", + "moduleId": "UUID", + "serialNumber": "UUID" + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "loadModule", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "1cef18851df21f75ea1c1d79e34dfdaf", + "notes": [], + "params": { + "location": { + "slotName": "D1" + }, + "model": "temperatureModuleV2" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 11.7, + "y": 8.75, + "z": 80.09 + }, + "compatibleWith": [ + "temperatureModuleV1" + ], + "dimensions": { + "bareOverallHeight": 84.0, + "overLabwareHeight": 0.0 + }, + "displayName": "Temperature Module GEN2", + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + } + }, + "labwareOffset": { + "x": -1.45, + "y": -0.15, + "z": 80.09 + }, + "model": "temperatureModuleV2", + "moduleType": "temperatureModuleType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": { + "3": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + -0.15, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot2_standard": { + "3": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "6": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + }, + "9": { + "labwareOffset": [ + [ + -1, + -0.3, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ] + ] + } + }, + "ot3_standard": { + "A1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "A3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "B1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "B3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "C1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "C3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "D1": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + }, + "D3": { + "labwareOffset": [ + [ + -71.09, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 0, + 0.15, + 1 + ], + [ + 0, + 0, + 1, + 1.45 + ] + ] + } + } + } + }, + "model": "temperatureModuleV2", + "moduleId": "UUID", + "serialNumber": "UUID" + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "loadModule", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "0f830ddf4178d19d8afc9d9b7fbfb9e8", + "notes": [], + "params": { + "location": { + "slotName": "B3" + }, + "model": "absorbanceReaderV1" + }, + "result": { + "definition": { + "calibrationPoint": { + "x": 14.4, + "y": 64.93, + "z": 97.8 + }, + "compatibleWith": [], + "dimensions": { + "bareOverallHeight": 18.5, + "lidHeight": 60.0, + "overLabwareHeight": 0.0 + }, + "displayName": "Absorbance Plate Reader Module GEN1", + "gripperOffsets": {}, + "labwareOffset": { + "x": 0.0, + "y": 0.0, + "z": 0.65 + }, + "model": "absorbanceReaderV1", + "moduleType": "absorbanceReaderType", + "otSharedSchema": "module/schemas/2", + "quirks": [], + "slotTransforms": { + "ot2_short_trash": {}, + "ot2_standard": {}, + "ot3_standard": {} + } + }, + "model": "absorbanceReaderV1", + "moduleId": "UUID", + "serialNumber": "UUID" + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "4c98abe700f8e8b07fba59c9e44932aa", + "notes": [], + "params": { + "loadName": "opentrons_tough_pcr_auto_sealing_lid", + "location": { + "labwareId": "UUID" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [ + "labware", + "lid" + ], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "compatibleParentLabware": [ + "armadillo_96_wellplate_200ul_pcr_full_skirt", + "biorad_96_wellplate_200ul_pcr", + "opentrons_96_wellplate_200ul_pcr_full_skirt", + "opentrons_flex_deck_riser", + "opentrons_tough_pcr_auto_sealing_lid" + ], + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": -0.71 + }, + "dimensions": { + "xDimension": 127.7, + "yDimension": 85.48, + "zDimension": 12.8 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 7.91, + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0, + "y": 0.52, + "z": -6 + }, + "pickUpOffset": { + "x": 0, + "y": 0, + "z": 1.5 + } + }, + "lidDisposalOffsets": { + "dropOffset": { + "x": 0, + "y": 5.0, + "z": 50.0 + }, + "pickUpOffset": { + "x": 0, + "y": 0, + "z": 0 + } + }, + "lidOffsets": { + "dropOffset": { + "x": 0.5, + "y": 0, + "z": -1 + }, + "pickUpOffset": { + "x": 0.5, + "y": 0, + "z": -5 + } + } + }, + "groups": [ + { + "metadata": {}, + "wells": [] + } + ], + "metadata": { + "displayCategory": "lid", + "displayName": "Opentrons Tough PCR Auto-Sealing Lid", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [], + "parameters": { + "format": "irregular", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "opentrons_tough_pcr_auto_sealing_lid", + "quirks": [] + }, + "schemaVersion": 3, + "stackLimit": 5, + "stackingOffsetWithLabware": { + "armadillo_96_wellplate_200ul_pcr_full_skirt": { + "x": 0, + "y": 0, + "z": 8.193 + }, + "biorad_96_wellplate_200ul_pcr": { + "x": 0, + "y": 0, + "z": 8.08 + }, + "default": { + "x": 0, + "y": 0, + "z": 8.193 + }, + "opentrons_96_wellplate_200ul_pcr_full_skirt": { + "x": 0, + "y": 0, + "z": 8.193 + }, + "opentrons_flex_deck_riser": { + "x": 0, + "y": 0, + "z": 34 + }, + "opentrons_tough_pcr_auto_sealing_lid": { + "x": 0, + "y": 0, + "z": 6.492 + } + }, + "stackingOffsetWithModule": { + "thermocyclerModuleV2": { + "x": 0, + "y": 0, + "z": 0 + } + }, + "version": 1, + "wells": {} + }, + "labwareId": "UUID" + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "61052a1834817792ac57ca3c95f8906a", + "notes": [], + "params": { + "loadName": "opentrons_tough_pcr_auto_sealing_lid", + "location": { + "labwareId": "UUID" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [ + "labware", + "lid" + ], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "compatibleParentLabware": [ + "armadillo_96_wellplate_200ul_pcr_full_skirt", + "biorad_96_wellplate_200ul_pcr", + "opentrons_96_wellplate_200ul_pcr_full_skirt", + "opentrons_flex_deck_riser", + "opentrons_tough_pcr_auto_sealing_lid" + ], + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": -0.71 + }, + "dimensions": { + "xDimension": 127.7, + "yDimension": 85.48, + "zDimension": 12.8 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 7.91, + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0, + "y": 0.52, + "z": -6 + }, + "pickUpOffset": { + "x": 0, + "y": 0, + "z": 1.5 + } + }, + "lidDisposalOffsets": { + "dropOffset": { + "x": 0, + "y": 5.0, + "z": 50.0 + }, + "pickUpOffset": { + "x": 0, + "y": 0, + "z": 0 + } + }, + "lidOffsets": { + "dropOffset": { + "x": 0.5, + "y": 0, + "z": -1 + }, + "pickUpOffset": { + "x": 0.5, + "y": 0, + "z": -5 + } + } + }, + "groups": [ + { + "metadata": {}, + "wells": [] + } + ], + "metadata": { + "displayCategory": "lid", + "displayName": "Opentrons Tough PCR Auto-Sealing Lid", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [], + "parameters": { + "format": "irregular", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "opentrons_tough_pcr_auto_sealing_lid", + "quirks": [] + }, + "schemaVersion": 3, + "stackLimit": 5, + "stackingOffsetWithLabware": { + "armadillo_96_wellplate_200ul_pcr_full_skirt": { + "x": 0, + "y": 0, + "z": 8.193 + }, + "biorad_96_wellplate_200ul_pcr": { + "x": 0, + "y": 0, + "z": 8.08 + }, + "default": { + "x": 0, + "y": 0, + "z": 8.193 + }, + "opentrons_96_wellplate_200ul_pcr_full_skirt": { + "x": 0, + "y": 0, + "z": 8.193 + }, + "opentrons_flex_deck_riser": { + "x": 0, + "y": 0, + "z": 34 + }, + "opentrons_tough_pcr_auto_sealing_lid": { + "x": 0, + "y": 0, + "z": 6.492 + } + }, + "stackingOffsetWithModule": { + "thermocyclerModuleV2": { + "x": 0, + "y": 0, + "z": 0 + } + }, + "version": 1, + "wells": {} + }, + "labwareId": "UUID" + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "5a0196883a2bd94fe59741103a03ca9f", + "notes": [], + "params": { + "loadName": "opentrons_tough_pcr_auto_sealing_lid", + "location": { + "labwareId": "UUID" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [ + "labware", + "lid" + ], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "compatibleParentLabware": [ + "armadillo_96_wellplate_200ul_pcr_full_skirt", + "biorad_96_wellplate_200ul_pcr", + "opentrons_96_wellplate_200ul_pcr_full_skirt", + "opentrons_flex_deck_riser", + "opentrons_tough_pcr_auto_sealing_lid" + ], + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": -0.71 + }, + "dimensions": { + "xDimension": 127.7, + "yDimension": 85.48, + "zDimension": 12.8 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 7.91, + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0, + "y": 0.52, + "z": -6 + }, + "pickUpOffset": { + "x": 0, + "y": 0, + "z": 1.5 + } + }, + "lidDisposalOffsets": { + "dropOffset": { + "x": 0, + "y": 5.0, + "z": 50.0 + }, + "pickUpOffset": { + "x": 0, + "y": 0, + "z": 0 + } + }, + "lidOffsets": { + "dropOffset": { + "x": 0.5, + "y": 0, + "z": -1 + }, + "pickUpOffset": { + "x": 0.5, + "y": 0, + "z": -5 + } + } + }, + "groups": [ + { + "metadata": {}, + "wells": [] + } + ], + "metadata": { + "displayCategory": "lid", + "displayName": "Opentrons Tough PCR Auto-Sealing Lid", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [], + "parameters": { + "format": "irregular", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "opentrons_tough_pcr_auto_sealing_lid", + "quirks": [] + }, + "schemaVersion": 3, + "stackLimit": 5, + "stackingOffsetWithLabware": { + "armadillo_96_wellplate_200ul_pcr_full_skirt": { + "x": 0, + "y": 0, + "z": 8.193 + }, + "biorad_96_wellplate_200ul_pcr": { + "x": 0, + "y": 0, + "z": 8.08 + }, + "default": { + "x": 0, + "y": 0, + "z": 8.193 + }, + "opentrons_96_wellplate_200ul_pcr_full_skirt": { + "x": 0, + "y": 0, + "z": 8.193 + }, + "opentrons_flex_deck_riser": { + "x": 0, + "y": 0, + "z": 34 + }, + "opentrons_tough_pcr_auto_sealing_lid": { + "x": 0, + "y": 0, + "z": 6.492 + } + }, + "stackingOffsetWithModule": { + "thermocyclerModuleV2": { + "x": 0, + "y": 0, + "z": 0 + } + }, + "version": 1, + "wells": {} + }, + "labwareId": "UUID" + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "cbf8207de879666929089ae9482deb18", + "notes": [], + "params": { + "loadName": "opentrons_tough_pcr_auto_sealing_lid", + "location": { + "labwareId": "UUID" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [ + "labware", + "lid" + ], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "compatibleParentLabware": [ + "armadillo_96_wellplate_200ul_pcr_full_skirt", + "biorad_96_wellplate_200ul_pcr", + "opentrons_96_wellplate_200ul_pcr_full_skirt", + "opentrons_flex_deck_riser", + "opentrons_tough_pcr_auto_sealing_lid" + ], + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": -0.71 + }, + "dimensions": { + "xDimension": 127.7, + "yDimension": 85.48, + "zDimension": 12.8 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 7.91, + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0, + "y": 0.52, + "z": -6 + }, + "pickUpOffset": { + "x": 0, + "y": 0, + "z": 1.5 + } + }, + "lidDisposalOffsets": { + "dropOffset": { + "x": 0, + "y": 5.0, + "z": 50.0 + }, + "pickUpOffset": { + "x": 0, + "y": 0, + "z": 0 + } + }, + "lidOffsets": { + "dropOffset": { + "x": 0.5, + "y": 0, + "z": -1 + }, + "pickUpOffset": { + "x": 0.5, + "y": 0, + "z": -5 + } + } + }, + "groups": [ + { + "metadata": {}, + "wells": [] + } + ], + "metadata": { + "displayCategory": "lid", + "displayName": "Opentrons Tough PCR Auto-Sealing Lid", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [], + "parameters": { + "format": "irregular", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "opentrons_tough_pcr_auto_sealing_lid", + "quirks": [] + }, + "schemaVersion": 3, + "stackLimit": 5, + "stackingOffsetWithLabware": { + "armadillo_96_wellplate_200ul_pcr_full_skirt": { + "x": 0, + "y": 0, + "z": 8.193 + }, + "biorad_96_wellplate_200ul_pcr": { + "x": 0, + "y": 0, + "z": 8.08 + }, + "default": { + "x": 0, + "y": 0, + "z": 8.193 + }, + "opentrons_96_wellplate_200ul_pcr_full_skirt": { + "x": 0, + "y": 0, + "z": 8.193 + }, + "opentrons_flex_deck_riser": { + "x": 0, + "y": 0, + "z": 34 + }, + "opentrons_tough_pcr_auto_sealing_lid": { + "x": 0, + "y": 0, + "z": 6.492 + } + }, + "stackingOffsetWithModule": { + "thermocyclerModuleV2": { + "x": 0, + "y": 0, + "z": 0 + } + }, + "version": 1, + "wells": {} + }, + "labwareId": "UUID" + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "7708b9b51c3e7b6afd7abae3a8fe5a3d", + "notes": [], + "params": { + "loadName": "opentrons_tough_pcr_auto_sealing_lid", + "location": { + "labwareId": "UUID" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [ + "labware", + "lid" + ], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "compatibleParentLabware": [ + "armadillo_96_wellplate_200ul_pcr_full_skirt", + "biorad_96_wellplate_200ul_pcr", + "opentrons_96_wellplate_200ul_pcr_full_skirt", + "opentrons_flex_deck_riser", + "opentrons_tough_pcr_auto_sealing_lid" + ], + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": -0.71 + }, + "dimensions": { + "xDimension": 127.7, + "yDimension": 85.48, + "zDimension": 12.8 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 7.91, + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0, + "y": 0.52, + "z": -6 + }, + "pickUpOffset": { + "x": 0, + "y": 0, + "z": 1.5 + } + }, + "lidDisposalOffsets": { + "dropOffset": { + "x": 0, + "y": 5.0, + "z": 50.0 + }, + "pickUpOffset": { + "x": 0, + "y": 0, + "z": 0 + } + }, + "lidOffsets": { + "dropOffset": { + "x": 0.5, + "y": 0, + "z": -1 + }, + "pickUpOffset": { + "x": 0.5, + "y": 0, + "z": -5 + } + } + }, + "groups": [ + { + "metadata": {}, + "wells": [] + } + ], + "metadata": { + "displayCategory": "lid", + "displayName": "Opentrons Tough PCR Auto-Sealing Lid", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [], + "parameters": { + "format": "irregular", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "opentrons_tough_pcr_auto_sealing_lid", + "quirks": [] + }, + "schemaVersion": 3, + "stackLimit": 5, + "stackingOffsetWithLabware": { + "armadillo_96_wellplate_200ul_pcr_full_skirt": { + "x": 0, + "y": 0, + "z": 8.193 + }, + "biorad_96_wellplate_200ul_pcr": { + "x": 0, + "y": 0, + "z": 8.08 + }, + "default": { + "x": 0, + "y": 0, + "z": 8.193 + }, + "opentrons_96_wellplate_200ul_pcr_full_skirt": { + "x": 0, + "y": 0, + "z": 8.193 + }, + "opentrons_flex_deck_riser": { + "x": 0, + "y": 0, + "z": 34 + }, + "opentrons_tough_pcr_auto_sealing_lid": { + "x": 0, + "y": 0, + "z": 6.492 + } + }, + "stackingOffsetWithModule": { + "thermocyclerModuleV2": { + "x": 0, + "y": 0, + "z": 0 + } + }, + "version": 1, + "wells": {} + }, + "labwareId": "UUID" + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "thermocycler/openLid", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "16babbcf08868f1cd390f15f6382d439", + "notes": [], + "params": { + "moduleId": "UUID" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "1724a4af6ae0b4a1dd1d4a3bb979f2d9", + "notes": [], + "params": { + "moduleId": "UUID" + }, + "result": { + "pipetteRetracted": true + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "absorbanceReader/closeLid", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "1ca1ef496f94bdf2144e768ec088247a", + "notes": [], + "params": { + "moduleId": "UUID" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "absorbanceReader/initialize", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "457f0a0dfd866c188afdebdce5f2d1d2", + "notes": [], + "params": { + "measureMode": "single", + "moduleId": "UUID", + "referenceWavelength": 450, + "sampleWavelengths": [ + 600 + ] + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "absorbanceReader/openLid", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "cbedce386d6e0b1601924fe05f360e4a", + "notes": [], + "params": { + "moduleId": "UUID" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "e234d87c59112fd9ea52cf83d3242171", + "notes": [], + "params": { + "loadName": "opentrons_96_well_aluminum_block", + "location": { + "moduleId": "UUID" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [ + "adapter" + ], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 18.16 + }, + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0, + "y": 0, + "z": 0 + } + } + }, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "aluminumBlock", + "displayName": "Opentrons 96 Well Aluminum Block", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "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" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "opentrons_96_well_aluminum_block", + "quirks": [] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 14.38, + "y": 74.24, + "z": 3.38 + }, + "A10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 95.38, + "y": 74.24, + "z": 3.38 + }, + "A11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 104.38, + "y": 74.24, + "z": 3.38 + }, + "A12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 113.38, + "y": 74.24, + "z": 3.38 + }, + "A2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 23.38, + "y": 74.24, + "z": 3.38 + }, + "A3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 32.38, + "y": 74.24, + "z": 3.38 + }, + "A4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 41.38, + "y": 74.24, + "z": 3.38 + }, + "A5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 50.38, + "y": 74.24, + "z": 3.38 + }, + "A6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 59.38, + "y": 74.24, + "z": 3.38 + }, + "A7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 68.38, + "y": 74.24, + "z": 3.38 + }, + "A8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 77.38, + "y": 74.24, + "z": 3.38 + }, + "A9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 86.38, + "y": 74.24, + "z": 3.38 + }, + "B1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 14.38, + "y": 65.24, + "z": 3.38 + }, + "B10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 95.38, + "y": 65.24, + "z": 3.38 + }, + "B11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 104.38, + "y": 65.24, + "z": 3.38 + }, + "B12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 113.38, + "y": 65.24, + "z": 3.38 + }, + "B2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 23.38, + "y": 65.24, + "z": 3.38 + }, + "B3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 32.38, + "y": 65.24, + "z": 3.38 + }, + "B4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 41.38, + "y": 65.24, + "z": 3.38 + }, + "B5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 50.38, + "y": 65.24, + "z": 3.38 + }, + "B6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 59.38, + "y": 65.24, + "z": 3.38 + }, + "B7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 68.38, + "y": 65.24, + "z": 3.38 + }, + "B8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 77.38, + "y": 65.24, + "z": 3.38 + }, + "B9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 86.38, + "y": 65.24, + "z": 3.38 + }, + "C1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 14.38, + "y": 56.24, + "z": 3.38 + }, + "C10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 95.38, + "y": 56.24, + "z": 3.38 + }, + "C11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 104.38, + "y": 56.24, + "z": 3.38 + }, + "C12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 113.38, + "y": 56.24, + "z": 3.38 + }, + "C2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 23.38, + "y": 56.24, + "z": 3.38 + }, + "C3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 32.38, + "y": 56.24, + "z": 3.38 + }, + "C4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 41.38, + "y": 56.24, + "z": 3.38 + }, + "C5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 50.38, + "y": 56.24, + "z": 3.38 + }, + "C6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 59.38, + "y": 56.24, + "z": 3.38 + }, + "C7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 68.38, + "y": 56.24, + "z": 3.38 + }, + "C8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 77.38, + "y": 56.24, + "z": 3.38 + }, + "C9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 86.38, + "y": 56.24, + "z": 3.38 + }, + "D1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 14.38, + "y": 47.24, + "z": 3.38 + }, + "D10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 95.38, + "y": 47.24, + "z": 3.38 + }, + "D11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 104.38, + "y": 47.24, + "z": 3.38 + }, + "D12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 113.38, + "y": 47.24, + "z": 3.38 + }, + "D2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 23.38, + "y": 47.24, + "z": 3.38 + }, + "D3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 32.38, + "y": 47.24, + "z": 3.38 + }, + "D4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 41.38, + "y": 47.24, + "z": 3.38 + }, + "D5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 50.38, + "y": 47.24, + "z": 3.38 + }, + "D6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 59.38, + "y": 47.24, + "z": 3.38 + }, + "D7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 68.38, + "y": 47.24, + "z": 3.38 + }, + "D8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 77.38, + "y": 47.24, + "z": 3.38 + }, + "D9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 86.38, + "y": 47.24, + "z": 3.38 + }, + "E1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 14.38, + "y": 38.24, + "z": 3.38 + }, + "E10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 95.38, + "y": 38.24, + "z": 3.38 + }, + "E11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 104.38, + "y": 38.24, + "z": 3.38 + }, + "E12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 113.38, + "y": 38.24, + "z": 3.38 + }, + "E2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 23.38, + "y": 38.24, + "z": 3.38 + }, + "E3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 32.38, + "y": 38.24, + "z": 3.38 + }, + "E4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 41.38, + "y": 38.24, + "z": 3.38 + }, + "E5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 50.38, + "y": 38.24, + "z": 3.38 + }, + "E6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 59.38, + "y": 38.24, + "z": 3.38 + }, + "E7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 68.38, + "y": 38.24, + "z": 3.38 + }, + "E8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 77.38, + "y": 38.24, + "z": 3.38 + }, + "E9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 86.38, + "y": 38.24, + "z": 3.38 + }, + "F1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 14.38, + "y": 29.24, + "z": 3.38 + }, + "F10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 95.38, + "y": 29.24, + "z": 3.38 + }, + "F11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 104.38, + "y": 29.24, + "z": 3.38 + }, + "F12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 113.38, + "y": 29.24, + "z": 3.38 + }, + "F2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 23.38, + "y": 29.24, + "z": 3.38 + }, + "F3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 32.38, + "y": 29.24, + "z": 3.38 + }, + "F4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 41.38, + "y": 29.24, + "z": 3.38 + }, + "F5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 50.38, + "y": 29.24, + "z": 3.38 + }, + "F6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 59.38, + "y": 29.24, + "z": 3.38 + }, + "F7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 68.38, + "y": 29.24, + "z": 3.38 + }, + "F8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 77.38, + "y": 29.24, + "z": 3.38 + }, + "F9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 86.38, + "y": 29.24, + "z": 3.38 + }, + "G1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 14.38, + "y": 20.24, + "z": 3.38 + }, + "G10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 95.38, + "y": 20.24, + "z": 3.38 + }, + "G11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 104.38, + "y": 20.24, + "z": 3.38 + }, + "G12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 113.38, + "y": 20.24, + "z": 3.38 + }, + "G2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 23.38, + "y": 20.24, + "z": 3.38 + }, + "G3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 32.38, + "y": 20.24, + "z": 3.38 + }, + "G4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 41.38, + "y": 20.24, + "z": 3.38 + }, + "G5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 50.38, + "y": 20.24, + "z": 3.38 + }, + "G6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 59.38, + "y": 20.24, + "z": 3.38 + }, + "G7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 68.38, + "y": 20.24, + "z": 3.38 + }, + "G8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 77.38, + "y": 20.24, + "z": 3.38 + }, + "G9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 86.38, + "y": 20.24, + "z": 3.38 + }, + "H1": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 14.38, + "y": 11.24, + "z": 3.38 + }, + "H10": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 95.38, + "y": 11.24, + "z": 3.38 + }, + "H11": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 104.38, + "y": 11.24, + "z": 3.38 + }, + "H12": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 113.38, + "y": 11.24, + "z": 3.38 + }, + "H2": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 23.38, + "y": 11.24, + "z": 3.38 + }, + "H3": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 32.38, + "y": 11.24, + "z": 3.38 + }, + "H4": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 41.38, + "y": 11.24, + "z": 3.38 + }, + "H5": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 50.38, + "y": 11.24, + "z": 3.38 + }, + "H6": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 59.38, + "y": 11.24, + "z": 3.38 + }, + "H7": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 68.38, + "y": 11.24, + "z": 3.38 + }, + "H8": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 77.38, + "y": 11.24, + "z": 3.38 + }, + "H9": { + "depth": 14.78, + "diameter": 5.34, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 86.38, + "y": 11.24, + "z": 3.38 + } + } + }, + "labwareId": "UUID" + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "2b9be36c72ca44069f3f7e9b4836f345", + "notes": [], + "params": { + "loadName": "opentrons_96_pcr_adapter", + "location": { + "moduleId": "UUID" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [ + "adapter" + ], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 8.5, + "y": 5.5, + "z": 0 + }, + "dimensions": { + "xDimension": 111, + "yDimension": 75, + "zDimension": 13.85 + }, + "gripperOffsets": { + "default": { + "dropOffset": { + "x": 0, + "y": 0, + "z": 1.0 + }, + "pickUpOffset": { + "x": 0, + "y": 0, + "z": 0 + } + } + }, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "adapter", + "displayName": "Opentrons 96 PCR Heater-Shaker Adapter", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "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" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "opentrons_96_pcr_adapter", + "quirks": [] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 6, + "y": 69, + "z": 1.85 + }, + "A10": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 87, + "y": 69, + "z": 1.85 + }, + "A11": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 96, + "y": 69, + "z": 1.85 + }, + "A12": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 105, + "y": 69, + "z": 1.85 + }, + "A2": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 15, + "y": 69, + "z": 1.85 + }, + "A3": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 24, + "y": 69, + "z": 1.85 + }, + "A4": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 33, + "y": 69, + "z": 1.85 + }, + "A5": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 42, + "y": 69, + "z": 1.85 + }, + "A6": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 51, + "y": 69, + "z": 1.85 + }, + "A7": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 60, + "y": 69, + "z": 1.85 + }, + "A8": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 69, + "y": 69, + "z": 1.85 + }, + "A9": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 78, + "y": 69, + "z": 1.85 + }, + "B1": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 6, + "y": 60, + "z": 1.85 + }, + "B10": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 87, + "y": 60, + "z": 1.85 + }, + "B11": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 96, + "y": 60, + "z": 1.85 + }, + "B12": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 105, + "y": 60, + "z": 1.85 + }, + "B2": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 15, + "y": 60, + "z": 1.85 + }, + "B3": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 24, + "y": 60, + "z": 1.85 + }, + "B4": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 33, + "y": 60, + "z": 1.85 + }, + "B5": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 42, + "y": 60, + "z": 1.85 + }, + "B6": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 51, + "y": 60, + "z": 1.85 + }, + "B7": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 60, + "y": 60, + "z": 1.85 + }, + "B8": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 69, + "y": 60, + "z": 1.85 + }, + "B9": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 78, + "y": 60, + "z": 1.85 + }, + "C1": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 6, + "y": 51, + "z": 1.85 + }, + "C10": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 87, + "y": 51, + "z": 1.85 + }, + "C11": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 96, + "y": 51, + "z": 1.85 + }, + "C12": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 105, + "y": 51, + "z": 1.85 + }, + "C2": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 15, + "y": 51, + "z": 1.85 + }, + "C3": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 24, + "y": 51, + "z": 1.85 + }, + "C4": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 33, + "y": 51, + "z": 1.85 + }, + "C5": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 42, + "y": 51, + "z": 1.85 + }, + "C6": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 51, + "y": 51, + "z": 1.85 + }, + "C7": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 60, + "y": 51, + "z": 1.85 + }, + "C8": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 69, + "y": 51, + "z": 1.85 + }, + "C9": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 78, + "y": 51, + "z": 1.85 + }, + "D1": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 6, + "y": 42, + "z": 1.85 + }, + "D10": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 87, + "y": 42, + "z": 1.85 + }, + "D11": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 96, + "y": 42, + "z": 1.85 + }, + "D12": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 105, + "y": 42, + "z": 1.85 + }, + "D2": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 15, + "y": 42, + "z": 1.85 + }, + "D3": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 24, + "y": 42, + "z": 1.85 + }, + "D4": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 33, + "y": 42, + "z": 1.85 + }, + "D5": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 42, + "y": 42, + "z": 1.85 + }, + "D6": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 51, + "y": 42, + "z": 1.85 + }, + "D7": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 60, + "y": 42, + "z": 1.85 + }, + "D8": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 69, + "y": 42, + "z": 1.85 + }, + "D9": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 78, + "y": 42, + "z": 1.85 + }, + "E1": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 6, + "y": 33, + "z": 1.85 + }, + "E10": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 87, + "y": 33, + "z": 1.85 + }, + "E11": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 96, + "y": 33, + "z": 1.85 + }, + "E12": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 105, + "y": 33, + "z": 1.85 + }, + "E2": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 15, + "y": 33, + "z": 1.85 + }, + "E3": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 24, + "y": 33, + "z": 1.85 + }, + "E4": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 33, + "y": 33, + "z": 1.85 + }, + "E5": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 42, + "y": 33, + "z": 1.85 + }, + "E6": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 51, + "y": 33, + "z": 1.85 + }, + "E7": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 60, + "y": 33, + "z": 1.85 + }, + "E8": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 69, + "y": 33, + "z": 1.85 + }, + "E9": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 78, + "y": 33, + "z": 1.85 + }, + "F1": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 6, + "y": 24, + "z": 1.85 + }, + "F10": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 87, + "y": 24, + "z": 1.85 + }, + "F11": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 96, + "y": 24, + "z": 1.85 + }, + "F12": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 105, + "y": 24, + "z": 1.85 + }, + "F2": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 15, + "y": 24, + "z": 1.85 + }, + "F3": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 24, + "y": 24, + "z": 1.85 + }, + "F4": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 33, + "y": 24, + "z": 1.85 + }, + "F5": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 42, + "y": 24, + "z": 1.85 + }, + "F6": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 51, + "y": 24, + "z": 1.85 + }, + "F7": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 60, + "y": 24, + "z": 1.85 + }, + "F8": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 69, + "y": 24, + "z": 1.85 + }, + "F9": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 78, + "y": 24, + "z": 1.85 + }, + "G1": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 6, + "y": 15, + "z": 1.85 + }, + "G10": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 87, + "y": 15, + "z": 1.85 + }, + "G11": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 96, + "y": 15, + "z": 1.85 + }, + "G12": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 105, + "y": 15, + "z": 1.85 + }, + "G2": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 15, + "y": 15, + "z": 1.85 + }, + "G3": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 24, + "y": 15, + "z": 1.85 + }, + "G4": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 33, + "y": 15, + "z": 1.85 + }, + "G5": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 42, + "y": 15, + "z": 1.85 + }, + "G6": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 51, + "y": 15, + "z": 1.85 + }, + "G7": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 60, + "y": 15, + "z": 1.85 + }, + "G8": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 69, + "y": 15, + "z": 1.85 + }, + "G9": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 78, + "y": 15, + "z": 1.85 + }, + "H1": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 6, + "y": 6, + "z": 1.85 + }, + "H10": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 87, + "y": 6, + "z": 1.85 + }, + "H11": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 96, + "y": 6, + "z": 1.85 + }, + "H12": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 105, + "y": 6, + "z": 1.85 + }, + "H2": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 15, + "y": 6, + "z": 1.85 + }, + "H3": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 24, + "y": 6, + "z": 1.85 + }, + "H4": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 33, + "y": 6, + "z": 1.85 + }, + "H5": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 42, + "y": 6, + "z": 1.85 + }, + "H6": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 51, + "y": 6, + "z": 1.85 + }, + "H7": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 60, + "y": 6, + "z": 1.85 + }, + "H8": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 69, + "y": 6, + "z": 1.85 + }, + "H9": { + "depth": 12, + "diameter": 5.64, + "shape": "circular", + "totalLiquidVolume": 0, + "x": 78, + "y": 6, + "z": 1.85 + } + } + }, + "labwareId": "UUID" + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "507480a9ad4e135e7a7d36ffd6d2d8e6", + "notes": [], + "params": { + "loadName": "nest_1_reservoir_290ml", + "location": { + "slotName": "D2" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "NEST", + "brandId": [ + "360206", + "360266" + ], + "links": [ + "https://www.nest-biotech.com/reagent-reserviors" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.47, + "zDimension": 44.4 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1" + ] + } + ], + "metadata": { + "displayCategory": "reservoir", + "displayName": "NEST 1 Well Reservoir 290 mL", + "displayVolumeUnits": "mL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1" + ] + ], + "parameters": { + "format": "trough", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "nest_1_reservoir_290ml", + "quirks": [ + "centerMultichannelOnWells", + "touchTipDisabled" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 39.55, + "shape": "rectangular", + "totalLiquidVolume": 290000, + "x": 63.88, + "xDimension": 106.8, + "y": 42.74, + "yDimension": 71.2, + "z": 4.85 + } + } + }, + "labwareId": "UUID" + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "8ae6e077abe5453762e935d116fca696", + "notes": [], + "params": { + "loadName": "opentrons_96_wellplate_200ul_pcr_full_skirt", + "location": { + "slotName": "C2" + }, + "namespace": "opentrons", + "version": 2 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [ + "991-00076" + ], + "links": [ + "https://shop.opentrons.com/tough-0.2-ml-96-well-pcr-plate-full-skirt/" + ] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 16.0 + }, + "gripForce": 15.0, + "gripHeightFromLabwareBottom": 10.0, + "gripperOffsets": {}, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "wellPlate", + "displayName": "Opentrons Tough 96 Well Plate 200 µL PCR Full Skirt", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "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" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": true, + "isTiprack": false, + "loadName": "opentrons_96_wellplate_200ul_pcr_full_skirt" + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_96_pcr_adapter": { + "x": 0, + "y": 0, + "z": 10.95 + }, + "opentrons_96_well_aluminum_block": { + "x": 0, + "y": 0, + "z": 11.91 + } + }, + "stackingOffsetWithModule": { + "magneticBlockV1": { + "x": 0, + "y": 0, + "z": 3.54 + }, + "thermocyclerModuleV2": { + "x": 0, + "y": 0, + "z": 10.7 + } + }, + "version": 2, + "wells": { + "A1": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 74.24, + "z": 1.05 + }, + "A10": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 74.24, + "z": 1.05 + }, + "A11": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 74.24, + "z": 1.05 + }, + "A12": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 74.24, + "z": 1.05 + }, + "A2": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 74.24, + "z": 1.05 + }, + "A3": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 74.24, + "z": 1.05 + }, + "A4": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 74.24, + "z": 1.05 + }, + "A5": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 74.24, + "z": 1.05 + }, + "A6": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 74.24, + "z": 1.05 + }, + "A7": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 74.24, + "z": 1.05 + }, + "A8": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 74.24, + "z": 1.05 + }, + "A9": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 74.24, + "z": 1.05 + }, + "B1": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 65.24, + "z": 1.05 + }, + "B10": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 65.24, + "z": 1.05 + }, + "B11": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 65.24, + "z": 1.05 + }, + "B12": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 65.24, + "z": 1.05 + }, + "B2": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 65.24, + "z": 1.05 + }, + "B3": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 65.24, + "z": 1.05 + }, + "B4": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 65.24, + "z": 1.05 + }, + "B5": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 65.24, + "z": 1.05 + }, + "B6": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 65.24, + "z": 1.05 + }, + "B7": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 65.24, + "z": 1.05 + }, + "B8": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 65.24, + "z": 1.05 + }, + "B9": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 65.24, + "z": 1.05 + }, + "C1": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 56.24, + "z": 1.05 + }, + "C10": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 56.24, + "z": 1.05 + }, + "C11": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 56.24, + "z": 1.05 + }, + "C12": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 56.24, + "z": 1.05 + }, + "C2": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 56.24, + "z": 1.05 + }, + "C3": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 56.24, + "z": 1.05 + }, + "C4": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 56.24, + "z": 1.05 + }, + "C5": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 56.24, + "z": 1.05 + }, + "C6": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 56.24, + "z": 1.05 + }, + "C7": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 56.24, + "z": 1.05 + }, + "C8": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 56.24, + "z": 1.05 + }, + "C9": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 56.24, + "z": 1.05 + }, + "D1": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 47.24, + "z": 1.05 + }, + "D10": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 47.24, + "z": 1.05 + }, + "D11": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 47.24, + "z": 1.05 + }, + "D12": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 47.24, + "z": 1.05 + }, + "D2": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 47.24, + "z": 1.05 + }, + "D3": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 47.24, + "z": 1.05 + }, + "D4": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 47.24, + "z": 1.05 + }, + "D5": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 47.24, + "z": 1.05 + }, + "D6": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 47.24, + "z": 1.05 + }, + "D7": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 47.24, + "z": 1.05 + }, + "D8": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 47.24, + "z": 1.05 + }, + "D9": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 47.24, + "z": 1.05 + }, + "E1": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 38.24, + "z": 1.05 + }, + "E10": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 38.24, + "z": 1.05 + }, + "E11": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 38.24, + "z": 1.05 + }, + "E12": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 38.24, + "z": 1.05 + }, + "E2": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 38.24, + "z": 1.05 + }, + "E3": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 38.24, + "z": 1.05 + }, + "E4": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 38.24, + "z": 1.05 + }, + "E5": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 38.24, + "z": 1.05 + }, + "E6": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 38.24, + "z": 1.05 + }, + "E7": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 38.24, + "z": 1.05 + }, + "E8": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 38.24, + "z": 1.05 + }, + "E9": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 38.24, + "z": 1.05 + }, + "F1": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 29.24, + "z": 1.05 + }, + "F10": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 29.24, + "z": 1.05 + }, + "F11": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 29.24, + "z": 1.05 + }, + "F12": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 29.24, + "z": 1.05 + }, + "F2": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 29.24, + "z": 1.05 + }, + "F3": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 29.24, + "z": 1.05 + }, + "F4": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 29.24, + "z": 1.05 + }, + "F5": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 29.24, + "z": 1.05 + }, + "F6": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 29.24, + "z": 1.05 + }, + "F7": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 29.24, + "z": 1.05 + }, + "F8": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 29.24, + "z": 1.05 + }, + "F9": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 29.24, + "z": 1.05 + }, + "G1": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 20.24, + "z": 1.05 + }, + "G10": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 20.24, + "z": 1.05 + }, + "G11": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 20.24, + "z": 1.05 + }, + "G12": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 20.24, + "z": 1.05 + }, + "G2": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 20.24, + "z": 1.05 + }, + "G3": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 20.24, + "z": 1.05 + }, + "G4": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 20.24, + "z": 1.05 + }, + "G5": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 20.24, + "z": 1.05 + }, + "G6": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 20.24, + "z": 1.05 + }, + "G7": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 20.24, + "z": 1.05 + }, + "G8": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 20.24, + "z": 1.05 + }, + "G9": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 20.24, + "z": 1.05 + }, + "H1": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 14.38, + "y": 11.24, + "z": 1.05 + }, + "H10": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 95.38, + "y": 11.24, + "z": 1.05 + }, + "H11": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 104.38, + "y": 11.24, + "z": 1.05 + }, + "H12": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 113.38, + "y": 11.24, + "z": 1.05 + }, + "H2": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 23.38, + "y": 11.24, + "z": 1.05 + }, + "H3": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 32.38, + "y": 11.24, + "z": 1.05 + }, + "H4": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 41.38, + "y": 11.24, + "z": 1.05 + }, + "H5": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 50.38, + "y": 11.24, + "z": 1.05 + }, + "H6": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 59.38, + "y": 11.24, + "z": 1.05 + }, + "H7": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 68.38, + "y": 11.24, + "z": 1.05 + }, + "H8": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 77.38, + "y": 11.24, + "z": 1.05 + }, + "H9": { + "depth": 14.95, + "diameter": 5.5, + "shape": "circular", + "totalLiquidVolume": 200, + "x": 86.38, + "y": 11.24, + "z": 1.05 + } + } + }, + "labwareId": "UUID" + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "8a9b3ed81e0357a321f879efe1c8bc00", + "notes": [], + "params": { + "loadName": "opentrons_flex_96_tiprack_adapter", + "location": { + "slotName": "A2" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [ + "adapter" + ], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": -14.25, + "y": -3.5, + "z": 0 + }, + "dimensions": { + "xDimension": 156.5, + "yDimension": 93, + "zDimension": 132 + }, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [] + } + ], + "metadata": { + "displayCategory": "adapter", + "displayName": "Opentrons Flex 96 Tip Rack Adapter", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": false, + "loadName": "opentrons_flex_96_tiprack_adapter", + "quirks": [ + "tiprackAdapterFor96Channel" + ] + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": {}, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": {} + }, + "labwareId": "UUID" + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "a59c403d3ddb2ed94d8377fdf2d634b2", + "notes": [], + "params": { + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": { + "labwareId": "UUID" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.75, + "zDimension": 99 + }, + "gripForce": 16.0, + "gripHeightFromLabwareBottom": 23.9, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 1000 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "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" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_flex_96_tiprack_1000ul", + "quirks": [], + "tipLength": 95.6, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121 + } + }, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 74.38, + "z": 1.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 74.38, + "z": 1.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 74.38, + "z": 1.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 74.38, + "z": 1.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 74.38, + "z": 1.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 74.38, + "z": 1.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 74.38, + "z": 1.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 74.38, + "z": 1.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 74.38, + "z": 1.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 74.38, + "z": 1.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 74.38, + "z": 1.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 74.38, + "z": 1.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 65.38, + "z": 1.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 65.38, + "z": 1.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 65.38, + "z": 1.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 65.38, + "z": 1.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 65.38, + "z": 1.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 65.38, + "z": 1.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 65.38, + "z": 1.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 65.38, + "z": 1.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 65.38, + "z": 1.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 65.38, + "z": 1.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 65.38, + "z": 1.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 65.38, + "z": 1.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 56.38, + "z": 1.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 56.38, + "z": 1.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 56.38, + "z": 1.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 56.38, + "z": 1.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 56.38, + "z": 1.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 56.38, + "z": 1.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 56.38, + "z": 1.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 56.38, + "z": 1.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 56.38, + "z": 1.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 56.38, + "z": 1.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 56.38, + "z": 1.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 56.38, + "z": 1.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 47.38, + "z": 1.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 47.38, + "z": 1.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 47.38, + "z": 1.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 47.38, + "z": 1.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 47.38, + "z": 1.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 47.38, + "z": 1.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 47.38, + "z": 1.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 47.38, + "z": 1.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 47.38, + "z": 1.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 47.38, + "z": 1.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 47.38, + "z": 1.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 47.38, + "z": 1.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 38.38, + "z": 1.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 38.38, + "z": 1.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 38.38, + "z": 1.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 38.38, + "z": 1.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 38.38, + "z": 1.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 38.38, + "z": 1.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 38.38, + "z": 1.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 38.38, + "z": 1.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 38.38, + "z": 1.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 38.38, + "z": 1.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 38.38, + "z": 1.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 38.38, + "z": 1.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 29.38, + "z": 1.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 29.38, + "z": 1.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 29.38, + "z": 1.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 29.38, + "z": 1.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 29.38, + "z": 1.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 29.38, + "z": 1.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 29.38, + "z": 1.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 29.38, + "z": 1.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 29.38, + "z": 1.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 29.38, + "z": 1.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 29.38, + "z": 1.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 29.38, + "z": 1.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 20.38, + "z": 1.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 20.38, + "z": 1.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 20.38, + "z": 1.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 20.38, + "z": 1.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 20.38, + "z": 1.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 20.38, + "z": 1.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 20.38, + "z": 1.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 20.38, + "z": 1.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 20.38, + "z": 1.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 20.38, + "z": 1.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 20.38, + "z": 1.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 20.38, + "z": 1.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 11.38, + "z": 1.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 11.38, + "z": 1.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 11.38, + "z": 1.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 11.38, + "z": 1.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 11.38, + "z": 1.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 11.38, + "z": 1.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 11.38, + "z": 1.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 11.38, + "z": 1.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 11.38, + "z": 1.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 11.38, + "z": 1.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 11.38, + "z": 1.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 11.38, + "z": 1.5 + } + } + }, + "labwareId": "UUID" + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "17ae05bacb1938a44ffcedba774adf48", + "notes": [], + "params": { + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": { + "slotName": "C3" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.75, + "zDimension": 99 + }, + "gripForce": 16.0, + "gripHeightFromLabwareBottom": 23.9, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 1000 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "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" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_flex_96_tiprack_1000ul", + "quirks": [], + "tipLength": 95.6, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121 + } + }, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 74.38, + "z": 1.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 74.38, + "z": 1.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 74.38, + "z": 1.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 74.38, + "z": 1.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 74.38, + "z": 1.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 74.38, + "z": 1.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 74.38, + "z": 1.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 74.38, + "z": 1.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 74.38, + "z": 1.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 74.38, + "z": 1.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 74.38, + "z": 1.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 74.38, + "z": 1.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 65.38, + "z": 1.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 65.38, + "z": 1.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 65.38, + "z": 1.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 65.38, + "z": 1.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 65.38, + "z": 1.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 65.38, + "z": 1.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 65.38, + "z": 1.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 65.38, + "z": 1.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 65.38, + "z": 1.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 65.38, + "z": 1.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 65.38, + "z": 1.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 65.38, + "z": 1.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 56.38, + "z": 1.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 56.38, + "z": 1.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 56.38, + "z": 1.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 56.38, + "z": 1.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 56.38, + "z": 1.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 56.38, + "z": 1.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 56.38, + "z": 1.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 56.38, + "z": 1.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 56.38, + "z": 1.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 56.38, + "z": 1.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 56.38, + "z": 1.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 56.38, + "z": 1.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 47.38, + "z": 1.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 47.38, + "z": 1.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 47.38, + "z": 1.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 47.38, + "z": 1.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 47.38, + "z": 1.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 47.38, + "z": 1.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 47.38, + "z": 1.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 47.38, + "z": 1.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 47.38, + "z": 1.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 47.38, + "z": 1.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 47.38, + "z": 1.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 47.38, + "z": 1.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 38.38, + "z": 1.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 38.38, + "z": 1.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 38.38, + "z": 1.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 38.38, + "z": 1.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 38.38, + "z": 1.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 38.38, + "z": 1.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 38.38, + "z": 1.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 38.38, + "z": 1.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 38.38, + "z": 1.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 38.38, + "z": 1.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 38.38, + "z": 1.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 38.38, + "z": 1.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 29.38, + "z": 1.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 29.38, + "z": 1.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 29.38, + "z": 1.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 29.38, + "z": 1.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 29.38, + "z": 1.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 29.38, + "z": 1.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 29.38, + "z": 1.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 29.38, + "z": 1.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 29.38, + "z": 1.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 29.38, + "z": 1.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 29.38, + "z": 1.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 29.38, + "z": 1.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 20.38, + "z": 1.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 20.38, + "z": 1.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 20.38, + "z": 1.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 20.38, + "z": 1.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 20.38, + "z": 1.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 20.38, + "z": 1.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 20.38, + "z": 1.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 20.38, + "z": 1.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 20.38, + "z": 1.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 20.38, + "z": 1.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 20.38, + "z": 1.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 20.38, + "z": 1.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 11.38, + "z": 1.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 11.38, + "z": 1.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 11.38, + "z": 1.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 11.38, + "z": 1.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 11.38, + "z": 1.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 11.38, + "z": 1.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 11.38, + "z": 1.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 11.38, + "z": 1.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 11.38, + "z": 1.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 11.38, + "z": 1.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 11.38, + "z": 1.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 11.38, + "z": 1.5 + } + } + }, + "labwareId": "UUID" + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "26fd355fdb8b0c88fb550b0f1f1efd5d", + "notes": [], + "params": { + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": { + "addressableAreaName": "C4" + }, + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.75, + "zDimension": 99 + }, + "gripForce": 16.0, + "gripHeightFromLabwareBottom": 23.9, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 1000 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "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" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_flex_96_tiprack_1000ul", + "quirks": [], + "tipLength": 95.6, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121 + } + }, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 74.38, + "z": 1.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 74.38, + "z": 1.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 74.38, + "z": 1.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 74.38, + "z": 1.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 74.38, + "z": 1.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 74.38, + "z": 1.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 74.38, + "z": 1.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 74.38, + "z": 1.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 74.38, + "z": 1.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 74.38, + "z": 1.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 74.38, + "z": 1.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 74.38, + "z": 1.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 65.38, + "z": 1.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 65.38, + "z": 1.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 65.38, + "z": 1.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 65.38, + "z": 1.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 65.38, + "z": 1.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 65.38, + "z": 1.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 65.38, + "z": 1.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 65.38, + "z": 1.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 65.38, + "z": 1.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 65.38, + "z": 1.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 65.38, + "z": 1.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 65.38, + "z": 1.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 56.38, + "z": 1.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 56.38, + "z": 1.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 56.38, + "z": 1.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 56.38, + "z": 1.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 56.38, + "z": 1.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 56.38, + "z": 1.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 56.38, + "z": 1.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 56.38, + "z": 1.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 56.38, + "z": 1.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 56.38, + "z": 1.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 56.38, + "z": 1.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 56.38, + "z": 1.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 47.38, + "z": 1.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 47.38, + "z": 1.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 47.38, + "z": 1.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 47.38, + "z": 1.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 47.38, + "z": 1.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 47.38, + "z": 1.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 47.38, + "z": 1.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 47.38, + "z": 1.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 47.38, + "z": 1.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 47.38, + "z": 1.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 47.38, + "z": 1.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 47.38, + "z": 1.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 38.38, + "z": 1.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 38.38, + "z": 1.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 38.38, + "z": 1.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 38.38, + "z": 1.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 38.38, + "z": 1.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 38.38, + "z": 1.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 38.38, + "z": 1.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 38.38, + "z": 1.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 38.38, + "z": 1.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 38.38, + "z": 1.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 38.38, + "z": 1.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 38.38, + "z": 1.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 29.38, + "z": 1.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 29.38, + "z": 1.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 29.38, + "z": 1.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 29.38, + "z": 1.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 29.38, + "z": 1.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 29.38, + "z": 1.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 29.38, + "z": 1.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 29.38, + "z": 1.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 29.38, + "z": 1.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 29.38, + "z": 1.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 29.38, + "z": 1.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 29.38, + "z": 1.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 20.38, + "z": 1.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 20.38, + "z": 1.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 20.38, + "z": 1.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 20.38, + "z": 1.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 20.38, + "z": 1.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 20.38, + "z": 1.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 20.38, + "z": 1.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 20.38, + "z": 1.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 20.38, + "z": 1.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 20.38, + "z": 1.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 20.38, + "z": 1.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 20.38, + "z": 1.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 11.38, + "z": 1.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 11.38, + "z": 1.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 11.38, + "z": 1.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 11.38, + "z": 1.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 11.38, + "z": 1.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 11.38, + "z": 1.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 11.38, + "z": 1.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 11.38, + "z": 1.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 11.38, + "z": 1.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 11.38, + "z": 1.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 11.38, + "z": 1.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 11.38, + "z": 1.5 + } + } + }, + "labwareId": "UUID" + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "loadLabware", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "8536492bbcebe772a2f733df19c99c4f", + "notes": [], + "params": { + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": "offDeck", + "namespace": "opentrons", + "version": 1 + }, + "result": { + "definition": { + "allowedRoles": [], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.75, + "zDimension": 99 + }, + "gripForce": 16.0, + "gripHeightFromLabwareBottom": 23.9, + "gripperOffsets": {}, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "A10", + "A11", + "A12", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "B1", + "B10", + "B11", + "B12", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "C1", + "C10", + "C11", + "C12", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "D1", + "D10", + "D11", + "D12", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "E1", + "E10", + "E11", + "E12", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "F1", + "F10", + "F11", + "F12", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "G1", + "G10", + "G11", + "G12", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "H1", + "H10", + "H11", + "H12", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9" + ] + } + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Opentrons Flex 96 Tip Rack 1000 µL", + "displayVolumeUnits": "µL", + "tags": [] + }, + "namespace": "opentrons", + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ], + [ + "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" + ] + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "opentrons_flex_96_tiprack_1000ul", + "quirks": [], + "tipLength": 95.6, + "tipOverlap": 10.5 + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121 + } + }, + "stackingOffsetWithModule": {}, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 74.38, + "z": 1.5 + }, + "A10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 74.38, + "z": 1.5 + }, + "A11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 74.38, + "z": 1.5 + }, + "A12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 74.38, + "z": 1.5 + }, + "A2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 74.38, + "z": 1.5 + }, + "A3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 74.38, + "z": 1.5 + }, + "A4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 74.38, + "z": 1.5 + }, + "A5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 74.38, + "z": 1.5 + }, + "A6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 74.38, + "z": 1.5 + }, + "A7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 74.38, + "z": 1.5 + }, + "A8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 74.38, + "z": 1.5 + }, + "A9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 74.38, + "z": 1.5 + }, + "B1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 65.38, + "z": 1.5 + }, + "B10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 65.38, + "z": 1.5 + }, + "B11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 65.38, + "z": 1.5 + }, + "B12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 65.38, + "z": 1.5 + }, + "B2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 65.38, + "z": 1.5 + }, + "B3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 65.38, + "z": 1.5 + }, + "B4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 65.38, + "z": 1.5 + }, + "B5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 65.38, + "z": 1.5 + }, + "B6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 65.38, + "z": 1.5 + }, + "B7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 65.38, + "z": 1.5 + }, + "B8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 65.38, + "z": 1.5 + }, + "B9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 65.38, + "z": 1.5 + }, + "C1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 56.38, + "z": 1.5 + }, + "C10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 56.38, + "z": 1.5 + }, + "C11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 56.38, + "z": 1.5 + }, + "C12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 56.38, + "z": 1.5 + }, + "C2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 56.38, + "z": 1.5 + }, + "C3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 56.38, + "z": 1.5 + }, + "C4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 56.38, + "z": 1.5 + }, + "C5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 56.38, + "z": 1.5 + }, + "C6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 56.38, + "z": 1.5 + }, + "C7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 56.38, + "z": 1.5 + }, + "C8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 56.38, + "z": 1.5 + }, + "C9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 56.38, + "z": 1.5 + }, + "D1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 47.38, + "z": 1.5 + }, + "D10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 47.38, + "z": 1.5 + }, + "D11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 47.38, + "z": 1.5 + }, + "D12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 47.38, + "z": 1.5 + }, + "D2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 47.38, + "z": 1.5 + }, + "D3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 47.38, + "z": 1.5 + }, + "D4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 47.38, + "z": 1.5 + }, + "D5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 47.38, + "z": 1.5 + }, + "D6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 47.38, + "z": 1.5 + }, + "D7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 47.38, + "z": 1.5 + }, + "D8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 47.38, + "z": 1.5 + }, + "D9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 47.38, + "z": 1.5 + }, + "E1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 38.38, + "z": 1.5 + }, + "E10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 38.38, + "z": 1.5 + }, + "E11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 38.38, + "z": 1.5 + }, + "E12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 38.38, + "z": 1.5 + }, + "E2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 38.38, + "z": 1.5 + }, + "E3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 38.38, + "z": 1.5 + }, + "E4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 38.38, + "z": 1.5 + }, + "E5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 38.38, + "z": 1.5 + }, + "E6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 38.38, + "z": 1.5 + }, + "E7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 38.38, + "z": 1.5 + }, + "E8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 38.38, + "z": 1.5 + }, + "E9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 38.38, + "z": 1.5 + }, + "F1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 29.38, + "z": 1.5 + }, + "F10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 29.38, + "z": 1.5 + }, + "F11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 29.38, + "z": 1.5 + }, + "F12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 29.38, + "z": 1.5 + }, + "F2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 29.38, + "z": 1.5 + }, + "F3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 29.38, + "z": 1.5 + }, + "F4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 29.38, + "z": 1.5 + }, + "F5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 29.38, + "z": 1.5 + }, + "F6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 29.38, + "z": 1.5 + }, + "F7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 29.38, + "z": 1.5 + }, + "F8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 29.38, + "z": 1.5 + }, + "F9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 29.38, + "z": 1.5 + }, + "G1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 20.38, + "z": 1.5 + }, + "G10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 20.38, + "z": 1.5 + }, + "G11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 20.38, + "z": 1.5 + }, + "G12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 20.38, + "z": 1.5 + }, + "G2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 20.38, + "z": 1.5 + }, + "G3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 20.38, + "z": 1.5 + }, + "G4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 20.38, + "z": 1.5 + }, + "G5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 20.38, + "z": 1.5 + }, + "G6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 20.38, + "z": 1.5 + }, + "G7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 20.38, + "z": 1.5 + }, + "G8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 20.38, + "z": 1.5 + }, + "G9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 20.38, + "z": 1.5 + }, + "H1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 11.38, + "z": 1.5 + }, + "H10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 11.38, + "z": 1.5 + }, + "H11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 11.38, + "z": 1.5 + }, + "H12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 11.38, + "z": 1.5 + }, + "H2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 11.38, + "z": 1.5 + }, + "H3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 11.38, + "z": 1.5 + }, + "H4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 11.38, + "z": 1.5 + }, + "H5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 11.38, + "z": 1.5 + }, + "H6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 11.38, + "z": 1.5 + }, + "H7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 11.38, + "z": 1.5 + }, + "H8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 11.38, + "z": 1.5 + }, + "H9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 11.38, + "z": 1.5 + } + } + }, + "labwareId": "UUID" + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "loadPipette", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "1da6a76a5f9ccc6dc5311b4dda81e70e", + "notes": [], + "params": { + "liquidPresenceDetection": true, + "mount": "left", + "pipetteName": "p1000_96", + "tipOverlapNotAfterVersion": "v3" + }, + "result": { + "pipetteId": "UUID" + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "loadLiquid", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "898a866117a32fd68820a6526bef6db3", + "notes": [], + "params": { + "labwareId": "UUID", + "liquidId": "UUID", + "volumeByWell": { + "A1": 29000.0 + } + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "e225750b329b6840e7e27634e9e12b6f", + "notes": [], + "params": { + "message": "Item opentrons_96_wellplate_200ul_pcr_full_skirt is at C2" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "d394c9aab9575b56edd3ad97b0355259", + "notes": [], + "params": { + "labwareId": "UUID", + "newLocation": { + "moduleId": "UUID" + }, + "strategy": "usingGripper" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "1bb0adb1034d8481ac12eaa7f7c1c3ef", + "notes": [], + "params": { + "message": "Item opentrons_96_wellplate_200ul_pcr_full_skirt is at ThermocyclerContext at Thermocycler Module GEN2 on B1 lw Opentrons Tough 96 Well Plate 200 µL PCR Full Skirt" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "017ca5d99c90c0bba8904243fcd89832", + "notes": [], + "params": { + "labwareId": "UUID", + "newLocation": { + "slotName": "C2" + }, + "strategy": "usingGripper" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "8011dfe9e544689ec795e643c88ac270", + "notes": [], + "params": { + "message": "Item opentrons_96_wellplate_200ul_pcr_full_skirt is at C2" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "66b606966287f93e943cbe1c210953de", + "notes": [], + "params": { + "message": "Item nest_1_reservoir_290ml is at D2" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "c63414793ccc12f468292d27a7c23bd0", + "notes": [], + "params": { + "labwareId": "UUID", + "newLocation": { + "addressableAreaName": "D4" + }, + "strategy": "manualMoveWithPause" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "ddcaec056e1697e98605f81b27c3aab1", + "notes": [], + "params": { + "message": "Item nest_1_reservoir_290ml is at D4" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "7a3df36a08d870099052afb8a0cda156", + "notes": [], + "params": { + "labwareId": "UUID", + "newLocation": { + "slotName": "D2" + }, + "strategy": "usingGripper" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "3f060abc43588bf1cb31c84334652741", + "notes": [], + "params": { + "message": "Item nest_1_reservoir_290ml is at D2" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "configureNozzleLayout", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "54f7126428b3d9ccbdfecf81650de609", + "notes": [], + "params": { + "configurationParams": { + "primaryNozzle": "A12", + "style": "COLUMN" + }, + "pipetteId": "UUID" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "870404c9b72d6bd37634d8e6beca84c6", + "notes": [], + "params": { + "labwareId": "UUID", + "pipetteId": "UUID", + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.47, + "tipLength": 85.38999999999999, + "tipVolume": 1000.0 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "32e38e175b6506181d178153d765b0c7", + "notes": [], + "params": { + "message": "Tip rack in C3" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "f2ed2d040deab45db33b562c016689b3", + "notes": [], + "params": { + "message": "A: A1 ❌ A2 🟢 A3 🟢 A4 🟢 A5 🟢 A6 🟢 A7 🟢 A8 🟢 A9 🟢 A10 🟢 A11 🟢 A12 🟢 " + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "8f7ef35977c269c26521ac70ba964663", + "notes": [], + "params": { + "message": "B: B1 ❌ B2 🟢 B3 🟢 B4 🟢 B5 🟢 B6 🟢 B7 🟢 B8 🟢 B9 🟢 B10 🟢 B11 🟢 B12 🟢 " + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "bf11e9838b6269c7fd170ae415a52ccf", + "notes": [], + "params": { + "message": "C: C1 ❌ C2 🟢 C3 🟢 C4 🟢 C5 🟢 C6 🟢 C7 🟢 C8 🟢 C9 🟢 C10 🟢 C11 🟢 C12 🟢 " + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "95db1fadf1b23523b5453e177b9c50da", + "notes": [], + "params": { + "message": "D: D1 ❌ D2 🟢 D3 🟢 D4 🟢 D5 🟢 D6 🟢 D7 🟢 D8 🟢 D9 🟢 D10 🟢 D11 🟢 D12 🟢 " + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "f9800b33ba24bddcacb0db7eca628061", + "notes": [], + "params": { + "message": "E: E1 ❌ E2 🟢 E3 🟢 E4 🟢 E5 🟢 E6 🟢 E7 🟢 E8 🟢 E9 🟢 E10 🟢 E11 🟢 E12 🟢 " + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "107ef8bbe6742f96c6de7294af9a164c", + "notes": [], + "params": { + "message": "F: F1 ❌ F2 🟢 F3 🟢 F4 🟢 F5 🟢 F6 🟢 F7 🟢 F8 🟢 F9 🟢 F10 🟢 F11 🟢 F12 🟢 " + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "ad4f7d4dcb71d186df59ccf1c9f1ca10", + "notes": [], + "params": { + "message": "G: G1 ❌ G2 🟢 G3 🟢 G4 🟢 G5 🟢 G6 🟢 G7 🟢 G8 🟢 G9 🟢 G10 🟢 G11 🟢 G12 🟢 " + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "91351b86cc3e4dc2177314888ecbc2be", + "notes": [], + "params": { + "message": "H: H1 ❌ H2 🟢 H3 🟢 H4 🟢 H5 🟢 H6 🟢 H7 🟢 H8 🟢 H9 🟢 H10 🟢 H11 🟢 H12 🟢 " + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "liquidProbe", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "183da52c0f8f8b79d27c6b68d2b170e5", + "notes": [], + "params": { + "labwareId": "UUID", + "pipetteId": "UUID", + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 46.4 + }, + "z_position": 39.55 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "aspirate", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "7b296211cf41fa707f71d42cea453414", + "notes": [], + "params": { + "flowRate": 160.0, + "labwareId": "UUID", + "pipetteId": "UUID", + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.55 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 5.85 + }, + "volume": 5.0 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "dispense", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "0b8dd26114eb32bc6eeae9ae5ade6ebc", + "notes": [], + "params": { + "flowRate": 160.0, + "labwareId": "UUID", + "pipetteId": "UUID", + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.95 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 2.05 + }, + "volume": 5.0 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "moveToAddressableArea", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "8fdbbc092fe6f9f712459d911a673c02", + "notes": [], + "params": { + "addressableAreaName": "96ChannelWasteChute", + "forceDirect": false, + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "pipetteId": "UUID", + "stayAtHighestPossibleZ": false + }, + "result": { + "position": { + "x": 391.945, + "y": 10.585, + "z": 114.5 + } + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "dropTipInPlace", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "1d391eb17896c2f0a7d8fc6b1b08abc7", + "notes": [], + "params": { + "pipetteId": "UUID" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "configureNozzleLayout", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "81780206640aa0fd5e89455de48819ca", + "notes": [], + "params": { + "configurationParams": { + "primaryNozzle": "H12", + "style": "SINGLE" + }, + "pipetteId": "UUID" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "8c4ee9b87303fb4539f304fa6130a437", + "notes": [], + "params": { + "labwareId": "UUID", + "pipetteId": "UUID", + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A2" + }, + "result": { + "position": { + "x": 351.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.47, + "tipLength": 85.38999999999999, + "tipVolume": 1000.0 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "liquidProbe", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "4bbd30c3fb3bae996d2ad6a0f436b68c", + "notes": [], + "params": { + "labwareId": "UUID", + "pipetteId": "UUID", + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 46.4 + }, + "z_position": 39.55 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "aspirate", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "a7e370d997ef0a06985f630aff0b0509", + "notes": [], + "params": { + "flowRate": 160.0, + "labwareId": "UUID", + "pipetteId": "UUID", + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.55 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 5.85 + }, + "volume": 5.0 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "dispense", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "271e94d4af04613ce7a83bb5a883de6d", + "notes": [], + "params": { + "flowRate": 160.0, + "labwareId": "UUID", + "pipetteId": "UUID", + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.55 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 5.85 + }, + "volume": 5.0 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "liquidProbe", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "37521a0b1c1a673a476797b337d89d16", + "notes": [], + "params": { + "labwareId": "UUID", + "pipetteId": "UUID", + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 46.4 + }, + "z_position": 39.55 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "aspirate", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "b30428396a416e3d22093cf4c773b47c", + "notes": [], + "params": { + "flowRate": 160.0, + "labwareId": "UUID", + "pipetteId": "UUID", + "volume": 500.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.55 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 5.85 + }, + "volume": 500.0 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "dispense", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "49d59ded6092111efa96d0567bad1a49", + "notes": [], + "params": { + "flowRate": 160.0, + "labwareId": "UUID", + "pipetteId": "UUID", + "volume": 500.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.55 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 5.85 + }, + "volume": 500.0 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "moveToAddressableArea", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "e77f6719b8f3419aa0b9f02fc60b9aa9", + "notes": [], + "params": { + "addressableAreaName": "96ChannelWasteChute", + "forceDirect": false, + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "pipetteId": "UUID", + "stayAtHighestPossibleZ": false + }, + "result": { + "position": { + "x": 391.945, + "y": 10.585, + "z": 114.5 + } + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "dropTipInPlace", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "478e3582f4eb2ed128a5daca61a4e9b6", + "notes": [], + "params": { + "pipetteId": "UUID" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "d117b92df9213935f80289757890dfb1", + "notes": [], + "params": { + "message": "Tip rack in C3" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "a08648d6082ed9ac8f0bbd06ad286f1a", + "notes": [], + "params": { + "message": "A: A1 ❌ A2 ❌ A3 🟢 A4 🟢 A5 🟢 A6 🟢 A7 🟢 A8 🟢 A9 🟢 A10 🟢 A11 🟢 A12 🟢 " + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "786e445d77fb813503843582c1e0e240", + "notes": [], + "params": { + "message": "B: B1 ❌ B2 🟢 B3 🟢 B4 🟢 B5 🟢 B6 🟢 B7 🟢 B8 🟢 B9 🟢 B10 🟢 B11 🟢 B12 🟢 " + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "5925cf7a20814afaf40e53aa8ae06558", + "notes": [], + "params": { + "message": "C: C1 ❌ C2 🟢 C3 🟢 C4 🟢 C5 🟢 C6 🟢 C7 🟢 C8 🟢 C9 🟢 C10 🟢 C11 🟢 C12 🟢 " + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "6db826519588f9431bb3af0e3fa706c9", + "notes": [], + "params": { + "message": "D: D1 ❌ D2 🟢 D3 🟢 D4 🟢 D5 🟢 D6 🟢 D7 🟢 D8 🟢 D9 🟢 D10 🟢 D11 🟢 D12 🟢 " + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "8ebd61bc9e0a48c2ede74a548db4a60c", + "notes": [], + "params": { + "message": "E: E1 ❌ E2 🟢 E3 🟢 E4 🟢 E5 🟢 E6 🟢 E7 🟢 E8 🟢 E9 🟢 E10 🟢 E11 🟢 E12 🟢 " + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "9f42eca386eaaf3630878c24096682fc", + "notes": [], + "params": { + "message": "F: F1 ❌ F2 🟢 F3 🟢 F4 🟢 F5 🟢 F6 🟢 F7 🟢 F8 🟢 F9 🟢 F10 🟢 F11 🟢 F12 🟢 " + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "1b7a1f8eb4e410f40b730ada3973af21", + "notes": [], + "params": { + "message": "G: G1 ❌ G2 🟢 G3 🟢 G4 🟢 G5 🟢 G6 🟢 G7 🟢 G8 🟢 G9 🟢 G10 🟢 G11 🟢 G12 🟢 " + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "b80f271858de256646cdf2682ac749bf", + "notes": [], + "params": { + "message": "H: H1 ❌ H2 🟢 H3 🟢 H4 🟢 H5 🟢 H6 🟢 H7 🟢 H8 🟢 H9 🟢 H10 🟢 H11 🟢 H12 🟢 " + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "58570b636ea0e4ab4e3dca83d9414cfc", + "notes": [], + "params": { + "labwareId": "UUID", + "newLocation": { + "addressableAreaName": "gripperWasteChute" + }, + "strategy": "usingGripper" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "d0db82bcc9973012d30c92664d808e18", + "notes": [], + "params": { + "labwareId": "UUID", + "newLocation": { + "slotName": "C3" + }, + "strategy": "usingGripper" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "configureNozzleLayout", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "d42132b53600539d7ad1de002cb0e06e", + "notes": [], + "params": { + "configurationParams": { + "primaryNozzle": "H1", + "style": "ROW" + }, + "pipetteId": "UUID" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "7666f3511c92bd4c79c2f4796e187c6a", + "notes": [], + "params": { + "labwareId": "UUID", + "pipetteId": "UUID", + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 342.38, + "y": 181.38, + "z": 99.0 + }, + "tipDiameter": 5.47, + "tipLength": 85.38999999999999, + "tipVolume": 1000.0 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "liquidProbe", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "e3c9e792dd81698a173ca216c297bf1c", + "notes": [], + "params": { + "labwareId": "UUID", + "pipetteId": "UUID", + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 46.4 + }, + "z_position": 39.55 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "aspirate", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "c760f293c7e422858709f934985e1a7d", + "notes": [], + "params": { + "flowRate": 160.0, + "labwareId": "UUID", + "pipetteId": "UUID", + "volume": 500.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.55 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 5.85 + }, + "volume": 500.0 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "dispense", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "9ead8491882088b5d251c946e6338db4", + "notes": [], + "params": { + "flowRate": 160.0, + "labwareId": "UUID", + "pipetteId": "UUID", + "pushOut": 0.0, + "volume": 500.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.55 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 5.85 + }, + "volume": 500.0 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "aspirate", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "ce9a3b4288bf193a6e190156ac284977", + "notes": [], + "params": { + "flowRate": 160.0, + "labwareId": "UUID", + "pipetteId": "UUID", + "volume": 500.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.55 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 5.85 + }, + "volume": 500.0 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "dispense", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "d9cd2dbdfc0197f336b169f58404a0fa", + "notes": [], + "params": { + "flowRate": 160.0, + "labwareId": "UUID", + "pipetteId": "UUID", + "pushOut": 0.0, + "volume": 500.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.55 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 5.85 + }, + "volume": 500.0 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "aspirate", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "10498510a8ab571cad1b17f8cd0d38a2", + "notes": [], + "params": { + "flowRate": 160.0, + "labwareId": "UUID", + "pipetteId": "UUID", + "volume": 500.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.55 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 5.85 + }, + "volume": 500.0 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "dispense", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "289400847435f9ac40532b1f0d4ddb62", + "notes": [], + "params": { + "flowRate": 160.0, + "labwareId": "UUID", + "pipetteId": "UUID", + "volume": 500.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.55 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 5.85 + }, + "volume": 500.0 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "moveToAddressableArea", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "0d7d8f0b4cadfbe34a2e63b472ea515a", + "notes": [], + "params": { + "addressableAreaName": "96ChannelWasteChute", + "forceDirect": false, + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "pipetteId": "UUID", + "stayAtHighestPossibleZ": false + }, + "result": { + "position": { + "x": 391.945, + "y": 10.585, + "z": 114.5 + } + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "dropTipInPlace", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "5b98c2c25afe6ed45a9e5f7d53d10913", + "notes": [], + "params": { + "pipetteId": "UUID" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "f6d9c7f90feafa27f614adc77e3e4a6c", + "notes": [], + "params": { + "message": "Tip rack in C3" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "bd26801f990ee766417912053b5d1d85", + "notes": [], + "params": { + "message": "A: A1 ❌ A2 ❌ A3 ❌ A4 ❌ A5 ❌ A6 ❌ A7 ❌ A8 ❌ A9 ❌ A10 ❌ A11 ❌ A12 ❌ " + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "6ce49ea6e7d7158920fe3037dd769a82", + "notes": [], + "params": { + "message": "B: B1 🟢 B2 🟢 B3 🟢 B4 🟢 B5 🟢 B6 🟢 B7 🟢 B8 🟢 B9 🟢 B10 🟢 B11 🟢 B12 🟢 " + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "1ea2709eca69d325bac93d5c12b61102", + "notes": [], + "params": { + "message": "C: C1 🟢 C2 🟢 C3 🟢 C4 🟢 C5 🟢 C6 🟢 C7 🟢 C8 🟢 C9 🟢 C10 🟢 C11 🟢 C12 🟢 " + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "e550f01cf1e380d18ddbcd7856a759a6", + "notes": [], + "params": { + "message": "D: D1 🟢 D2 🟢 D3 🟢 D4 🟢 D5 🟢 D6 🟢 D7 🟢 D8 🟢 D9 🟢 D10 🟢 D11 🟢 D12 🟢 " + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "ad2af3e14a3d8ffb7814798537726073", + "notes": [], + "params": { + "message": "E: E1 🟢 E2 🟢 E3 🟢 E4 🟢 E5 🟢 E6 🟢 E7 🟢 E8 🟢 E9 🟢 E10 🟢 E11 🟢 E12 🟢 " + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "32e88a4d628686db346517f72eacb3e9", + "notes": [], + "params": { + "message": "F: F1 🟢 F2 🟢 F3 🟢 F4 🟢 F5 🟢 F6 🟢 F7 🟢 F8 🟢 F9 🟢 F10 🟢 F11 🟢 F12 🟢 " + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "71ae76605b9b3f27159f619b4fd24d77", + "notes": [], + "params": { + "message": "G: G1 🟢 G2 🟢 G3 🟢 G4 🟢 G5 🟢 G6 🟢 G7 🟢 G8 🟢 G9 🟢 G10 🟢 G11 🟢 G12 🟢 " + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "a829ef01b67f8a6a5657384b811e8670", + "notes": [], + "params": { + "message": "H: H1 🟢 H2 🟢 H3 🟢 H4 🟢 H5 🟢 H6 🟢 H7 🟢 H8 🟢 H9 🟢 H10 🟢 H11 🟢 H12 🟢 " + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "configureNozzleLayout", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "5365e04fad40b79ec18d0f0ec67be6b4", + "notes": [], + "params": { + "configurationParams": { + "style": "ALL" + }, + "pipetteId": "UUID" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "ff11e465f62590cae83e688b10e2223f", + "notes": [], + "params": { + "labwareId": "UUID", + "pipetteId": "UUID", + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 395.38, + "z": 110.0 + }, + "tipDiameter": 5.47, + "tipLength": 85.38999999999999, + "tipVolume": 1000.0 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "9ad8654c7993d6585b0cbc6476129ff5", + "notes": [], + "params": { + "message": "Tip rack in Opentrons Flex 96 Tip Rack Adapter" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "73032c12c503d675d7394d98ebcaed59", + "notes": [], + "params": { + "message": "A: A1 ❌ A2 ❌ A3 ❌ A4 ❌ A5 ❌ A6 ❌ A7 ❌ A8 ❌ A9 ❌ A10 ❌ A11 ❌ A12 ❌ " + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "8ae1d2605e1a91cc1c318849bfdada67", + "notes": [], + "params": { + "message": "B: B1 ❌ B2 ❌ B3 ❌ B4 ❌ B5 ❌ B6 ❌ B7 ❌ B8 ❌ B9 ❌ B10 ❌ B11 ❌ B12 ❌ " + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "bae058c3acd2294054b74da2c83df5ba", + "notes": [], + "params": { + "message": "C: C1 ❌ C2 ❌ C3 ❌ C4 ❌ C5 ❌ C6 ❌ C7 ❌ C8 ❌ C9 ❌ C10 ❌ C11 ❌ C12 ❌ " + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "ef186548c415cad51bd2c1f5a5ca6709", + "notes": [], + "params": { + "message": "D: D1 ❌ D2 ❌ D3 ❌ D4 ❌ D5 ❌ D6 ❌ D7 ❌ D8 ❌ D9 ❌ D10 ❌ D11 ❌ D12 ❌ " + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "8654bf1423f4bc950cc979848c1922d5", + "notes": [], + "params": { + "message": "E: E1 ❌ E2 ❌ E3 ❌ E4 ❌ E5 ❌ E6 ❌ E7 ❌ E8 ❌ E9 ❌ E10 ❌ E11 ❌ E12 ❌ " + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "fd972ba6efcfa6e2c423e748b769ae09", + "notes": [], + "params": { + "message": "F: F1 ❌ F2 ❌ F3 ❌ F4 ❌ F5 ❌ F6 ❌ F7 ❌ F8 ❌ F9 ❌ F10 ❌ F11 ❌ F12 ❌ " + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "740c240306f144d6eb3f2f37b137ae1f", + "notes": [], + "params": { + "message": "G: G1 ❌ G2 ❌ G3 ❌ G4 ❌ G5 ❌ G6 ❌ G7 ❌ G8 ❌ G9 ❌ G10 ❌ G11 ❌ G12 ❌ " + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "ea105a8bc9ec6645a6d993b584bf8369", + "notes": [], + "params": { + "message": "H: H1 ❌ H2 ❌ H3 ❌ H4 ❌ H5 ❌ H6 ❌ H7 ❌ H8 ❌ H9 ❌ H10 ❌ H11 ❌ H12 ❌ " + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "liquidProbe", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "5a0d372a3eae37ae4898fc29e7f3840e", + "notes": [], + "params": { + "labwareId": "UUID", + "pipetteId": "UUID", + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 46.4 + }, + "z_position": 39.55 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "aspirate", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "f39e598e806daf765313a303d0d157ee", + "notes": [], + "params": { + "flowRate": 160.0, + "labwareId": "UUID", + "pipetteId": "UUID", + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.55 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 5.85 + }, + "volume": 5.0 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "f909836a4d4875e5ccfeaa5f6c139666", + "notes": [], + "params": { + "forceDirect": false, + "labwareId": "UUID", + "pipetteId": "UUID", + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 29.999999999999993 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 74.39999999999998 + } + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "aspirate", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "92afd096c372098f64a9bfb0873b355b", + "notes": [], + "params": { + "flowRate": 160.0, + "labwareId": "UUID", + "pipetteId": "UUID", + "volume": 995.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 29.999999999999993 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 74.39999999999998 + }, + "volume": 995.0 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "moveToAddressableArea", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "ef0781edef6aca01d9879b1a09d9b3f2", + "notes": [], + "params": { + "addressableAreaName": "96ChannelWasteChute", + "forceDirect": false, + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "pipetteId": "UUID", + "stayAtHighestPossibleZ": false + }, + "result": { + "position": { + "x": 391.945, + "y": 10.585, + "z": 114.5 + } + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "blowOutInPlace", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "af716ae841d9585043867a431d539d55", + "notes": [], + "params": { + "flowRate": 80.0, + "pipetteId": "UUID" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "prepareToAspirate", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "349bb0bf929376ee5a1c92c7882fdacf", + "notes": [], + "params": { + "pipetteId": "UUID" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "liquidProbe", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "66068d631b0410c78ec504b2efd9192f", + "notes": [], + "params": { + "labwareId": "UUID", + "pipetteId": "UUID", + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 46.4 + }, + "z_position": 39.55 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "aspirate", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "72a351430efa97bacea8b8baa9e67d7a", + "notes": [], + "params": { + "flowRate": 160.0, + "labwareId": "UUID", + "pipetteId": "UUID", + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.55 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 5.85 + }, + "volume": 5.0 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "75759431a0a6325eeaf70f09f1541b2f", + "notes": [], + "params": { + "forceDirect": false, + "labwareId": "UUID", + "pipetteId": "UUID", + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 29.999999999999993 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 74.39999999999998 + } + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "aspirate", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "f40963e7ee5296cada36d22981b64865", + "notes": [], + "params": { + "flowRate": 160.0, + "labwareId": "UUID", + "pipetteId": "UUID", + "volume": 995.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 29.999999999999993 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 74.39999999999998 + }, + "volume": 995.0 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "moveToAddressableArea", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "ca81c96c5e6706521c28eeb429560dbb", + "notes": [], + "params": { + "addressableAreaName": "96ChannelWasteChute", + "forceDirect": false, + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "pipetteId": "UUID", + "stayAtHighestPossibleZ": false + }, + "result": { + "position": { + "x": 391.945, + "y": 10.585, + "z": 114.5 + } + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "blowOutInPlace", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "e1d6d21093014d3715ff4f1e41d64add", + "notes": [], + "params": { + "flowRate": 80.0, + "pipetteId": "UUID" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "prepareToAspirate", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "0947370822b6af57af2a7acabdfb1c4d", + "notes": [], + "params": { + "pipetteId": "UUID" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "liquidProbe", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "6f32130e79de0fab3b9694367d1df14d", + "notes": [], + "params": { + "labwareId": "UUID", + "pipetteId": "UUID", + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 46.4 + }, + "z_position": 39.55 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "aspirate", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "375d7aacf8cfb56bd73ae3fe64eda953", + "notes": [], + "params": { + "flowRate": 160.0, + "labwareId": "UUID", + "pipetteId": "UUID", + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.55 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 5.85 + }, + "volume": 10.0 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "dispense", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "188aead45e3881975f879a62331bf6d9", + "notes": [], + "params": { + "flowRate": 160.0, + "labwareId": "UUID", + "pipetteId": "UUID", + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.95 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 2.05 + }, + "volume": 10.0 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "liquidProbe", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "3c58ecc0dd1bb01b8c561c1a5b8efc79", + "notes": [], + "params": { + "labwareId": "UUID", + "pipetteId": "UUID", + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 18.0 + }, + "z_position": 14.95 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "aspirate", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "d953a57ea73562ecbb1bb7c46fa516dc", + "notes": [], + "params": { + "flowRate": 160.0, + "labwareId": "UUID", + "pipetteId": "UUID", + "volume": 15.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.95 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 2.05 + }, + "volume": 15.0 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "dispense", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "802a4b04ebd2b303f50dd568f841dc2e", + "notes": [], + "params": { + "flowRate": 160.0, + "labwareId": "UUID", + "pipetteId": "UUID", + "pushOut": 0.0, + "volume": 15.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.95 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 2.05 + }, + "volume": 15.0 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "aspirate", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "ffcef1be9b48b826f0cc646961192d81", + "notes": [], + "params": { + "flowRate": 160.0, + "labwareId": "UUID", + "pipetteId": "UUID", + "volume": 15.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.95 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 2.05 + }, + "volume": 15.0 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "dispense", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "4fb4e8b75e18cb95da915141eb49b7d0", + "notes": [], + "params": { + "flowRate": 160.0, + "labwareId": "UUID", + "pipetteId": "UUID", + "pushOut": 0.0, + "volume": 15.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.95 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 2.05 + }, + "volume": 15.0 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "aspirate", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "1c6fe66b1d9cc8a50c94f2818e9bb0c0", + "notes": [], + "params": { + "flowRate": 160.0, + "labwareId": "UUID", + "pipetteId": "UUID", + "volume": 15.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.95 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 2.05 + }, + "volume": 15.0 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "dispense", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "05998ba40ade9c08ed03d97aebb538e8", + "notes": [], + "params": { + "flowRate": 160.0, + "labwareId": "UUID", + "pipetteId": "UUID", + "pushOut": 0.0, + "volume": 15.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.95 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 2.05 + }, + "volume": 15.0 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "aspirate", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "d0e081f09d5e7358497f152498b7ff67", + "notes": [], + "params": { + "flowRate": 160.0, + "labwareId": "UUID", + "pipetteId": "UUID", + "volume": 15.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.95 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 2.05 + }, + "volume": 15.0 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "dispense", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "39a94f9fe6a63daaaef83ccceee0e661", + "notes": [], + "params": { + "flowRate": 160.0, + "labwareId": "UUID", + "pipetteId": "UUID", + "pushOut": 0.0, + "volume": 15.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.95 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 2.05 + }, + "volume": 15.0 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "aspirate", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "60db0e75d04bf60b1dde66ad4346214c", + "notes": [], + "params": { + "flowRate": 160.0, + "labwareId": "UUID", + "pipetteId": "UUID", + "volume": 15.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.95 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 2.05 + }, + "volume": 15.0 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "dispense", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "54213b7b2f9be52a52f64cf8841a5d83", + "notes": [], + "params": { + "flowRate": 160.0, + "labwareId": "UUID", + "pipetteId": "UUID", + "volume": 15.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.95 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 2.05 + }, + "volume": 15.0 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "dropTip", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "56fe165d9f183c0829edd60e88bf9ada", + "notes": [], + "params": { + "alternateDropLocation": false, + "labwareId": "UUID", + "pipetteId": "UUID", + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 395.38, + "z": 90.88 + } + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "9bba35ad84bf2275a6f3298fd03d5187", + "notes": [], + "params": { + "message": "Tip rack in Opentrons Flex 96 Tip Rack Adapter" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "fbe3905bfb62be150cd42317a36f0e8f", + "notes": [], + "params": { + "message": "A: A1 ❌ A2 ❌ A3 ❌ A4 ❌ A5 ❌ A6 ❌ A7 ❌ A8 ❌ A9 ❌ A10 ❌ A11 ❌ A12 ❌ " + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "3cc7f1b0fe6b2a8d90591c32ac0c9cde", + "notes": [], + "params": { + "message": "B: B1 ❌ B2 ❌ B3 ❌ B4 ❌ B5 ❌ B6 ❌ B7 ❌ B8 ❌ B9 ❌ B10 ❌ B11 ❌ B12 ❌ " + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "a455eac2b6ad82f8c15fd9dda45d8882", + "notes": [], + "params": { + "message": "C: C1 ❌ C2 ❌ C3 ❌ C4 ❌ C5 ❌ C6 ❌ C7 ❌ C8 ❌ C9 ❌ C10 ❌ C11 ❌ C12 ❌ " + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "2cd8818343ed0e921367bd42ef1112ee", + "notes": [], + "params": { + "message": "D: D1 ❌ D2 ❌ D3 ❌ D4 ❌ D5 ❌ D6 ❌ D7 ❌ D8 ❌ D9 ❌ D10 ❌ D11 ❌ D12 ❌ " + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "f92b8f56db51db3b60599e7b28445a36", + "notes": [], + "params": { + "message": "E: E1 ❌ E2 ❌ E3 ❌ E4 ❌ E5 ❌ E6 ❌ E7 ❌ E8 ❌ E9 ❌ E10 ❌ E11 ❌ E12 ❌ " + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "44922a596363eb6844146a36fe3ac517", + "notes": [], + "params": { + "message": "F: F1 ❌ F2 ❌ F3 ❌ F4 ❌ F5 ❌ F6 ❌ F7 ❌ F8 ❌ F9 ❌ F10 ❌ F11 ❌ F12 ❌ " + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "3be4bbcb6d53e5eeffb1afa4e8d3a24a", + "notes": [], + "params": { + "message": "G: G1 ❌ G2 ❌ G3 ❌ G4 ❌ G5 ❌ G6 ❌ G7 ❌ G8 ❌ G9 ❌ G10 ❌ G11 ❌ G12 ❌ " + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "69ffdab33828b93ec704bdbc413c1737", + "notes": [], + "params": { + "message": "H: H1 ❌ H2 ❌ H3 ❌ H4 ❌ H5 ❌ H6 ❌ H7 ❌ H8 ❌ H9 ❌ H10 ❌ H11 ❌ H12 ❌ " + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "555305195a9fa7a6e42458e37a2934e3", + "notes": [], + "params": { + "labwareId": "UUID", + "pipetteId": "UUID", + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 395.38, + "z": 110.0 + }, + "tipDiameter": 5.47, + "tipLength": 85.38999999999999, + "tipVolume": 1000.0 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "liquidProbe", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "889eee1bbba96644a80db22726b4a69a", + "notes": [], + "params": { + "labwareId": "UUID", + "pipetteId": "UUID", + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 46.4 + }, + "z_position": 39.55 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "aspirate", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "f72e9c3d813de4285e722ec87c596154", + "notes": [], + "params": { + "flowRate": 160.0, + "labwareId": "UUID", + "pipetteId": "UUID", + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.55 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 5.85 + }, + "volume": 5.0 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "dispense", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "ad48da5e9be4a5df85ddcf8d7184d0c8", + "notes": [], + "params": { + "flowRate": 160.0, + "labwareId": "UUID", + "pipetteId": "UUID", + "pushOut": 0.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.55 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 5.85 + }, + "volume": 5.0 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "aspirate", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "fbdf4b8ac2749cb43d260e15c7b5bdc4", + "notes": [], + "params": { + "flowRate": 160.0, + "labwareId": "UUID", + "pipetteId": "UUID", + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.55 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 5.85 + }, + "volume": 5.0 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "dispense", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "72f42105daee58b1475cf8ecf7a1beb4", + "notes": [], + "params": { + "flowRate": 160.0, + "labwareId": "UUID", + "pipetteId": "UUID", + "pushOut": 0.0, + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.55 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 5.85 + }, + "volume": 5.0 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "aspirate", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "b8d9b6e0d7f61b0fbf64506e479cab62", + "notes": [], + "params": { + "flowRate": 160.0, + "labwareId": "UUID", + "pipetteId": "UUID", + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.55 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 5.85 + }, + "volume": 5.0 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "dispense", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "1e09ac145c0efa97283b7cd9f049edf4", + "notes": [], + "params": { + "flowRate": 160.0, + "labwareId": "UUID", + "pipetteId": "UUID", + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.55 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 5.85 + }, + "volume": 5.0 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "liquidProbe", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "8024e861cc4bf515fb9ca70c4ec8a74b", + "notes": [], + "params": { + "labwareId": "UUID", + "pipetteId": "UUID", + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 46.4 + }, + "z_position": 39.55 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "aspirate", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "9166539061095ad42ec58573fc8ebd04", + "notes": [], + "params": { + "flowRate": 160.0, + "labwareId": "UUID", + "pipetteId": "UUID", + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -38.55 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 5.85 + }, + "volume": 10.0 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "dispense", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "2c73b1942409fa2c78c7bae9b7a4fab1", + "notes": [], + "params": { + "flowRate": 160.0, + "labwareId": "UUID", + "pipetteId": "UUID", + "volume": 10.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.95 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 2.05 + }, + "volume": 10.0 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "liquidProbe", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "78c817792c844a6b3441b1b214f8add9", + "notes": [], + "params": { + "labwareId": "UUID", + "pipetteId": "UUID", + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 2.0 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 18.0 + }, + "z_position": 14.95 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "aspirate", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "02130e935d2b1096c98f46562a5a4940", + "notes": [], + "params": { + "flowRate": 160.0, + "labwareId": "UUID", + "pipetteId": "UUID", + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.95 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 2.05 + }, + "volume": 5.0 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "dispense", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "9b374953d929a83ceb00b787065f4749", + "notes": [], + "params": { + "flowRate": 160.0, + "labwareId": "UUID", + "pipetteId": "UUID", + "volume": 5.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -13.95 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 2.05 + }, + "volume": 5.0 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "touchTip", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "f44c5b4dcf502560454b7c55f86ce207", + "notes": [], + "params": { + "labwareId": "UUID", + "pipetteId": "UUID", + "radius": 1.0, + "speed": 60.0, + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": -1.0 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 15.0 + } + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "moveToAddressableArea", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "396dbf283e4856e439bf95b1464d6774", + "notes": [], + "params": { + "addressableAreaName": "96ChannelWasteChute", + "forceDirect": false, + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "pipetteId": "UUID", + "stayAtHighestPossibleZ": false + }, + "result": { + "position": { + "x": 391.945, + "y": 10.585, + "z": 114.5 + } + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "blowOutInPlace", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "6bd9b67b490d5fcb1f6f2a5574813599", + "notes": [], + "params": { + "flowRate": 80.0, + "pipetteId": "UUID" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "b12de52c4b99321ce3dd3ebef1ace986", + "notes": [], + "params": { + "message": "Tip rack in Opentrons Flex 96 Tip Rack Adapter" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "e05ac7b430c14364b6f2fdf3dc2af27e", + "notes": [], + "params": { + "message": "A: A1 ❌ A2 ❌ A3 ❌ A4 ❌ A5 ❌ A6 ❌ A7 ❌ A8 ❌ A9 ❌ A10 ❌ A11 ❌ A12 ❌ " + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "3cf4c37d88b549ff7edb749d39b12893", + "notes": [], + "params": { + "message": "B: B1 ❌ B2 ❌ B3 ❌ B4 ❌ B5 ❌ B6 ❌ B7 ❌ B8 ❌ B9 ❌ B10 ❌ B11 ❌ B12 ❌ " + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "d9d646d906f12bb1c967be93839f7299", + "notes": [], + "params": { + "message": "C: C1 ❌ C2 ❌ C3 ❌ C4 ❌ C5 ❌ C6 ❌ C7 ❌ C8 ❌ C9 ❌ C10 ❌ C11 ❌ C12 ❌ " + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "6f55ed54e09f89c01243bb2285cbbf48", + "notes": [], + "params": { + "message": "D: D1 ❌ D2 ❌ D3 ❌ D4 ❌ D5 ❌ D6 ❌ D7 ❌ D8 ❌ D9 ❌ D10 ❌ D11 ❌ D12 ❌ " + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "19c19a260d4adfa0c89801870fb888af", + "notes": [], + "params": { + "message": "E: E1 ❌ E2 ❌ E3 ❌ E4 ❌ E5 ❌ E6 ❌ E7 ❌ E8 ❌ E9 ❌ E10 ❌ E11 ❌ E12 ❌ " + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "3b29221f75f3b684631085f5297945d7", + "notes": [], + "params": { + "message": "F: F1 ❌ F2 ❌ F3 ❌ F4 ❌ F5 ❌ F6 ❌ F7 ❌ F8 ❌ F9 ❌ F10 ❌ F11 ❌ F12 ❌ " + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "04a79ca0387a44d148485363d8825314", + "notes": [], + "params": { + "message": "G: G1 ❌ G2 ❌ G3 ❌ G4 ❌ G5 ❌ G6 ❌ G7 ❌ G8 ❌ G9 ❌ G10 ❌ G11 ❌ G12 ❌ " + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "51040551e5ab6544ed7df57e3d31af1c", + "notes": [], + "params": { + "message": "H: H1 ❌ H2 ❌ H3 ❌ H4 ❌ H5 ❌ H6 ❌ H7 ❌ H8 ❌ H9 ❌ H10 ❌ H11 ❌ H12 ❌ " + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "dropTip", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "1237ae4e1a24ca35be4422f0f6ce94dd", + "notes": [], + "params": { + "alternateDropLocation": false, + "homeAfter": false, + "labwareId": "UUID", + "pipetteId": "UUID", + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 395.38, + "z": 90.88 + } + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "2807c440b5749ca58f964eea2b0173bd", + "notes": [], + "params": { + "message": "Tip rack in Opentrons Flex 96 Tip Rack Adapter" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "49a6a126b3f1bd562b481b1ed0aa2076", + "notes": [], + "params": { + "message": "A: A1 ❌ A2 ❌ A3 ❌ A4 ❌ A5 ❌ A6 ❌ A7 ❌ A8 ❌ A9 ❌ A10 ❌ A11 ❌ A12 ❌ " + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "b28eaed62162a6cba37b2b2adbce3da7", + "notes": [], + "params": { + "message": "B: B1 ❌ B2 ❌ B3 ❌ B4 ❌ B5 ❌ B6 ❌ B7 ❌ B8 ❌ B9 ❌ B10 ❌ B11 ❌ B12 ❌ " + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "c23e5efd595af9bd86091d2d55ce4b9a", + "notes": [], + "params": { + "message": "C: C1 ❌ C2 ❌ C3 ❌ C4 ❌ C5 ❌ C6 ❌ C7 ❌ C8 ❌ C9 ❌ C10 ❌ C11 ❌ C12 ❌ " + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "07b2576296bc2809caf537d7f7b23e32", + "notes": [], + "params": { + "message": "D: D1 ❌ D2 ❌ D3 ❌ D4 ❌ D5 ❌ D6 ❌ D7 ❌ D8 ❌ D9 ❌ D10 ❌ D11 ❌ D12 ❌ " + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "bf247b006b5c8ef36385e4ec56c417c3", + "notes": [], + "params": { + "message": "E: E1 ❌ E2 ❌ E3 ❌ E4 ❌ E5 ❌ E6 ❌ E7 ❌ E8 ❌ E9 ❌ E10 ❌ E11 ❌ E12 ❌ " + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "7792788aff047a2c81f5326af7d60612", + "notes": [], + "params": { + "message": "F: F1 ❌ F2 ❌ F3 ❌ F4 ❌ F5 ❌ F6 ❌ F7 ❌ F8 ❌ F9 ❌ F10 ❌ F11 ❌ F12 ❌ " + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "c924c03e02674de3e6cb386a3f2a3dd2", + "notes": [], + "params": { + "message": "G: G1 ❌ G2 ❌ G3 ❌ G4 ❌ G5 ❌ G6 ❌ G7 ❌ G8 ❌ G9 ❌ G10 ❌ G11 ❌ G12 ❌ " + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "1d51c2a28f6474ff8e1869e842e280ef", + "notes": [], + "params": { + "message": "H: H1 ❌ H2 ❌ H3 ❌ H4 ❌ H5 ❌ H6 ❌ H7 ❌ H8 ❌ H9 ❌ H10 ❌ H11 ❌ H12 ❌ " + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "5f76720ac31bec344907102b24db2587", + "notes": [], + "params": { + "message": "I think the above should not be empty?" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "f8aa7b28aea0b80b4fa83831e80ab7c0", + "notes": [], + "params": { + "labwareId": "UUID", + "newLocation": { + "moduleId": "UUID" + }, + "strategy": "usingGripper" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "ecca018448f3be0be1d42df4abe64d29", + "notes": [], + "params": { + "labwareId": "UUID", + "newLocation": { + "labwareId": "UUID" + }, + "strategy": "usingGripper" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "thermocycler/closeLid", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "0b8b0a843658fab0070a14b29383d4b6", + "notes": [], + "params": { + "moduleId": "UUID" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "thermocycler/setTargetBlockTemperature", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "5d5f3d5b64948ce5d0442c949b58580d", + "notes": [], + "params": { + "celsius": 38.0, + "holdTimeSeconds": 5.0, + "moduleId": "UUID" + }, + "result": { + "targetBlockTemperature": 38.0 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "thermocycler/waitForBlockTemperature", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "55f7eea09ff71c6b93b52d15f9b778ba", + "notes": [], + "params": { + "moduleId": "UUID" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "thermocycler/setTargetLidTemperature", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "bd916b6b732fbfe8e2151cdf842d4d77", + "notes": [], + "params": { + "celsius": 38.0, + "moduleId": "UUID" + }, + "result": { + "targetLidTemperature": 38.0 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "thermocycler/waitForLidTemperature", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "61c47242119c089e39c2970fbb9c5a87", + "notes": [], + "params": { + "moduleId": "UUID" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "thermocycler/openLid", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "26d710513eb567d25ec6c7564178f2f6", + "notes": [], + "params": { + "moduleId": "UUID" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "328cffb6ec92cddfdf9b793822084af8", + "notes": [], + "params": { + "labwareId": "UUID", + "newLocation": { + "addressableAreaName": "gripperWasteChute" + }, + "strategy": "usingGripper" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "thermocycler/deactivateBlock", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "a644d2f8960bb1f9ea36838d49796e86", + "notes": [], + "params": { + "moduleId": "UUID" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "thermocycler/deactivateLid", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "04bc1e2c660b9a49ff9b4ae75b2a7530", + "notes": [], + "params": { + "moduleId": "UUID" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "a2c406012e8e618eba18668129dc7210", + "notes": [], + "params": { + "moduleId": "UUID" + }, + "result": { + "pipetteRetracted": true + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "7e902c9531e52458c9c1e86eb4fb3bb6", + "notes": [], + "params": { + "labwareId": "UUID", + "newLocation": { + "labwareId": "UUID" + }, + "strategy": "usingGripper" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "heaterShaker/closeLabwareLatch", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "76e684c73a4874bf4e8c3c80ee466258", + "notes": [], + "params": { + "moduleId": "UUID" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "heaterShaker/setTargetTemperature", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "788cd6378d690bb4cb1a55713b109ff4", + "notes": [], + "params": { + "celsius": 38.0, + "moduleId": "UUID" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "heaterShaker/setAndWaitForShakeSpeed", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "866729c2f032edcbb976943d6afed1b8", + "notes": [], + "params": { + "moduleId": "UUID", + "rpm": 777.0 + }, + "result": { + "pipetteRetracted": true + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "heaterShaker/waitForTemperature", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "12e4febccf2785fec55a7cea18901c34", + "notes": [], + "params": { + "moduleId": "UUID" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateHeater", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "91146a40c4e7497a9d69be9920689507", + "notes": [], + "params": { + "moduleId": "UUID" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "heaterShaker/deactivateShaker", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "511c2d31b524be9c8c36fba36edf17b6", + "notes": [], + "params": { + "moduleId": "UUID" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "heaterShaker/openLabwareLatch", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "77b87b86baa82a0bdbbee3674ae3778f", + "notes": [], + "params": { + "moduleId": "UUID" + }, + "result": { + "pipetteRetracted": true + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "dc518febf332036503375d529f643de2", + "notes": [], + "params": { + "labwareId": "UUID", + "newLocation": { + "labwareId": "UUID" + }, + "strategy": "usingGripper" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "temperatureModule/setTargetTemperature", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "452014b616f7c44e48ae0e0d8ba04d4d", + "notes": [], + "params": { + "celsius": 38.0, + "moduleId": "UUID" + }, + "result": { + "targetTemperature": 38.0 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "temperatureModule/waitForTemperature", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "4e0d56666b7e4686daedba5eaa6e3bd3", + "notes": [], + "params": { + "moduleId": "UUID" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "temperatureModule/deactivate", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "c6b71690c162eb1d471add58f20491fe", + "notes": [], + "params": { + "moduleId": "UUID" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "a9659e82d69a0cb7cb289ca5787195e9", + "notes": [], + "params": { + "labwareId": "UUID", + "newLocation": { + "moduleId": "UUID" + }, + "strategy": "usingGripper" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "absorbanceReader/closeLid", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "365ab2acd2036e30c2b4ba4422301d5f", + "notes": [], + "params": { + "moduleId": "UUID" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "absorbanceReader/read", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "a80b3f4b976053ae6453bc8505b218ce", + "notes": [], + "params": { + "fileName": "smoke_APR_data.csv", + "moduleId": "UUID" + }, + "result": { + "data": { + "600": { + "A1": 0.0, + "A10": 0.0, + "A11": 0.0, + "A12": 0.0, + "A2": 0.0, + "A3": 0.0, + "A4": 0.0, + "A5": 0.0, + "A6": 0.0, + "A7": 0.0, + "A8": 0.0, + "A9": 0.0, + "B1": 0.0, + "B10": 0.0, + "B11": 0.0, + "B12": 0.0, + "B2": 0.0, + "B3": 0.0, + "B4": 0.0, + "B5": 0.0, + "B6": 0.0, + "B7": 0.0, + "B8": 0.0, + "B9": 0.0, + "C1": 0.0, + "C10": 0.0, + "C11": 0.0, + "C12": 0.0, + "C2": 0.0, + "C3": 0.0, + "C4": 0.0, + "C5": 0.0, + "C6": 0.0, + "C7": 0.0, + "C8": 0.0, + "C9": 0.0, + "D1": 0.0, + "D10": 0.0, + "D11": 0.0, + "D12": 0.0, + "D2": 0.0, + "D3": 0.0, + "D4": 0.0, + "D5": 0.0, + "D6": 0.0, + "D7": 0.0, + "D8": 0.0, + "D9": 0.0, + "E1": 0.0, + "E10": 0.0, + "E11": 0.0, + "E12": 0.0, + "E2": 0.0, + "E3": 0.0, + "E4": 0.0, + "E5": 0.0, + "E6": 0.0, + "E7": 0.0, + "E8": 0.0, + "E9": 0.0, + "F1": 0.0, + "F10": 0.0, + "F11": 0.0, + "F12": 0.0, + "F2": 0.0, + "F3": 0.0, + "F4": 0.0, + "F5": 0.0, + "F6": 0.0, + "F7": 0.0, + "F8": 0.0, + "F9": 0.0, + "G1": 0.0, + "G10": 0.0, + "G11": 0.0, + "G12": 0.0, + "G2": 0.0, + "G3": 0.0, + "G4": 0.0, + "G5": 0.0, + "G6": 0.0, + "G7": 0.0, + "G8": 0.0, + "G9": 0.0, + "H1": 0.0, + "H10": 0.0, + "H11": 0.0, + "H12": 0.0, + "H2": 0.0, + "H3": 0.0, + "H4": 0.0, + "H5": 0.0, + "H6": 0.0, + "H7": 0.0, + "H8": 0.0, + "H9": 0.0 + } + }, + "fileIds": [ + "" + ] + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "comment", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "05cfadac7c9a474a7bafe928aee58bf6", + "notes": [], + "params": { + "message": "single: {600: {'A1': 0.0, 'A2': 0.0, 'A3': 0.0, 'A4': 0.0, 'A5': 0.0, 'A6': 0.0, 'A7': 0.0, 'A8': 0.0, 'A9': 0.0, 'A10': 0.0, 'A11': 0.0, 'A12': 0.0, 'B1': 0.0, 'B2': 0.0, 'B3': 0.0, 'B4': 0.0, 'B5': 0.0, 'B6': 0.0, 'B7': 0.0, 'B8': 0.0, 'B9': 0.0, 'B10': 0.0, 'B11': 0.0, 'B12': 0.0, 'C1': 0.0, 'C2': 0.0, 'C3': 0.0, 'C4': 0.0, 'C5': 0.0, 'C6': 0.0, 'C7': 0.0, 'C8': 0.0, 'C9': 0.0, 'C10': 0.0, 'C11': 0.0, 'C12': 0.0, 'D1': 0.0, 'D2': 0.0, 'D3': 0.0, 'D4': 0.0, 'D5': 0.0, 'D6': 0.0, 'D7': 0.0, 'D8': 0.0, 'D9': 0.0, 'D10': 0.0, 'D11': 0.0, 'D12': 0.0, 'E1': 0.0, 'E2': 0.0, 'E3': 0.0, 'E4': 0.0, 'E5': 0.0, 'E6': 0.0, 'E7': 0.0, 'E8': 0.0, 'E9': 0.0, 'E10': 0.0, 'E11': 0.0, 'E12': 0.0, 'F1': 0.0, 'F2': 0.0, 'F3': 0.0, 'F4': 0.0, 'F5': 0.0, 'F6': 0.0, 'F7': 0.0, 'F8': 0.0, 'F9': 0.0, 'F10': 0.0, 'F11': 0.0, 'F12': 0.0, 'G1': 0.0, 'G2': 0.0, 'G3': 0.0, 'G4': 0.0, 'G5': 0.0, 'G6': 0.0, 'G7': 0.0, 'G8': 0.0, 'G9': 0.0, 'G10': 0.0, 'G11': 0.0, 'G12': 0.0, 'H1': 0.0, 'H2': 0.0, 'H3': 0.0, 'H4': 0.0, 'H5': 0.0, 'H6': 0.0, 'H7': 0.0, 'H8': 0.0, 'H9': 0.0, 'H10': 0.0, 'H11': 0.0, 'H12': 0.0}}" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "waitForResume", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "b042e24dd46699520cdedd3f0201ca91", + "notes": [], + "params": { + "message": "single: {600: {'A1': 0.0, 'A2': 0.0, 'A3': 0.0, 'A4': 0.0, 'A5': 0.0, 'A6': 0.0, 'A7': 0.0, 'A8': 0.0, 'A9': 0.0, 'A10': 0.0, 'A11': 0.0, 'A12': 0.0, 'B1': 0.0, 'B2': 0.0, 'B3': 0.0, 'B4': 0.0, 'B5': 0.0, 'B6': 0.0, 'B7': 0.0, 'B8': 0.0, 'B9': 0.0, 'B10': 0.0, 'B11': 0.0, 'B12': 0.0, 'C1': 0.0, 'C2': 0.0, 'C3': 0.0, 'C4': 0.0, 'C5': 0.0, 'C6': 0.0, 'C7': 0.0, 'C8': 0.0, 'C9': 0.0, 'C10': 0.0, 'C11': 0.0, 'C12': 0.0, 'D1': 0.0, 'D2': 0.0, 'D3': 0.0, 'D4': 0.0, 'D5': 0.0, 'D6': 0.0, 'D7': 0.0, 'D8': 0.0, 'D9': 0.0, 'D10': 0.0, 'D11': 0.0, 'D12': 0.0, 'E1': 0.0, 'E2': 0.0, 'E3': 0.0, 'E4': 0.0, 'E5': 0.0, 'E6': 0.0, 'E7': 0.0, 'E8': 0.0, 'E9': 0.0, 'E10': 0.0, 'E11': 0.0, 'E12': 0.0, 'F1': 0.0, 'F2': 0.0, 'F3': 0.0, 'F4': 0.0, 'F5': 0.0, 'F6': 0.0, 'F7': 0.0, 'F8': 0.0, 'F9': 0.0, 'F10': 0.0, 'F11': 0.0, 'F12': 0.0, 'G1': 0.0, 'G2': 0.0, 'G3': 0.0, 'G4': 0.0, 'G5': 0.0, 'G6': 0.0, 'G7': 0.0, 'G8': 0.0, 'G9': 0.0, 'G10': 0.0, 'G11': 0.0, 'G12': 0.0, 'H1': 0.0, 'H2': 0.0, 'H3': 0.0, 'H4': 0.0, 'H5': 0.0, 'H6': 0.0, 'H7': 0.0, 'H8': 0.0, 'H9': 0.0, 'H10': 0.0, 'H11': 0.0, 'H12': 0.0}}" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "absorbanceReader/openLid", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "09edafc3bb1819d89e21f50c773a8b1b", + "notes": [], + "params": { + "moduleId": "UUID" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "055de5adcc2476b33f12d303e2f7cd33", + "notes": [], + "params": { + "labwareId": "UUID", + "newLocation": { + "slotName": "C2" + }, + "strategy": "usingGripper" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "55fb67ef834deb180669717bbf9bcd08", + "notes": [], + "params": { + "labwareId": "UUID", + "newLocation": "offDeck", + "strategy": "manualMoveWithPause" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "pickUpTip", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "1c42b3e678be0b97d217eda3ba27d0ff", + "notes": [], + "params": { + "labwareId": "UUID", + "pipetteId": "UUID", + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 395.38, + "z": 110.0 + }, + "tipDiameter": 5.47, + "tipLength": 85.38999999999999, + "tipVolume": 1000.0 + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "7a9ace3c6ffc32e339e9199029c6e542", + "notes": [], + "params": { + "forceDirect": false, + "labwareId": "UUID", + "pipetteId": "UUID", + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 16.0 + } + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "waitForResume", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "084b51ab7765e9610bb25aad3c5b1420", + "notes": [], + "params": { + "message": "Is the pipette tip in the middle of the PCR Plate, well A1, in slot C2? It should be at the LPC calibrated height." + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "reloadLabware", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "2df58176bd8560ade9f37f43564db735", + "notes": [], + "params": { + "labwareId": "UUID" + }, + "result": { + "labwareId": "UUID", + "offsetId": "UUID" + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "bded418ba653fcd22e912654c04201ce", + "notes": [], + "params": { + "forceDirect": false, + "labwareId": "UUID", + "pipetteId": "UUID", + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 26.0 + } + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "waitForResume", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "d24f2277648c132f7aa5610e8afd4a16", + "notes": [], + "params": { + "message": "Is the pipette tip in the middle of the PCR Plate, well A1, in slot C2? It should be 10mm higher than the LPC calibrated height." + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "77f86a46915f1f1983f21b7554d629a3", + "notes": [], + "params": { + "labwareId": "UUID", + "newLocation": { + "slotName": "D2" + }, + "strategy": "manualMoveWithPause" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "b95e1bdd513812eb0f58b6b868ff95ff", + "notes": [], + "params": { + "forceDirect": false, + "labwareId": "UUID", + "pipetteId": "UUID", + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 74.24, + "z": 16.0 + } + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "waitForResume", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "1fd12fd0b35e829620c353dfa08361b7", + "notes": [], + "params": { + "message": "Is the pipette tip in the middle of the PCR Plate, well A1, in slot D2? It should be at the LPC calibrated height." + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "reloadLabware", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "4b3b80805d46a3dda0c85c4bd3ac65f7", + "notes": [], + "params": { + "labwareId": "UUID" + }, + "result": { + "labwareId": "UUID", + "offsetId": "UUID" + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "9283a054c84e7ebfbcafa37fb521bcbb", + "notes": [], + "params": { + "forceDirect": false, + "labwareId": "UUID", + "pipetteId": "UUID", + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 74.24, + "z": 26.0 + } + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "waitForResume", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "8091e40fd9cd4ee7383042b2d7c05138", + "notes": [], + "params": { + "message": "Is the pipette tip in the middle of the PCR Plate, well A1, in slot D2? It should be 10mm higher than the LPC calibrated height." + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "3f56958b0a32d667ef60cd9d31c04fd3", + "notes": [], + "params": { + "labwareId": "UUID", + "newLocation": { + "slotName": "C2" + }, + "strategy": "manualMoveWithPause" + }, + "result": { + "offsetId": "UUID" + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "853869a39e88a9d5a4d957d55ba28677", + "notes": [], + "params": { + "forceDirect": false, + "labwareId": "UUID", + "pipetteId": "UUID", + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 181.24, + "z": 26.0 + } + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "waitForResume", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "704a3d359b6a341879d4c2a6bee6e5d9", + "notes": [], + "params": { + "message": "Is the pipette tip in the middle of the PCR Plate, well A1, in slot C2? It should be 10mm higher than the LPC calibrated height." + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "a0930229a45be6add3b6f59133da1de6", + "notes": [], + "params": { + "labwareId": "UUID", + "newLocation": { + "slotName": "D2" + }, + "strategy": "manualMoveWithPause" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "moveToWell", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "471a6fca269ae526432b1af3abd27b1a", + "notes": [], + "params": { + "forceDirect": false, + "labwareId": "UUID", + "pipetteId": "UUID", + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "top", + "volumeOffset": 0.0 + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 227.88, + "y": 42.74, + "z": 44.4 + } + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "waitForResume", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "b8898277b6b61116b58e55e0dbb28563", + "notes": [], + "params": { + "message": "Is the pipette tip in the middle of the reservoir , well A1, in slot D2? It should be at the LPC calibrated height." + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "dropTip", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "c92dcade8aedaf07ae1091b486804e95", + "notes": [], + "params": { + "alternateDropLocation": false, + "labwareId": "UUID", + "pipetteId": "UUID", + "wellLocation": { + "offset": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "origin": "default" + }, + "wellName": "A1" + }, + "result": { + "position": { + "x": 178.38, + "y": 395.38, + "z": 90.88 + } + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "aa312bc19fee7fed08946bfb02cafef4", + "notes": [], + "params": { + "labwareId": "UUID", + "newLocation": { + "addressableAreaName": "gripperWasteChute" + }, + "strategy": "usingGripper" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "waitForResume", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "c9392d146973b6fc471984b1ecea94df", + "notes": [], + "params": { + "message": "!!!!!!!!!!YOU NEED TO REDO LPC!!!!!!!!!!" + }, + "result": {}, + "startedAt": "TIMESTAMP", + "status": "succeeded" + } + ], + "config": { + "apiVersion": [ + 2, + 21 + ], + "protocolType": "python" + }, + "createdAt": "TIMESTAMP", + "errors": [], + "files": [ + { + "name": "Flex_S_v2_21_P1000_96_GRIP_HS_MB_TC_TM_Smoke.py", + "role": "main" + } + ], + "labware": [ + { + "definitionUri": "opentrons/opentrons_flex_deck_riser/1", + "id": "UUID", + "loadName": "opentrons_flex_deck_riser", + "location": { + "addressableAreaName": "A4" + } + }, + { + "definitionUri": "opentrons/opentrons_tough_pcr_auto_sealing_lid/1", + "id": "UUID", + "loadName": "opentrons_tough_pcr_auto_sealing_lid", + "location": { + "labwareId": "UUID" + } + }, + { + "definitionUri": "opentrons/opentrons_tough_pcr_auto_sealing_lid/1", + "id": "UUID", + "loadName": "opentrons_tough_pcr_auto_sealing_lid", + "location": { + "labwareId": "UUID" + } + }, + { + "definitionUri": "opentrons/opentrons_tough_pcr_auto_sealing_lid/1", + "id": "UUID", + "loadName": "opentrons_tough_pcr_auto_sealing_lid", + "location": { + "labwareId": "UUID" + } + }, + { + "definitionUri": "opentrons/opentrons_tough_pcr_auto_sealing_lid/1", + "id": "UUID", + "loadName": "opentrons_tough_pcr_auto_sealing_lid", + "location": { + "labwareId": "UUID" + } + }, + { + "definitionUri": "opentrons/opentrons_tough_pcr_auto_sealing_lid/1", + "id": "UUID", + "loadName": "opentrons_tough_pcr_auto_sealing_lid", + "location": "offDeck" + }, + { + "definitionUri": "opentrons/opentrons_96_well_aluminum_block/1", + "id": "UUID", + "loadName": "opentrons_96_well_aluminum_block", + "location": { + "moduleId": "UUID" + } + }, + { + "definitionUri": "opentrons/opentrons_96_pcr_adapter/1", + "id": "UUID", + "loadName": "opentrons_96_pcr_adapter", + "location": { + "moduleId": "UUID" + } + }, + { + "definitionUri": "opentrons/nest_1_reservoir_290ml/1", + "id": "UUID", + "loadName": "nest_1_reservoir_290ml", + "location": { + "slotName": "D2" + } + }, + { + "definitionUri": "opentrons/opentrons_96_wellplate_200ul_pcr_full_skirt/2", + "id": "UUID", + "loadName": "opentrons_96_wellplate_200ul_pcr_full_skirt", + "location": { + "slotName": "C2" + }, + "offsetId": "UUID" + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_adapter/1", + "id": "UUID", + "loadName": "opentrons_flex_96_tiprack_adapter", + "location": { + "slotName": "A2" + } + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_1000ul/1", + "id": "UUID", + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": { + "labwareId": "UUID" + } + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_1000ul/1", + "id": "UUID", + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": "offDeck" + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_1000ul/1", + "id": "UUID", + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": "offDeck" + }, + { + "definitionUri": "opentrons/opentrons_flex_96_tiprack_1000ul/1", + "id": "UUID", + "loadName": "opentrons_flex_96_tiprack_1000ul", + "location": "offDeck" + } + ], + "liquidClasses": [], + "liquids": [ + { + "description": "High Quality H₂O", + "displayColor": "#42AB2D", + "displayName": "water", + "id": "UUID" + } + ], + "metadata": { + "author": "QA team", + "protocolName": "Flex Smoke Test - v2.21" + }, + "modules": [ + { + "id": "UUID", + "location": { + "slotName": "B1" + }, + "model": "thermocyclerModuleV2", + "serialNumber": "UUID" + }, + { + "id": "UUID", + "location": { + "slotName": "A3" + }, + "model": "magneticBlockV1" + }, + { + "id": "UUID", + "location": { + "slotName": "C1" + }, + "model": "heaterShakerModuleV1", + "serialNumber": "UUID" + }, + { + "id": "UUID", + "location": { + "slotName": "D1" + }, + "model": "temperatureModuleV2", + "serialNumber": "UUID" + }, + { + "id": "UUID", + "location": { + "slotName": "B3" + }, + "model": "absorbanceReaderV1", + "serialNumber": "UUID" + } + ], + "pipettes": [ + { + "id": "UUID", + "mount": "left", + "pipetteName": "p1000_96" + } + ], + "result": "ok", + "robotType": "OT-3 Standard", + "runTimeParameters": [ + { + "choices": [ + { + "displayName": "Full Smoke Test", + "value": "full" + } + ], + "default": "full", + "description": "Configuration of QA test to perform", + "displayName": "Test Configuration", + "type": "str", + "value": "full", + "variableName": "test_configuration" + }, + { + "choices": [ + { + "displayName": "Nest 1 Well 290 mL", + "value": "nest_1_reservoir_290ml" + } + ], + "default": "nest_1_reservoir_290ml", + "description": "Name of the reservoir", + "displayName": "Reservoir Name", + "type": "str", + "value": "nest_1_reservoir_290ml", + "variableName": "reservoir_name" + }, + { + "choices": [ + { + "displayName": "Opentrons Tough 96 Well 200 µL", + "value": "opentrons_96_wellplate_200ul_pcr_full_skirt" + } + ], + "default": "opentrons_96_wellplate_200ul_pcr_full_skirt", + "description": "Name of the well plate", + "displayName": "Well Plate Name", + "type": "str", + "value": "opentrons_96_wellplate_200ul_pcr_full_skirt", + "variableName": "well_plate_name" + } + ] +} From 453410e3afc7b897145dae0aaabf5c73b139f46c Mon Sep 17 00:00:00 2001 From: Jamey Huffnagle Date: Wed, 15 Jan 2025 13:42:59 -0500 Subject: [PATCH 021/150] refactor(app): refactor ODD protocol card copy when run data is not "ok" (#17261) Closes RQA-3851 When protocol cards have not ok run data, we can't retrieve the completedAt timestamp, and the fallback has been the current date, which is confusing copy. After speaking with Design, the plan is to remove copy if we can't retrieve the completedAt timestamp. --- .../RobotDashboard/RecentRunProtocolCard.tsx | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/app/src/organisms/ODD/RobotDashboard/RecentRunProtocolCard.tsx b/app/src/organisms/ODD/RobotDashboard/RecentRunProtocolCard.tsx index e522fb1dae7..a91bb4fbda1 100644 --- a/app/src/organisms/ODD/RobotDashboard/RecentRunProtocolCard.tsx +++ b/app/src/organisms/ODD/RobotDashboard/RecentRunProtocolCard.tsx @@ -158,15 +158,22 @@ export function ProtocolWithLastRun({ [RUN_STATUS_SUCCEEDED]: t('completed'), [RUN_STATUS_FAILED]: t('failed'), } - // TODO(BC, 2023-06-05): see if addSuffix false allow can remove usage of .replace here - const formattedLastRunTime = formatDistance( - // Fallback to current date if completedAt is null, though this should never happen since runs must be completed to appear in dashboard - new Date(runData.completedAt ?? new Date()), - new Date(), - { - addSuffix: true, + const formattedLastRunTime = + runData.completedAt != null + ? formatDistance(new Date(runData.completedAt), new Date(), { + addSuffix: true, + }).replace('about ', '') + : null + const buildLastRunCopy = (): string => { + if (formattedLastRunTime != null) { + return i18n.format( + `${terminationTypeMap[runData.status] ?? ''} ${formattedLastRunTime}`, + 'capitalize' + ) + } else { + return '' } - ).replace('about ', '') + } return isProtocolFetching || isLookingForHardware ? ( - {i18n.format( - `${terminationTypeMap[runData.status] ?? ''} ${formattedLastRunTime}`, - 'capitalize' - )} + {buildLastRunCopy()} ) From 3778b659285eee71eb2ec2db4eb5a13ff63a6865 Mon Sep 17 00:00:00 2001 From: Seth Foster Date: Wed, 15 Jan 2025 16:48:01 -0500 Subject: [PATCH 022/150] fix(shared-data): flex a3 needs mating surface (#17281) This is used by the client to decide whether something is a lot when it's rendering destinations, and if this doesn't exist then intervention modals will show the labware moving off deck. Closes RQA-3839 --- api/src/opentrons/protocol_engine/state/commands.py | 8 ++++++-- shared-data/deck/definitions/5/ot3_standard.json | 1 + 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/api/src/opentrons/protocol_engine/state/commands.py b/api/src/opentrons/protocol_engine/state/commands.py index e059212e73f..dd8ec108687 100644 --- a/api/src/opentrons/protocol_engine/state/commands.py +++ b/api/src/opentrons/protocol_engine/state/commands.py @@ -1,4 +1,5 @@ """Protocol engine commands sub-state.""" + from __future__ import annotations import enum @@ -304,7 +305,7 @@ def _handle_queue_command_action(self, action: QueueCommandAction) -> None: # TODO(mc, 2021-06-22): mypy has trouble with this automatic # request > command mapping, figure out how to type precisely # (or wait for a future mypy version that can figure it out). - queued_command = action.request._CommandCls.model_construct( # type: ignore[call-arg] + queued_command = action.request._CommandCls.model_construct( id=action.command_id, key=( action.request.key @@ -506,7 +507,10 @@ def _handle_door_change_action(self, action: DoorChangeAction) -> None: pass case QueueStatus.RUNNING | QueueStatus.PAUSED: self._state.queue_status = QueueStatus.PAUSED - case QueueStatus.AWAITING_RECOVERY | QueueStatus.AWAITING_RECOVERY_PAUSED: + case ( + QueueStatus.AWAITING_RECOVERY + | QueueStatus.AWAITING_RECOVERY_PAUSED + ): self._state.queue_status = QueueStatus.AWAITING_RECOVERY_PAUSED elif action.door_state == DoorState.CLOSED: self._state.is_door_blocking = False diff --git a/shared-data/deck/definitions/5/ot3_standard.json b/shared-data/deck/definitions/5/ot3_standard.json index fe47adc0a3c..55ed1fbe16b 100644 --- a/shared-data/deck/definitions/5/ot3_standard.json +++ b/shared-data/deck/definitions/5/ot3_standard.json @@ -149,6 +149,7 @@ "id": "A3", "areaType": "slot", "offsetFromCutoutFixture": [0.0, 0.0, 0.0], + "matingSurfaceUnitVector": [-1, 1, -1], "boundingBox": { "xDimension": 128.0, "yDimension": 86.0, From 7bc38f848811ffe7d141a28a89e27c39d9c89521 Mon Sep 17 00:00:00 2001 From: Jamey Huffnagle Date: Wed, 15 Jan 2025 17:46:55 -0500 Subject: [PATCH 023/150] fix(app): fix manual move to location with module (#17283) Closes RQA-3839 --- components/src/hardware-sim/Deck/MoveLabwareOnDeck.tsx | 2 +- shared-data/js/fixtures.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/components/src/hardware-sim/Deck/MoveLabwareOnDeck.tsx b/components/src/hardware-sim/Deck/MoveLabwareOnDeck.tsx index ff1cf8483b3..8a6ffc396e9 100644 --- a/components/src/hardware-sim/Deck/MoveLabwareOnDeck.tsx +++ b/components/src/hardware-sim/Deck/MoveLabwareOnDeck.tsx @@ -38,7 +38,7 @@ const getModulePosition = ( ) if (modSlot == null) return null - const modPosition = getPositionFromSlotId(loadedModule.id, deckDef) + const modPosition = getPositionFromSlotId(modSlot.id, deckDef) if (modPosition == null) return null const [modX, modY] = modPosition diff --git a/shared-data/js/fixtures.ts b/shared-data/js/fixtures.ts index 51f46fdf433..9ab8e3a99ca 100644 --- a/shared-data/js/fixtures.ts +++ b/shared-data/js/fixtures.ts @@ -116,6 +116,7 @@ export const FLEX_SINGLE_SLOT_BY_CUTOUT_ID: { [CutoutId: string]: string } = { cutoutD3: 'D3', } +// TODO(jh 01-15-25): Instead of typing slotId as `string`, type it as `AddressableAreaName`. // returns the position associated with a slot id export function getPositionFromSlotId( slotId: string, From bb7804681ce80929de088193d277fc1a85c03738 Mon Sep 17 00:00:00 2001 From: Max Marrone Date: Thu, 16 Jan 2025 13:44:20 -0500 Subject: [PATCH 024/150] fix(api): Fix liquid getting homed into pipette after certain protocols end (#17285) Closes RESC-345. --- .../protocol_engine/execution/hardware_stopper.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/api/src/opentrons/protocol_engine/execution/hardware_stopper.py b/api/src/opentrons/protocol_engine/execution/hardware_stopper.py index 81d4f10d94d..0312f622ac9 100644 --- a/api/src/opentrons/protocol_engine/execution/hardware_stopper.py +++ b/api/src/opentrons/protocol_engine/execution/hardware_stopper.py @@ -65,7 +65,7 @@ async def _home_everything_except_plungers(self) -> None: axes=[MotorAxis.X, MotorAxis.Y, MotorAxis.LEFT_Z, MotorAxis.RIGHT_Z] ) - async def _drop_tip(self) -> None: + async def _try_to_drop_tips(self) -> None: """Drop currently attached tip, if any, into trash after a run cancel.""" attached_tips = self._state_store.pipettes.get_all_attached_tips() @@ -134,9 +134,9 @@ async def do_stop_and_recover( PostRunHardwareState.HOME_THEN_DISENGAGE, ) if drop_tips_after_run: - await self._drop_tip() - await self._hardware_api.stop(home_after=home_after_stop) - else: - await self._hardware_api.stop(home_after=False) - if home_after_stop: - await self._home_everything_except_plungers() + await self._try_to_drop_tips() + + await self._hardware_api.stop(home_after=False) + + if home_after_stop: + await self._home_everything_except_plungers() From 27d2dc8839d69d5fcfdab5556bd1e318e700394b Mon Sep 17 00:00:00 2001 From: Sarah Breen Date: Fri, 17 Jan 2025 10:28:30 -0500 Subject: [PATCH 025/150] fix(shared-data): fix getPipetteSpecsV2 finding PEEK pipette specs (#17296) fix RQA-3852 --- shared-data/js/pipettes.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/shared-data/js/pipettes.ts b/shared-data/js/pipettes.ts index 134f4efbd82..5b390617f43 100644 --- a/shared-data/js/pipettes.ts +++ b/shared-data/js/pipettes.ts @@ -161,6 +161,7 @@ const getHighestVersion = ( path: string, pipetteModel: string, channels: Channels | null, + oemString: string, majorVersion: number, highestVersion: string ): string => { @@ -174,10 +175,10 @@ const getHighestVersion = ( // and make sure the given model, channels, and major/minor versions // are found in the path if ( - minorPathVersion > minorHighestVersion && + minorPathVersion >= minorHighestVersion && path.includes(`${majorPathVersion}_${minorPathVersion}`) && path.includes(pipetteModel) && - path.includes(channels ?? '') + path.includes(channels != null ? `${channels}${oemString}` : '') ) { highestVersion = `${majorPathVersion}_${minorPathVersion}` } @@ -239,6 +240,7 @@ export const getPipetteSpecsV2 = ( path, pipetteModel, channels, + oemString, majorVersion, highestVersion ) From 9c70751ef891f10c5aee16e0b75aa73713e7434e Mon Sep 17 00:00:00 2001 From: Jamey Huffnagle Date: Tue, 21 Jan 2025 12:53:28 -0500 Subject: [PATCH 026/150] refactor(app): Fix copy/CSS for stall/collision recovery DQA (#17298) Closes RQA-3870 and RQA-3871 Brings the stall/collision recovery flow in-line with designs. See the tickets for details and fixes. --- app/src/assets/localization/en/error_recovery.json | 2 +- .../ErrorRecoveryFlows/shared/RecoveryInterventionModal.tsx | 2 +- .../shared/__tests__/RetryStepInfo.test.tsx | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/assets/localization/en/error_recovery.json b/app/src/assets/localization/en/error_recovery.json index e4e1b5164eb..3f22e2e63f9 100644 --- a/app/src/assets/localization/en/error_recovery.json +++ b/app/src/assets/localization/en/error_recovery.json @@ -110,7 +110,7 @@ "stand_back_retrying": "Stand back, retrying failed step", "stand_back_skipping_to_next_step": "Stand back, skipping to next step", "take_any_necessary_precautions": "Take any necessary precautions before positioning yourself to stabilize or catch the labware. Once confirmed, a countdown will begin before the gripper releases.", - "take_necessary_actions": "First, take any necessary actions to prepare the robot to retry the failed step.Then, close the robot door before proceeding.", + "take_necessary_actions": "Take any necessary additional actions to prepare the robot to retry the failed step.Close the robot door before proceeding.", "take_necessary_actions_failed_pickup": "First, take any necessary actions to prepare the robot to retry the failed tip pickup.Then, close the robot door before proceeding.", "take_necessary_actions_failed_tip_drop": "First, take any necessary actions to prepare the robot to retry the failed tip drop.Then, close the robot door before proceeding.", "take_necessary_actions_home": "Take any necessary actions to prepare the robot to move the gantry to its home position.Close the robot door before proceeding.", diff --git a/app/src/organisms/ErrorRecoveryFlows/shared/RecoveryInterventionModal.tsx b/app/src/organisms/ErrorRecoveryFlows/shared/RecoveryInterventionModal.tsx index 73ac8497deb..cba8719e376 100644 --- a/app/src/organisms/ErrorRecoveryFlows/shared/RecoveryInterventionModal.tsx +++ b/app/src/organisms/ErrorRecoveryFlows/shared/RecoveryInterventionModal.tsx @@ -38,7 +38,7 @@ export function RecoveryInterventionModal({ } return createPortal( - + { render(props) screen.getByText( - 'First, take any necessary actions to prepare the robot to retry the failed step.' + 'Take any necessary additional actions to prepare the robot to retry the failed step.' ) - screen.getByText('Then, close the robot door before proceeding.') + screen.getByText('Close the robot door before proceeding.') }) }) From 0da7b99eed992c1108264187acb83a3f68de546c Mon Sep 17 00:00:00 2001 From: Jamey Huffnagle Date: Tue, 21 Jan 2025 17:46:53 -0500 Subject: [PATCH 027/150] fix(app): Fix double drop tip prompting after Error Recovery cancel action (#17316) This commit brings the `lastRunCommandPromptedErrorRecovery` util back and adds the new and improved behavior to also check if Error Recovery is enabled (in settings). If it's not enabled, we need to run tip detection even if the last run command was recoverable. --- .../local-resources/commands/utils/index.ts | 1 + .../lastRunCommandPromptedErrorRecovery.ts | 12 ++++++++ .../hooks/useRunHeaderDropTip.ts | 28 +++++++++++++++++-- app/src/pages/ODD/RunSummary/index.tsx | 16 +++++++++-- 4 files changed, 52 insertions(+), 5 deletions(-) create mode 100644 app/src/local-resources/commands/utils/lastRunCommandPromptedErrorRecovery.ts diff --git a/app/src/local-resources/commands/utils/index.ts b/app/src/local-resources/commands/utils/index.ts index 7aa84d14de5..cc4e9c2579a 100644 --- a/app/src/local-resources/commands/utils/index.ts +++ b/app/src/local-resources/commands/utils/index.ts @@ -1 +1,2 @@ export * from './getCommandTextData' +export * from './lastRunCommandPromptedErrorRecovery' diff --git a/app/src/local-resources/commands/utils/lastRunCommandPromptedErrorRecovery.ts b/app/src/local-resources/commands/utils/lastRunCommandPromptedErrorRecovery.ts new file mode 100644 index 00000000000..673ed431220 --- /dev/null +++ b/app/src/local-resources/commands/utils/lastRunCommandPromptedErrorRecovery.ts @@ -0,0 +1,12 @@ +import type { RunCommandSummary } from '@opentrons/api-client' +// Whether the last run protocol command prompted Error Recovery, if Error Recovery is enabled. +export function lastRunCommandPromptedErrorRecovery( + summary: RunCommandSummary[] | null, + isEREnabled: boolean +): boolean { + const lastProtocolCommand = summary?.findLast( + command => command.intent !== 'fixit' && command.error != null + ) + // All recoverable protocol commands have defined errors. + return isEREnabled ? lastProtocolCommand?.error?.isDefined ?? false : false +} diff --git a/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderModalContainer/hooks/useRunHeaderDropTip.ts b/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderModalContainer/hooks/useRunHeaderDropTip.ts index 0ff96a562df..3363a225ec7 100644 --- a/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderModalContainer/hooks/useRunHeaderDropTip.ts +++ b/app/src/organisms/Desktop/Devices/ProtocolRun/ProtocolRunHeader/RunHeaderModalContainer/hooks/useRunHeaderDropTip.ts @@ -2,12 +2,18 @@ import { useEffect } from 'react' import { RUN_STATUS_IDLE, RUN_STATUS_STOPPED } from '@opentrons/api-client' import { FLEX_ROBOT_TYPE, OT2_ROBOT_TYPE } from '@opentrons/shared-data' +import { useErrorRecoverySettings } from '@opentrons/react-api-client' import { useDropTipWizardFlows } from '/app/organisms/DropTipWizardFlows' import { useProtocolDropTipModal } from '../modals' -import { useCloseCurrentRun, useIsRunCurrent } from '/app/resources/runs' +import { + useCloseCurrentRun, + useCurrentRunCommands, + useIsRunCurrent, +} from '/app/resources/runs' import { isTerminalRunStatus } from '../../utils' import { useTipAttachmentStatus } from '/app/resources/instruments' +import { lastRunCommandPromptedErrorRecovery } from '/app/local-resources/commands' import type { RobotType } from '@opentrons/shared-data' import type { Run, RunStatus } from '@opentrons/api-client' @@ -99,17 +105,33 @@ export function useRunHeaderDropTip({ : { showDTWiz: false, dtWizProps: null } } + const { data } = useErrorRecoverySettings() + const isEREnabled = data?.data.enabled ?? true + const runSummaryNoFixit = useCurrentRunCommands( + { + includeFixitCommands: false, + pageLength: 1, + }, + { enabled: isTerminalRunStatus(runStatus) } + ) + // Manage tip checking useEffect(() => { // If a user begins a new run without navigating away from the run page, reset tip status. if (robotType === FLEX_ROBOT_TYPE) { if (runStatus === RUN_STATUS_IDLE) { resetTipStatus() - } else if (isRunCurrent && isTerminalRunStatus(runStatus)) { + } + // Only run tip checking if it wasn't *just* handled during Error Recovery. + else if ( + !lastRunCommandPromptedErrorRecovery(runSummaryNoFixit, isEREnabled) && + isRunCurrent && + isTerminalRunStatus(runStatus) + ) { void determineTipStatus() } } - }, [runStatus, robotType, isRunCurrent]) + }, [runStatus, robotType, isRunCurrent, runSummaryNoFixit, isEREnabled]) // If the run terminates with a "stopped" status, close the run if no tips are attached after running tip check at least once. // This marks the robot as "not busy" if drop tip CTAs are unnecessary. diff --git a/app/src/pages/ODD/RunSummary/index.tsx b/app/src/pages/ODD/RunSummary/index.tsx index 9d1f73d7e3b..57c6ffe96ee 100644 --- a/app/src/pages/ODD/RunSummary/index.tsx +++ b/app/src/pages/ODD/RunSummary/index.tsx @@ -39,6 +39,7 @@ import { useProtocolQuery, useDeleteRunMutation, useRunCommandErrors, + useErrorRecoverySettings, } from '@opentrons/react-api-client' import { useRunControls } from '/app/organisms/RunTimeControl/hooks' import { onDeviceDisplayFormatTimestamp } from '/app/transformations/runs' @@ -65,9 +66,11 @@ import { useRunCreatedAtTimestamp, useCloseCurrentRun, EMPTY_TIMESTAMP, + useCurrentRunCommands, } from '/app/resources/runs' import { handleTipsAttachedModal } from '/app/organisms/DropTipWizardFlows' import { useTipAttachmentStatus } from '/app/resources/instruments' +import { lastRunCommandPromptedErrorRecovery } from '/app/local-resources/commands' import type { IconName } from '@opentrons/components' import type { OnDeviceRouteParams } from '/app/App/types' @@ -233,10 +236,19 @@ export function RunSummary(): JSX.Element { runId, runRecord: runRecord ?? null, }) + const { data } = useErrorRecoverySettings() + const isEREnabled = data?.data.enabled ?? true + const runSummaryNoFixit = useCurrentRunCommands({ + includeFixitCommands: false, + pageLength: 1, + }) useEffect(() => { - void determineTipStatus() - }, []) + // Only run tip checking if it wasn't *just* handled during Error Recovery. + if (!lastRunCommandPromptedErrorRecovery(runSummaryNoFixit, isEREnabled)) { + void determineTipStatus() + } + }, [isRunCurrent, runSummaryNoFixit, isEREnabled]) const returnToQuickTransfer = (): void => { closeCurrentRunIfValid(() => { From 4940eb7deedf33a58d6cd30efd4ec1a453422d95 Mon Sep 17 00:00:00 2001 From: Josh McVey Date: Tue, 21 Jan 2025 20:13:26 -0600 Subject: [PATCH 028/150] chore(app): locize fuzzy tags removed (#17305) --- .../assets/localization/zh/app_settings.json | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/app/src/assets/localization/zh/app_settings.json b/app/src/assets/localization/zh/app_settings.json index 035963eacaa..d174021a3cf 100644 --- a/app/src/assets/localization/zh/app_settings.json +++ b/app/src/assets/localization/zh/app_settings.json @@ -2,8 +2,11 @@ "__dev_internal__enableLabwareCreator": "启用应用实验耗材创建器", "__dev_internal__enableRunNotes": "在协议运行期间显示备注", "__dev_internal__forceHttpPolling": "强制轮询所有网络请求,而不是使用MQTT", + "__dev_internal__lpcRedesign": "LPC 重新设计", "__dev_internal__protocolStats": "协议统计", "__dev_internal__protocolTimeline": "协议时间线", + "__dev_internal__reactQueryDevtools": "启用开发者工具", + "__dev_internal__reactScan": "启用 React 组件扫描", "add_folder_button": "添加实验耗材源文件夹", "add_ip_button": "添加", "add_ip_error": "输入IP地址或主机名", @@ -14,11 +17,14 @@ "additional_labware_folder_title": "其他定制实验耗材源文件夹", "advanced": "高级", "app_changes": "应用程序更改于", + "app_language_description": "应用的所有功能界面将使用所选语言显示,但协议和用户生成的内容(如文本或文件)将保持原有语言,不会随语言设置而改变。", + "app_language_preferences": "应用程序语言偏好设置", "app_settings": "应用设置", "bug_fixes": "错误修复", "cal_block": "始终使用校准块进行校准", "change_folder_button": "更改实验耗材源文件夹", "channel": "通道", + "choose_your_language": "选择语言", "clear_confirm": "清除不可用的工作站", "clear_robots_button": "清除不可用工作站列表", "clear_robots_description": "清除设备页面上不可用工作站的列表。此操作无法撤消。", @@ -30,19 +36,27 @@ "connect_ip_button": "完成", "connect_ip_link": "了解更多关于手动连接工作站的信息", "discovery_timeout": "发现超时。", + "dont_change": "不改变", + "dont_remind_me": "不需要再次提醒", "download_update": "正在下载更新...", + "driver_out_of_date": "网卡驱动程序更新可用", "enable_dev_tools": "开发者工具", "enable_dev_tools_description": "启用此设置将在应用启动时打开开发者工具,打开额外的日志记录并访问功能标志。", "error_boundary_desktop_app_description": "您需要重新加载应用程序。出现以下错误信息,请联系技术支持:", "error_boundary_title": "发生未知错误", + "error_recovery_mode": "恢复模式", + "error_recovery_mode_description": "出现协议错误时暂停,而不是取消运行。", "feature_flags": "功能标志", "general": "通用", + "get_update": "获取更新", "heater_shaker_attach_description": "在进行测试振荡功能或在协议中使用热震荡模块功能之前,显示正确连接热震荡模块的提醒。", "heater_shaker_attach_visible": "确认热震荡模块连接", "how_to_restore": "如何恢复过往的软件版本", "installing_update": "正在安装更新...", "ip_available": "可用", "ip_description_first": "输入IP地址或主机名以连接到工作站。", + "language": "语言", + "language_preference": "语言偏好", "manage_versions": "工作站版本和应用程序软件版本必须一致。通过工作站设置 > 高级查看工作站软件版本。", "new_features": "新功能", "no_folder": "未指定其他源文件夹", @@ -55,6 +69,7 @@ "ot2_advanced_settings": "OT-2高级设置", "override_path": "覆盖路径", "override_path_to_python": "覆盖Python路径", + "please_update_driver": "请更新您的计算机的驱动程序以确保与 OT-2 稳定连接。", "prevent_robot_caching": "阻止工作站进行缓存", "prevent_robot_caching_description": "启用此功能后,应用程序将立即清除不可用的工作站,并且不会记住它们。在网络上有许多工作站的情况下,防止缓存可能会提高网络性能,但代价是在应用程序启动时工作站发现的速度变慢且可靠性降低。", "privacy": "隐私", @@ -68,6 +83,8 @@ "restarting_app": "下载完成,正在重启应用程序...", "restore_previous": "查看如何恢复过往软件版本", "searching": "正在搜索30秒", + "select_a_language": "请选择使用语言。", + "select_language": "选择语言", "setup_connection": "设置连接", "share_display_usage": "分享屏幕使用情况", "share_robot_logs": "分享工作站日志", @@ -76,10 +93,12 @@ "software_update_available": "有可用的软件更新", "software_version": "应用程序软件版本", "successfully_deleted_unavail_robots": "成功删除不可用的工作站", + "system_language_preferences_update": "更新您的系统语言偏好设置", "tip_length_cal_method": "吸头长度校准方法", "trash_bin": "始终使用垃圾桶进行校准", "try_restarting_the_update": "尝试重新启动更新。", "turn_off_updates": "在应用程序设置中关闭软件更新通知。", + "u2e_driver_outdated_message": "您的计算机有可用的网卡驱动程序更新。", "up_to_date": "最新", "update_alerts": "软件更新提醒", "update_app_now": "立即更新应用程序", @@ -97,6 +116,8 @@ "usb_to_ethernet_not_connected": "没有连接USB-to-Ethernet适配器", "usb_to_ethernet_unknown_manufacturer": "未知制造商", "usb_to_ethernet_unknown_product": "未知适配器", + "use_system_language": "使用系统语言", + "view_adapter_info": "查看适配器信息", "view_software_update": "查看软件更新", "view_update": "查看更新" } From 1e47fe3136b198abfa57d2afa183fc02abfbb942 Mon Sep 17 00:00:00 2001 From: Seth Foster Date: Wed, 22 Jan 2025 09:44:00 -0500 Subject: [PATCH 029/150] fix(app): various odd modal width fixes under i18n (#17307) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - the takeover modal for maintenance runs (RQA-3868) - run start confirmation (not tagged yet) - run cancel confirmation (RQA-3869) Closes RQA-3868 Closes RQA-3869 Screenshot 2025-01-17 at 4 58 05 PM Screenshot 2025-01-17 at 4 58 40 PM Screenshot 2025-01-17 at 5 05 22 PM --- .../organisms/ODD/RunningProtocol/ConfirmCancelRunModal.tsx | 2 +- app/src/organisms/TakeoverModal/TakeoverModal.tsx | 4 +++- .../ODD/ProtocolSetup/ConfirmSetupStepsCompleteModal.tsx | 6 +++++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/app/src/organisms/ODD/RunningProtocol/ConfirmCancelRunModal.tsx b/app/src/organisms/ODD/RunningProtocol/ConfirmCancelRunModal.tsx index 453e3152ad4..13e3e08885d 100644 --- a/app/src/organisms/ODD/RunningProtocol/ConfirmCancelRunModal.tsx +++ b/app/src/organisms/ODD/RunningProtocol/ConfirmCancelRunModal.tsx @@ -112,7 +112,7 @@ export function ConfirmCancelRunModal({ setShowConfirmCancelRunModal(false) }} > - + - + {t('branded:confirm_terminate')} @@ -79,6 +79,7 @@ export function TakeoverModal(props: TakeoverModalProps): JSX.Element { gridGap={SPACING.spacing40} alignItems={ALIGN_CENTER} justifyContent={ALIGN_CENTER} + width="100%" > - + {t('you_havent_confirmed', { missingSteps: new Intl.ListFormat('en', { From 8cea8e59c757c6f4faa9815937ace4bf85259737 Mon Sep 17 00:00:00 2001 From: Seth Foster Date: Wed, 22 Jan 2025 12:57:38 -0500 Subject: [PATCH 030/150] chore(api): fix tests after #17285 (#17313) That PR changed the stop behavior on OT-2 to fix some bugs but the tests didn't get changed. Fix the tests. --- .../execution/test_hardware_stopper.py | 50 +++++++++++++------ 1 file changed, 36 insertions(+), 14 deletions(-) diff --git a/api/tests/opentrons/protocol_engine/execution/test_hardware_stopper.py b/api/tests/opentrons/protocol_engine/execution/test_hardware_stopper.py index 503d681bced..c3a1e38d490 100644 --- a/api/tests/opentrons/protocol_engine/execution/test_hardware_stopper.py +++ b/api/tests/opentrons/protocol_engine/execution/test_hardware_stopper.py @@ -1,4 +1,5 @@ """Test hardware stopping execution and side effects.""" + from __future__ import annotations import pytest @@ -78,12 +79,12 @@ async def test_hardware_halt( @pytest.mark.parametrize( - argnames=["post_run_hardware_state", "expected_home_after"], - argvalues=[ - (PostRunHardwareState.STAY_ENGAGED_IN_PLACE, False), - (PostRunHardwareState.DISENGAGE_IN_PLACE, False), - (PostRunHardwareState.HOME_AND_STAY_ENGAGED, True), - (PostRunHardwareState.HOME_THEN_DISENGAGE, True), + "post_run_hardware_state", + [ + PostRunHardwareState.STAY_ENGAGED_IN_PLACE, + PostRunHardwareState.DISENGAGE_IN_PLACE, + PostRunHardwareState.HOME_AND_STAY_ENGAGED, + PostRunHardwareState.HOME_THEN_DISENGAGE, ], ) async def test_hardware_stopping_sequence( @@ -94,7 +95,6 @@ async def test_hardware_stopping_sequence( mock_tip_handler: TipHandler, subject: HardwareStopper, post_run_hardware_state: PostRunHardwareState, - expected_home_after: bool, ) -> None: """It should stop the hardware, and home the robot. Flex no longer performs automatic drop tip..""" decoy.when(state_store.pipettes.get_all_attached_tips()).then_return( @@ -113,7 +113,7 @@ async def test_hardware_stopping_sequence( await movement.home( axes=[MotorAxis.X, MotorAxis.Y, MotorAxis.LEFT_Z, MotorAxis.RIGHT_Z] ), - await hardware_api.stop(home_after=expected_home_after), + await hardware_api.stop(home_after=False), ) @@ -122,6 +122,7 @@ async def test_hardware_stopping_sequence_without_pipette_tips( hardware_api: HardwareAPI, state_store: StateStore, subject: HardwareStopper, + movement: MovementHandler, ) -> None: """Don't drop tip when there aren't any tips attached to pipettes.""" decoy.when(state_store.pipettes.get_all_attached_tips()).then_return([]) @@ -132,7 +133,10 @@ async def test_hardware_stopping_sequence_without_pipette_tips( ) decoy.verify( - await hardware_api.stop(home_after=True), + await hardware_api.stop(home_after=False), + await movement.home( + [MotorAxis.X, MotorAxis.Y, MotorAxis.LEFT_Z, MotorAxis.RIGHT_Z] + ), ) @@ -171,6 +175,7 @@ async def test_hardware_stopping_sequence_no_pipette( state_store: StateStore, hardware_api: HardwareAPI, mock_tip_handler: TipHandler, + movement: MovementHandler, subject: HardwareStopper, ) -> None: """It should gracefully no-op if the HW API reports no attached pipette.""" @@ -193,8 +198,14 @@ async def test_hardware_stopping_sequence_no_pipette( ) decoy.verify( - await hardware_api.stop(home_after=True), - times=1, + await hardware_api.stop(home_after=False), + await movement.home( + [MotorAxis.X, MotorAxis.Y, MotorAxis.LEFT_Z, MotorAxis.RIGHT_Z] + ), + await hardware_api.stop(home_after=False), + await movement.home( + [MotorAxis.X, MotorAxis.Y, MotorAxis.LEFT_Z, MotorAxis.RIGHT_Z] + ), ) @@ -232,7 +243,11 @@ async def test_hardware_stopping_sequence_with_gripper( await movement.home( axes=[MotorAxis.X, MotorAxis.Y, MotorAxis.LEFT_Z, MotorAxis.RIGHT_Z] ), - await ot3_hardware_api.stop(home_after=True), + await ot3_hardware_api.stop(home_after=False), + await ot3_hardware_api.home_z(mount=OT3Mount.GRIPPER), + await movement.home( + axes=[MotorAxis.X, MotorAxis.Y, MotorAxis.LEFT_Z, MotorAxis.RIGHT_Z] + ), ) @@ -284,7 +299,11 @@ async def test_hardware_stopping_sequence_with_fixed_trash( pipette_id="pipette-id", home_after=False, ), - await ot3_hardware_api.stop(home_after=True), + await ot3_hardware_api.stop(home_after=False), + await ot3_hardware_api.home_z(mount=OT3Mount.GRIPPER), + await movement.home( + axes=[MotorAxis.X, MotorAxis.Y, MotorAxis.LEFT_Z, MotorAxis.RIGHT_Z] + ), ) @@ -336,5 +355,8 @@ async def test_hardware_stopping_sequence_with_OT2_addressable_area( pipette_id="pipette-id", home_after=False, ), - await hardware_api.stop(home_after=True), + await hardware_api.stop(home_after=False), + await movement.home( + axes=[MotorAxis.X, MotorAxis.Y, MotorAxis.LEFT_Z, MotorAxis.RIGHT_Z] + ), ) From 25cc087cbbbc4fd4b6bfee5f23dfe842b22d6522 Mon Sep 17 00:00:00 2001 From: Sarah Breen Date: Fri, 24 Jan 2025 17:02:04 -0500 Subject: [PATCH 031/150] fix(app): Localization DQA Fixes (#17341) fix RQA-3890, RQA-3891, RQA-3892, RQA-3864, RQA-3865, RQA-3866, --- .../src/config/__fixtures__/index.ts | 10 +++++ .../src/config/__tests__/migrate.test.ts | 14 +++++-- app-shell-odd/src/config/migrate.ts | 23 ++++++++++- app-shell/src/__fixtures__/config.ts | 6 +++ .../src/config/__tests__/migrate.test.ts | 14 +++++-- app-shell/src/config/migrate.ts | 16 +++++++- app/src/App/DesktopApp.tsx | 22 +++++------ app/src/App/Navbar.tsx | 5 ++- .../localization/en/protocol_details.json | 2 + .../assets/localization/zh/app_settings.json | 4 +- .../zh/protocol_command_text.json | 2 +- .../Desktop/AppSettings/GeneralSettings.tsx | 1 + app/src/pages/ODD/ProtocolDetails/index.tsx | 39 ++++++++++--------- .../pages/ODD/QuickTransferDetails/index.tsx | 21 +++++----- .../RobotSettingsList.tsx | 6 ++- .../redux/config/__tests__/selectors.test.ts | 4 +- app/src/redux/config/schema-types.ts | 6 ++- 17 files changed, 134 insertions(+), 61 deletions(-) diff --git a/app-shell-odd/src/config/__fixtures__/index.ts b/app-shell-odd/src/config/__fixtures__/index.ts index 7f9a48dc02c..1b05dfed7a6 100644 --- a/app-shell-odd/src/config/__fixtures__/index.ts +++ b/app-shell-odd/src/config/__fixtures__/index.ts @@ -13,6 +13,7 @@ import type { ConfigV23, ConfigV24, ConfigV25, + ConfigV26, } from '@opentrons/app/src/redux/config/types' const PKG_VERSION: string = _PKG_VERSION_ @@ -181,3 +182,12 @@ export const MOCK_CONFIG_V25: ConfigV25 = { systemLanguage: null, }, } + +export const MOCK_CONFIG_V26: ConfigV26 = { + ...MOCK_CONFIG_V25, + version: 26, + onDeviceDisplaySettings: { + ...MOCK_CONFIG_V25.onDeviceDisplaySettings, + unfinishedUnboxingFlowRoute: '/choose-language', + }, +} diff --git a/app-shell-odd/src/config/__tests__/migrate.test.ts b/app-shell-odd/src/config/__tests__/migrate.test.ts index 7ea91ee8d53..f1be25b5fe9 100644 --- a/app-shell-odd/src/config/__tests__/migrate.test.ts +++ b/app-shell-odd/src/config/__tests__/migrate.test.ts @@ -17,13 +17,14 @@ import { MOCK_CONFIG_V23, MOCK_CONFIG_V24, MOCK_CONFIG_V25, + MOCK_CONFIG_V26, } from '../__fixtures__' import { migrate } from '../migrate' vi.mock('uuid/v4') -const NEWEST_VERSION = 25 -const NEWEST_MOCK_CONFIG = MOCK_CONFIG_V25 +const NEWEST_VERSION = 26 +const NEWEST_MOCK_CONFIG = MOCK_CONFIG_V26 describe('config migration', () => { beforeEach(() => { @@ -129,10 +130,17 @@ describe('config migration', () => { expect(result.version).toBe(NEWEST_VERSION) expect(result).toEqual(NEWEST_MOCK_CONFIG) }) - it('should keep version 25', () => { + it('should migrate version 25 to latest', () => { const v25Config = MOCK_CONFIG_V25 const result = migrate(v25Config) + expect(result.version).toBe(NEWEST_VERSION) + expect(result).toEqual(NEWEST_MOCK_CONFIG) + }) + it('should keep version 26', () => { + const v26Config = MOCK_CONFIG_V26 + const result = migrate(v26Config) + expect(result.version).toBe(NEWEST_VERSION) expect(result).toEqual(NEWEST_MOCK_CONFIG) }) diff --git a/app-shell-odd/src/config/migrate.ts b/app-shell-odd/src/config/migrate.ts index b6977fbf489..48d30e1297a 100644 --- a/app-shell-odd/src/config/migrate.ts +++ b/app-shell-odd/src/config/migrate.ts @@ -18,13 +18,14 @@ import type { ConfigV23, ConfigV24, ConfigV25, + ConfigV26, } from '@opentrons/app/src/redux/config/types' // format // base config v12 defaults // any default values for later config versions are specified in the migration // functions for those version below -const CONFIG_VERSION_LATEST = 25 // update this after each config version bump +const CONFIG_VERSION_LATEST = 26 // update this after each config version bump const PKG_VERSION: string = _PKG_VERSION_ export const DEFAULTS_V12: ConfigV12 = { @@ -238,6 +239,21 @@ const toVersion25 = (prevConfig: ConfigV24): ConfigV25 => { } return nextConfig } +const toVersion26 = (prevConfig: ConfigV25): ConfigV26 => { + const nextConfig = { + ...prevConfig, + version: 26 as const, + onDeviceDisplaySettings: { + ...prevConfig.onDeviceDisplaySettings, + unfinishedUnboxingFlowRoute: + prevConfig.onDeviceDisplaySettings.unfinishedUnboxingFlowRoute === + '/welcome' + ? '/choose-language' + : prevConfig.onDeviceDisplaySettings.unfinishedUnboxingFlowRoute, + }, + } + return nextConfig +} const MIGRATIONS: [ (prevConfig: ConfigV12) => ConfigV13, @@ -252,7 +268,8 @@ const MIGRATIONS: [ (prevConfig: ConfigV21) => ConfigV22, (prevConfig: ConfigV22) => ConfigV23, (prevConfig: ConfigV23) => ConfigV24, - (prevConfig: ConfigV24) => ConfigV25 + (prevConfig: ConfigV24) => ConfigV25, + (prevConfig: ConfigV25) => ConfigV26 ] = [ toVersion13, toVersion14, @@ -267,6 +284,7 @@ const MIGRATIONS: [ toVersion23, toVersion24, toVersion25, + toVersion26, ] export const DEFAULTS: Config = migrate(DEFAULTS_V12) @@ -287,6 +305,7 @@ export function migrate( | ConfigV23 | ConfigV24 | ConfigV25 + | ConfigV26 ): Config { let result = prevConfig // loop through the migrations, skipping any migrations that are unnecessary diff --git a/app-shell/src/__fixtures__/config.ts b/app-shell/src/__fixtures__/config.ts index dd344c78532..197f594fcd3 100644 --- a/app-shell/src/__fixtures__/config.ts +++ b/app-shell/src/__fixtures__/config.ts @@ -25,6 +25,7 @@ import type { ConfigV23, ConfigV24, ConfigV25, + ConfigV26, } from '@opentrons/app/src/redux/config/types' export const MOCK_CONFIG_V0: ConfigV0 = { @@ -312,3 +313,8 @@ export const MOCK_CONFIG_V25: ConfigV25 = { systemLanguage: null, }, } + +export const MOCK_CONFIG_V26: ConfigV26 = { + ...MOCK_CONFIG_V25, + version: 26, +} diff --git a/app-shell/src/config/__tests__/migrate.test.ts b/app-shell/src/config/__tests__/migrate.test.ts index ddc151fc2cf..b61210561c5 100644 --- a/app-shell/src/config/__tests__/migrate.test.ts +++ b/app-shell/src/config/__tests__/migrate.test.ts @@ -29,13 +29,14 @@ import { MOCK_CONFIG_V23, MOCK_CONFIG_V24, MOCK_CONFIG_V25, + MOCK_CONFIG_V26, } from '../../__fixtures__' import { migrate } from '../migrate' vi.mock('uuid/v4') -const NEWEST_VERSION = 25 -const NEWEST_MOCK_CONFIG = MOCK_CONFIG_V25 +const NEWEST_VERSION = 26 +const NEWEST_MOCK_CONFIG = MOCK_CONFIG_V26 describe('config migration', () => { beforeEach(() => { @@ -234,10 +235,17 @@ describe('config migration', () => { expect(result.version).toBe(NEWEST_VERSION) expect(result).toEqual(NEWEST_MOCK_CONFIG) }) - it('should keep version 25', () => { + it('should migrate version 25 to latest', () => { const v25Config = MOCK_CONFIG_V25 const result = migrate(v25Config) + expect(result.version).toBe(NEWEST_VERSION) + expect(result).toEqual(NEWEST_MOCK_CONFIG) + }) + it('should keep version 26', () => { + const v26Config = MOCK_CONFIG_V26 + const result = migrate(v26Config) + expect(result.version).toBe(NEWEST_VERSION) expect(result).toEqual(NEWEST_MOCK_CONFIG) }) diff --git a/app-shell/src/config/migrate.ts b/app-shell/src/config/migrate.ts index 69c53ab2e72..1ad6f4900cb 100644 --- a/app-shell/src/config/migrate.ts +++ b/app-shell/src/config/migrate.ts @@ -29,13 +29,14 @@ import type { ConfigV23, ConfigV24, ConfigV25, + ConfigV26, } from '@opentrons/app/src/redux/config/types' // format // base config v0 defaults // any default values for later config versions are specified in the migration // functions for those version below -const CONFIG_VERSION_LATEST = 25 +const CONFIG_VERSION_LATEST = 26 export const DEFAULTS_V0: ConfigV0 = { version: 0, @@ -443,6 +444,14 @@ const toVersion25 = (prevConfig: ConfigV24): ConfigV25 => { return nextConfig } +const toVersion26 = (prevConfig: ConfigV25): ConfigV26 => { + const nextConfig = { + ...prevConfig, + version: 26 as const, + } + return nextConfig +} + const MIGRATIONS: [ (prevConfig: ConfigV0) => ConfigV1, (prevConfig: ConfigV1) => ConfigV2, @@ -468,7 +477,8 @@ const MIGRATIONS: [ (prevConfig: ConfigV21) => ConfigV22, (prevConfig: ConfigV22) => ConfigV23, (prevConfig: ConfigV23) => ConfigV24, - (prevConfig: ConfigV24) => ConfigV25 + (prevConfig: ConfigV24) => ConfigV25, + (prevConfig: ConfigV25) => ConfigV26 ] = [ toVersion1, toVersion2, @@ -495,6 +505,7 @@ const MIGRATIONS: [ toVersion23, toVersion24, toVersion25, + toVersion26, ] export const DEFAULTS: Config = migrate(DEFAULTS_V0) @@ -527,6 +538,7 @@ export function migrate( | ConfigV23 | ConfigV24 | ConfigV25 + | ConfigV26 ): Config { const prevVersion = prevConfig.version let result = prevConfig diff --git a/app/src/App/DesktopApp.tsx b/app/src/App/DesktopApp.tsx index 196a6cf547c..029ec99ee26 100644 --- a/app/src/App/DesktopApp.tsx +++ b/app/src/App/DesktopApp.tsx @@ -1,5 +1,4 @@ import { useState, Fragment } from 'react' -import { useTranslation } from 'react-i18next' import { Navigate, Route, Routes, useMatch } from 'react-router-dom' import { ErrorBoundary } from 'react-error-boundary' import { @@ -44,7 +43,6 @@ import { useFeatureFlag } from '../redux/config' import type { RouteProps } from './types' export const DesktopApp = (): JSX.Element => { - const { t } = useTranslation('top_navigation') useSoftwareUpdatePoll() const [ isEmergencyStopModalDismissed, @@ -70,55 +68,55 @@ export const DesktopApp = (): JSX.Element => { const desktopRoutes: RouteProps[] = [ { Component: ProtocolsLanding, - name: t('protocols'), + name: 'protocols', navLinkTo: '/protocols', path: '/protocols', }, { Component: ProtocolDetails, - name: t('protocol_details'), + name: 'Protocol Details', path: '/protocols/:protocolKey', }, { Component: ProtocolTimeline, - name: t('protocol_timeline'), + name: 'Protocol Timeline', path: '/protocols/:protocolKey/timeline', }, { Component: Labware, - name: t('labware'), + name: 'labware', navLinkTo: '/labware', path: '/labware', }, { Component: DevicesLanding, - name: t('devices'), + name: 'devices', navLinkTo: '/devices', path: '/devices', }, { Component: DeviceDetails, - name: t('device'), + name: 'Device', path: '/devices/:robotName', }, { Component: RobotSettings, - name: t('robot_settings'), + name: 'Robot Settings', path: '/devices/:robotName/robot-settings/:robotSettingsTab?', }, { Component: CalibrationDashboard, - name: t('calibration_dashboard'), + name: 'Calibration Dashboard', path: '/devices/:robotName/robot-settings/calibration/dashboard', }, { Component: ProtocolRunDetails, - name: t('run_details'), + name: 'Run Details', path: '/devices/:robotName/protocol-runs/:runId/:protocolRunDetailsTab?', }, { Component: AppSettings, - name: t('app_settings'), + name: 'App Settings', path: '/app-settings/:appSettingsTab?', }, ] diff --git a/app/src/App/Navbar.tsx b/app/src/App/Navbar.tsx index 90e62b608ae..ebef216e9f8 100644 --- a/app/src/App/Navbar.tsx +++ b/app/src/App/Navbar.tsx @@ -1,4 +1,5 @@ import { useCallback } from 'react' +import { useTranslation } from 'react-i18next' import { NavLink, useNavigate } from 'react-router-dom' import styled from 'styled-components' import debounce from 'lodash/debounce' @@ -111,11 +112,11 @@ const LogoImg = styled('img')` ` export function Navbar({ routes }: { routes: RouteProps[] }): JSX.Element { + const { t } = useTranslation('top_navigation') const navigate = useNavigate() const navRoutes = routes.filter( ({ navLinkTo }: RouteProps) => navLinkTo != null ) - const debouncedNavigate = useCallback( debounce((path: string) => { navigate(path) @@ -149,7 +150,7 @@ export function Navbar({ routes }: { routes: RouteProps[] }): JSX.Element { as="h3" margin={`${SPACING.spacing8} 0 ${SPACING.spacing8} ${SPACING.spacing12}`} > - {name} + {t(name)} ))} diff --git a/app/src/assets/localization/en/protocol_details.json b/app/src/assets/localization/en/protocol_details.json index e13d929b663..53531f1e00a 100644 --- a/app/src/assets/localization/en/protocol_details.json +++ b/app/src/assets/localization/en/protocol_details.json @@ -12,6 +12,7 @@ "creation_method": "creation method", "csv_file": "CSV file", "csv_file_type_required": "CSV file type required", + "deck": "deck", "deck_view": "Deck View", "default_value": "Default Value", "delete_protocol": "Delete Protocol", @@ -86,6 +87,7 @@ "start_setup": "Start setup", "start_setup_customize_values": "Start setup to customize values", "successfully_sent": "Successfully sent", + "summary": "Summary", "total_volume": "total volume", "unavailable_or_busy_robot_not_listed": "{{count}} unavailable or busy robot is not listed.", "unavailable_or_busy_robot_not_listed_plural": "{{count}} unavailable or busy robots are not listed.", diff --git a/app/src/assets/localization/zh/app_settings.json b/app/src/assets/localization/zh/app_settings.json index d174021a3cf..b84f0c5b1e8 100644 --- a/app/src/assets/localization/zh/app_settings.json +++ b/app/src/assets/localization/zh/app_settings.json @@ -55,7 +55,7 @@ "installing_update": "正在安装更新...", "ip_available": "可用", "ip_description_first": "输入IP地址或主机名以连接到工作站。", - "language": "语言", + "language": "语言 (Language)", "language_preference": "语言偏好", "manage_versions": "工作站版本和应用程序软件版本必须一致。通过工作站设置 > 高级查看工作站软件版本。", "new_features": "新功能", @@ -84,7 +84,7 @@ "restore_previous": "查看如何恢复过往软件版本", "searching": "正在搜索30秒", "select_a_language": "请选择使用语言。", - "select_language": "选择语言", + "select_language": "选择语言 (Select language)", "setup_connection": "设置连接", "share_display_usage": "分享屏幕使用情况", "share_robot_logs": "分享工作站日志", diff --git a/app/src/assets/localization/zh/protocol_command_text.json b/app/src/assets/localization/zh/protocol_command_text.json index fd5373b3183..a32a79e70b5 100644 --- a/app/src/assets/localization/zh/protocol_command_text.json +++ b/app/src/assets/localization/zh/protocol_command_text.json @@ -37,7 +37,7 @@ "in_location": "在{{location}}", "latching_hs_latch": "在热震荡模块上锁定实验耗材", "left": "左", - "load_labware_to_display_location": "在{{display_location}}加载{{labware}}", + "load_labware_to_display_location": "{{display_location}}加载{{labware}}", "load_liquids_info_protocol_setup": "将{{liquid}}加载到{{labware}}中", "load_module_protocol_setup": "在甲板槽{{slot_name}}中加载模块{{module}}", "load_pipette_protocol_setup": "在{{mount_name}}支架上加载{{pipette_name}}", diff --git a/app/src/pages/Desktop/AppSettings/GeneralSettings.tsx b/app/src/pages/Desktop/AppSettings/GeneralSettings.tsx index eed4f5be96a..2c579ace421 100644 --- a/app/src/pages/Desktop/AppSettings/GeneralSettings.tsx +++ b/app/src/pages/Desktop/AppSettings/GeneralSettings.tsx @@ -290,6 +290,7 @@ export function GeneralSettings(): JSX.Element { { + const { t, i18n } = useTranslation('protocol_details') return ( ({ - text: option, + text: i18n.format(t(option), 'capitalize'), onClick: () => { setCurrentOption(option) }, @@ -266,7 +267,7 @@ const ProtocolSectionContent = ({ let protocolSection: JSX.Element | null = null switch (currentOption) { - case 'Summary': + case 'summary': protocolSection = ( ) break - case 'Parameters': + case 'parameters': protocolSection = break - case 'Hardware': + case 'hardware': protocolSection = break - case 'Labware': + case 'labware': protocolSection = break - case 'Liquids': + case 'liquids': protocolSection = break - case 'Deck': + case 'deck': protocolSection = break } return ( {protocolSection} diff --git a/app/src/pages/ODD/QuickTransferDetails/index.tsx b/app/src/pages/ODD/QuickTransferDetails/index.tsx index 37131176b3f..64b410e084d 100644 --- a/app/src/pages/ODD/QuickTransferDetails/index.tsx +++ b/app/src/pages/ODD/QuickTransferDetails/index.tsx @@ -180,10 +180,10 @@ const QuickTransferHeader = ({ } const transferSectionTabOptions = [ - 'Summary', - 'Hardware', - 'Labware', - 'Deck', + 'summary', + 'hardware', + 'labware', + 'deck', ] as const type TabOption = typeof transferSectionTabOptions[number] @@ -197,13 +197,14 @@ const TransferSectionTabs = ({ currentOption, setCurrentOption, }: TransferSectionTabsProps): JSX.Element => { + const { t, i18n } = useTranslation('protocol_details') const options = transferSectionTabOptions return ( ({ - text: option, + text: i18n.format(t(option), 'capitalize'), onClick: () => { setCurrentOption(option) }, @@ -263,7 +264,7 @@ const TransferSectionContent = ({ let protocolSection: JSX.Element | null = null switch (currentOption) { - case 'Summary': + case 'summary': protocolSection = ( ) break - case 'Hardware': + case 'hardware': protocolSection = break - case 'Labware': + case 'labware': protocolSection = break - case 'Deck': + case 'deck': protocolSection = break } return ( {protocolSection} diff --git a/app/src/pages/ODD/RobotSettingsDashboard/RobotSettingsList.tsx b/app/src/pages/ODD/RobotSettingsDashboard/RobotSettingsList.tsx index 6dd08c20823..54e25a65c1e 100644 --- a/app/src/pages/ODD/RobotSettingsDashboard/RobotSettingsList.tsx +++ b/app/src/pages/ODD/RobotSettingsDashboard/RobotSettingsList.tsx @@ -20,7 +20,7 @@ import { TYPOGRAPHY, } from '@opentrons/components' -import { LANGUAGES } from '/app/i18n' +import { LANGUAGES, US_ENGLISH_DISPLAY_NAME } from '/app/i18n' import { getLocalRobot, getRobotApiVersion } from '/app/redux/discovery' import { getRobotUpdateAvailable } from '/app/redux/robot-update' import { useErrorRecoverySettingsToggle } from '/app/resources/errorRecovery' @@ -146,7 +146,9 @@ export function RobotSettingsList(props: RobotSettingsListProps): JSX.Element { { setCurrentOption('LanguageSetting') diff --git a/app/src/redux/config/__tests__/selectors.test.ts b/app/src/redux/config/__tests__/selectors.test.ts index 18262108c0a..00ac8f42ed3 100644 --- a/app/src/redux/config/__tests__/selectors.test.ts +++ b/app/src/redux/config/__tests__/selectors.test.ts @@ -246,7 +246,7 @@ describe('shell selectors', () => { sleepMs: 25200000, brightness: 4, textSize: 1, - unfinishedUnboxingFlowRoute: '/welcome', + unfinishedUnboxingFlowRoute: '/choose-language', }, }, } as any @@ -254,7 +254,7 @@ describe('shell selectors', () => { sleepMs: 25200000, brightness: 4, textSize: 1, - unfinishedUnboxingFlowRoute: '/welcome', + unfinishedUnboxingFlowRoute: '/choose-language', }) }) }) diff --git a/app/src/redux/config/schema-types.ts b/app/src/redux/config/schema-types.ts index e50a01d78ef..a917bdbb3dd 100644 --- a/app/src/redux/config/schema-types.ts +++ b/app/src/redux/config/schema-types.ts @@ -285,4 +285,8 @@ export type ConfigV25 = Omit & { } } -export type Config = ConfigV25 +export type ConfigV26 = Omit & { + version: 26 +} + +export type Config = ConfigV26 From a2b35d5000b11beabdc7568b49b9be147ce1ea0d Mon Sep 17 00:00:00 2001 From: Ryan Howard Date: Mon, 27 Jan 2025 13:27:30 -0500 Subject: [PATCH 032/150] feat(api): inner well geometry unit tests (#17082) (#17311) # Overview This just copies the updated well geometry definitions from edge over to chore_release. ## Test Plan and Hands on Testing ## Changelog ## Review requests ## Risk assessment Co-authored-by: Caila Marashaj <98041399+caila-marashaj@users.noreply.github.com> --- .../protocol_engine/state/frustum_helpers.py | 57 +- .../protocol_engine/state/labware.py | 1 - .../state/inner_geometry_test_params.py | 150 ++ .../state/test_geometry_view.py | 155 +- .../geometry/test_frustum_helpers.py | 35 +- .../3/agilent_1_reservoir_290ml/2.json | 10 +- .../2.json | 2 +- .../3/biorad_96_wellplate_200ul_pcr/3.json | 390 ++--- .../3/corning_12_wellplate_6.9ml_flat/3.json | 24 +- .../3/corning_384_wellplate_112ul_flat/3.json | 1548 +++++++++-------- .../3/corning_48_wellplate_1.6ml_flat/3.json | 102 +- .../3/nest_1_reservoir_195ml/3.json | 8 +- .../3/nest_1_reservoir_290ml/2.json | 22 +- .../3.json | 192 +- .../2.json | 8 +- .../2.json | 83 +- .../2.json | 135 +- .../2.json | 24 +- .../2.json | 96 +- .../2.json | 69 +- .../2.json | 96 +- .../2.json | 59 +- .../3/usascientific_12_reservoir_22ml/2.json | 48 +- .../2.json | 21 +- .../labware/labware_definition.py | 24 + 25 files changed, 1922 insertions(+), 1437 deletions(-) create mode 100644 api/tests/opentrons/protocol_engine/state/inner_geometry_test_params.py diff --git a/api/src/opentrons/protocol_engine/state/frustum_helpers.py b/api/src/opentrons/protocol_engine/state/frustum_helpers.py index 83499fb2510..b28fb936be7 100644 --- a/api/src/opentrons/protocol_engine/state/frustum_helpers.py +++ b/api/src/opentrons/protocol_engine/state/frustum_helpers.py @@ -82,19 +82,12 @@ def _circular_frustum_polynomial_roots( def _volume_from_height_circular( - target_height: float, - total_frustum_height: float, - bottom_radius: float, - top_radius: float, + target_height: float, segment: ConicalFrustum ) -> float: """Find the volume given a height within a circular frustum.""" - a, b, c = _circular_frustum_polynomial_roots( - bottom_radius=bottom_radius, - top_radius=top_radius, - total_frustum_height=total_frustum_height, - ) - volume = a * (target_height**3) + b * (target_height**2) + c * target_height - return volume + heights = segment.height_to_volume_table.keys() + best_fit_height = min(heights, key=lambda x: abs(x - target_height)) + return segment.height_to_volume_table[best_fit_height] def _volume_from_height_rectangular( @@ -138,26 +131,12 @@ def _volume_from_height_squared_cone( def _height_from_volume_circular( - volume: float, - total_frustum_height: float, - bottom_radius: float, - top_radius: float, + target_volume: float, segment: ConicalFrustum ) -> float: - """Find the height given a volume within a circular frustum.""" - a, b, c = _circular_frustum_polynomial_roots( - bottom_radius=bottom_radius, - top_radius=top_radius, - total_frustum_height=total_frustum_height, - ) - d = volume * -1 - x_intercept_roots = (a, b, c, d) - - height_from_volume_roots = roots(x_intercept_roots) - height = _reject_unacceptable_heights( - potential_heights=list(height_from_volume_roots), - max_height=total_frustum_height, - ) - return height + """Find the height given a volume within a squared cone segment.""" + volumes = segment.volume_to_height_table.keys() + best_fit_volume = min(volumes, key=lambda x: abs(x - target_volume)) + return segment.volume_to_height_table[best_fit_volume] def _height_from_volume_rectangular( @@ -243,9 +222,7 @@ def _get_segment_capacity(segment: WellSegment) -> float: return ( _volume_from_height_circular( target_height=section_height, - total_frustum_height=section_height, - bottom_radius=(segment.bottomDiameter / 2), - top_radius=(segment.topDiameter / 2), + segment=segment, ) * segment.count ) @@ -293,12 +270,7 @@ def height_at_volume_within_section( radius_of_curvature=section.radiusOfCurvature, ) case ConicalFrustum(): - return _height_from_volume_circular( - volume=target_volume_relative, - top_radius=(section.bottomDiameter / 2), - bottom_radius=(section.topDiameter / 2), - total_frustum_height=section_height, - ) + return _height_from_volume_circular(target_volume_relative, section) case CuboidalFrustum(): return _height_from_volume_rectangular( volume=target_volume_relative, @@ -334,10 +306,7 @@ def volume_at_height_within_section( case ConicalFrustum(): return ( _volume_from_height_circular( - target_height=target_height_relative, - total_frustum_height=section_height, - bottom_radius=(section.bottomDiameter / 2), - top_radius=(section.topDiameter / 2), + target_height=target_height_relative, segment=section ) * section.count ) @@ -427,7 +396,7 @@ def _find_height_in_partial_frustum( if ( bottom_section_volume < target_volume - < (bottom_section_volume + section_volume) + <= (bottom_section_volume + section_volume) ): relative_target_volume = target_volume - bottom_section_volume section_height = section.topHeight - section.bottomHeight diff --git a/api/src/opentrons/protocol_engine/state/labware.py b/api/src/opentrons/protocol_engine/state/labware.py index 70cb43c8403..58909f5be9f 100644 --- a/api/src/opentrons/protocol_engine/state/labware.py +++ b/api/src/opentrons/protocol_engine/state/labware.py @@ -524,7 +524,6 @@ def get_well_definition( will be used. """ definition = self.get_definition(labware_id) - if well_name is None: well_name = definition.ordering[0][0] diff --git a/api/tests/opentrons/protocol_engine/state/inner_geometry_test_params.py b/api/tests/opentrons/protocol_engine/state/inner_geometry_test_params.py new file mode 100644 index 00000000000..0a60bf4206c --- /dev/null +++ b/api/tests/opentrons/protocol_engine/state/inner_geometry_test_params.py @@ -0,0 +1,150 @@ +"""Arguments needed to test inner geometry. + +Each labware has 2 nominal volumes calculated in solidworks. +- One is a nominal bottom volume, calculated some set distance from the bottom of the inside of the well. +- The other is a nominal top volume, calculated some set distance from the top of the inside of the well. +""" +INNER_WELL_GEOMETRY_TEST_PARAMS = [ + [ + "opentrons_10_tuberack_nest_4x50ml_6x15ml_conical", + "conicalWell15mL", + 16.7, + 15546.9, + 3.0, + 5.0, + ], + [ + "opentrons_10_tuberack_nest_4x50ml_6x15ml_conical", + "conicalWell50mL", + 111.2, + 56110.3, + 3.0, + 5.0, + ], + ["opentrons_24_tuberack_nest_2ml_screwcap", "conicalWell", 66.6, 2104.9, 3.0, 3.0], + [ + "opentrons_24_tuberack_nest_1.5ml_screwcap", + "conicalWell", + 19.5, + 1750.8, + 3.0, + 3.0, + ], + ["nest_1_reservoir_290ml", "cuboidalWell", 16570.380, 271690.520, 3.0, 3.0], + ["opentrons_24_tuberack_nest_2ml_snapcap", "conicalWell", 69.62, 2148.5, 3.0, 3.0], + ["nest_96_wellplate_2ml_deep", "cuboidalWell", 118.3, 2060.4, 3.0, 3.0], + ["opentrons_24_tuberack_nest_1.5ml_snapcap", "conicalWell", 27.8, 1682.3, 3.0, 3.0], + ["nest_12_reservoir_15ml", "cuboidalWell", 1219.0, 13236.1, 3.0, 3.0], + ["nest_1_reservoir_195ml", "cuboidalWell", 14034.2, 172301.9, 3.0, 3.0], + [ + "opentrons_24_tuberack_nest_0.5ml_screwcap", + "conicalWell", + 21.95, + 795.4, + 3.0, + 3.0, + ], + [ + "opentrons_96_wellplate_200ul_pcr_full_skirt", + "conicalWell", + 14.3, + 150.2, + 3.0, + 3.0, + ], + ["nest_96_wellplate_100ul_pcr_full_skirt", "conicalWell", 15.5, 150.8, 3.0, 3.0], + ["nest_96_wellplate_200ul_flat", "conicalWell", 96.3, 259.8, 3.0, 3.0], + [ + "opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical", + "50mlconicalWell", + 163.9, + 57720.5, + 3.0, + 3.0, + ], + [ + "opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical", + "15mlconicalWell", + 40.8, + 15956.6, + 3.0, + 3.0, + ], + ["usascientific_12_reservoir_22ml", "cuboidalWell", 529.36, 21111.5, 3.0, 3.0], + ["thermoscientificnunc_96_wellplate_2000ul", "conicalWell", 73.5, 1768.0, 3.0, 3.0], + [ + "usascientific_96_wellplate_2.4ml_deep", + "cuboidalWell", + 72.220, + 2241.360, + 3.0, + 3.0, + ], + ["agilent_1_reservoir_290ml", "cuboidalWell", 15652.9, 268813.8, 3.0, 3.0], + [ + "opentrons_24_tuberack_eppendorf_1.5ml_safelock_snapcap", + "conicalWell", + 25.8, + 1576.1, + 3.0, + 3.0, + ], + ["thermoscientificnunc_96_wellplate_1300ul", "conicalWell", 73.5, 1155.1, 3.0, 3.0], + ["corning_12_wellplate_6.9ml_flat", "conicalWell", 1156.3, 5654.8, 3.0, 3.0], + ["corning_24_wellplate_3.4ml_flat", "conicalWell", 579.0, 2853.4, 3.0, 3.0], + ["corning_6_wellplate_16.8ml_flat", "conicalWell", 2862.1, 13901.9, 3.0, 3.0], + ["corning_48_wellplate_1.6ml_flat", "conicalWell", 268.9, 1327.0, 3.0, 3.0], + ["biorad_96_wellplate_200ul_pcr", "conicalWell", 17.9, 161.2, 3.0, 3.0], + ["axygen_1_reservoir_90ml", "cuboidalWell", 22373.4, 70450.6, 3.0, 3.0], + ["corning_384_wellplate_112ul_flat", "flatWell", 22.4, 77.4, 2.88, 3.0], + ["corning_96_wellplate_360ul_flat", "conicalWell", 97.2, 257.1, 3.0, 3.0], + ["biorad_384_wellplate_50ul", "conicalWell", 7.7, 27.8, 3.0, 3.0], + [ + "appliedbiosystemsmicroamp_384_wellplate_40ul", + "conicalWell", + 7.44, + 26.19, + 3.0, + 3.0, + ], + [ + "opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap", + "conicalWell", + 60.940, + 2163.980, + 3.0, + 3.0, + ], + [ + "opentrons_10_tuberack_nest_4x50ml_6x15ml_conical", + "conicalWell15mL", + 16.690, + 15546.930, + 3.0, + 5.0, + ], + [ + "opentrons_10_tuberack_nest_4x50ml_6x15ml_conical", + "conicalWell50mL", + 111.200, + 56110.279, + 3.0, + 5.0, + ], + [ + "opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical", + "15mlconicalWell", + 40.830, + 15956.600, + 3.0, + 3.0, + ], + [ + "opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical", + "50mlconicalWell", + 163.860, + 57720.510, + 3.0, + 3.0, + ], +] diff --git a/api/tests/opentrons/protocol_engine/state/test_geometry_view.py b/api/tests/opentrons/protocol_engine/state/test_geometry_view.py index fda32a56ce0..8f28c6de88e 100644 --- a/api/tests/opentrons/protocol_engine/state/test_geometry_view.py +++ b/api/tests/opentrons/protocol_engine/state/test_geometry_view.py @@ -6,6 +6,7 @@ from math import isclose from typing import cast, List, Tuple, Optional, NamedTuple, Dict from unittest.mock import sentinel +from os import listdir, path import pytest from decoy import Decoy @@ -15,6 +16,7 @@ StateUpdate, ) +from opentrons_shared_data import get_shared_data_root, load_shared_data from opentrons_shared_data.deck.types import DeckDefinitionV5 from opentrons_shared_data.deck import load as load_deck from opentrons_shared_data.labware.types import LabwareUri @@ -27,8 +29,8 @@ Dimensions as LabwareDimensions, Parameters as LabwareDefinitionParameters, CornerOffsetFromSlot, + ConicalFrustum, ) -from opentrons_shared_data import load_shared_data from opentrons.protocol_engine import errors from opentrons.protocol_engine.types import ( @@ -96,6 +98,7 @@ _volume_from_height_circular, _volume_from_height_rectangular, ) +from .inner_geometry_test_params import INNER_WELL_GEOMETRY_TEST_PARAMS from ..pipette_fixtures import get_default_nozzle_map from ..mock_circular_frusta import TEST_EXAMPLES as CIRCULAR_TEST_EXAMPLES from ..mock_rectangular_frusta import TEST_EXAMPLES as RECTANGULAR_TEST_EXAMPLES @@ -3278,19 +3281,23 @@ def _find_volume_from_height_(index: int) -> None: nonlocal total_frustum_height, bottom_radius top_radius = frustum["radius"][index] target_height = frustum["height"][index] - + segment = ConicalFrustum( + shape="conical", + bottomDiameter=bottom_radius * 2, + topDiameter=top_radius * 2, + topHeight=total_frustum_height, + bottomHeight=0.0, + xCount=1, + yCount=1, + ) found_volume = _volume_from_height_circular( target_height=target_height, - total_frustum_height=total_frustum_height, - top_radius=top_radius, - bottom_radius=bottom_radius, + segment=segment, ) found_height = _height_from_volume_circular( - volume=found_volume, - total_frustum_height=total_frustum_height, - top_radius=top_radius, - bottom_radius=bottom_radius, + target_volume=found_volume, + segment=segment, ) assert isclose(found_height, frustum["height"][index]) @@ -3360,3 +3367,133 @@ def test_validate_dispense_volume_into_well_meniscus( ), volume=1100000.0, ) + + +@pytest.mark.parametrize( + [ + "labware_id", + "well_name", + "input_volume_bottom", + "input_volume_top", + "expected_height_from_bottom_mm", + "expected_height_from_top_mm", + ], + INNER_WELL_GEOMETRY_TEST_PARAMS, +) +def test_get_well_height_at_volume( + decoy: Decoy, + subject: GeometryView, + labware_id: str, + well_name: str, + input_volume_bottom: float, + input_volume_top: float, + expected_height_from_bottom_mm: float, + expected_height_from_top_mm: float, + mock_labware_view: LabwareView, +) -> None: + """Test getting the well height at a given volume.""" + + def _get_labware_def() -> LabwareDefinition: + def_dir = str(get_shared_data_root()) + f"/labware/definitions/3/{labware_id}" + version_str = max([str(version) for version in listdir(def_dir)]) + def_path = path.join(def_dir, version_str) + _labware_def = LabwareDefinition.model_validate( + json.loads(load_shared_data(def_path).decode("utf-8")) + ) + return _labware_def + + labware_def = _get_labware_def() + assert labware_def.innerLabwareGeometry is not None + well_geometry = labware_def.innerLabwareGeometry.get(well_name) + assert well_geometry is not None + well_definition = [ + well + for well in labware_def.wells.values() + if well.geometryDefinitionId == well_name + ][0] + + decoy.when(mock_labware_view.get_well_geometry(labware_id, well_name)).then_return( + well_geometry + ) + decoy.when( + mock_labware_view.get_well_definition(labware_id, well_name) + ).then_return(well_definition) + + found_height_bottom = subject.get_well_height_at_volume( + labware_id=labware_id, well_name=well_name, volume=input_volume_bottom + ) + found_height_top = subject.get_well_height_at_volume( + labware_id=labware_id, well_name=well_name, volume=input_volume_top + ) + assert isclose(found_height_bottom, expected_height_from_bottom_mm, rel_tol=0.01) + vol_2_expected_height_from_bottom = ( + subject.get_well_height(labware_id=labware_id, well_name=well_name) + - expected_height_from_top_mm + ) + assert isclose(found_height_top, vol_2_expected_height_from_bottom, rel_tol=0.01) + + +@pytest.mark.parametrize( + [ + "labware_id", + "well_name", + "expected_volume_bottom", + "expected_volume_top", + "input_height_from_bottom_mm", + "input_height_from_top_mm", + ], + INNER_WELL_GEOMETRY_TEST_PARAMS, +) +def test_get_well_volume_at_height( + decoy: Decoy, + subject: GeometryView, + labware_id: str, + well_name: str, + expected_volume_bottom: float, + expected_volume_top: float, + input_height_from_bottom_mm: float, + input_height_from_top_mm: float, + mock_labware_view: LabwareView, +) -> None: + """Test getting the volume at a given height.""" + + def _get_labware_def() -> LabwareDefinition: + def_dir = str(get_shared_data_root()) + f"/labware/definitions/3/{labware_id}" + version_str = max([str(version) for version in listdir(def_dir)]) + def_path = path.join(def_dir, version_str) + _labware_def = LabwareDefinition.model_validate( + json.loads(load_shared_data(def_path).decode("utf-8")) + ) + return _labware_def + + labware_def = _get_labware_def() + assert labware_def.innerLabwareGeometry is not None + well_geometry = labware_def.innerLabwareGeometry.get(well_name) + assert well_geometry is not None + well_definition = [ + well + for well in labware_def.wells.values() + if well.geometryDefinitionId == well_name + ][0] + + decoy.when(mock_labware_view.get_well_geometry(labware_id, well_name)).then_return( + well_geometry + ) + decoy.when( + mock_labware_view.get_well_definition(labware_id, well_name) + ).then_return(well_definition) + + found_volume_bottom = subject.get_well_volume_at_height( + labware_id=labware_id, well_name=well_name, height=input_height_from_bottom_mm + ) + vol_2_input_height_from_bottom = ( + subject.get_well_height(labware_id=labware_id, well_name=well_name) + - input_height_from_top_mm + ) + found_volume_top = subject.get_well_volume_at_height( + labware_id=labware_id, + well_name=well_name, + height=vol_2_input_height_from_bottom, + ) + assert isclose(found_volume_bottom, expected_volume_bottom, rel_tol=0.01) + assert isclose(found_volume_top, expected_volume_top, rel_tol=0.01) diff --git a/api/tests/opentrons/protocols/geometry/test_frustum_helpers.py b/api/tests/opentrons/protocols/geometry/test_frustum_helpers.py index 0b8d3429527..d9bd8173834 100644 --- a/api/tests/opentrons/protocols/geometry/test_frustum_helpers.py +++ b/api/tests/opentrons/protocols/geometry/test_frustum_helpers.py @@ -11,7 +11,6 @@ _cross_section_area_rectangular, _cross_section_area_circular, _reject_unacceptable_heights, - _circular_frustum_polynomial_roots, _rectangular_frustum_polynomial_roots, _volume_from_height_rectangular, _volume_from_height_circular, @@ -211,39 +210,25 @@ def test_volume_and_height_circular(well: List[Any]) -> None: """Test both volume and height calculations for circular frusta.""" if well[-1].shape == "spherical": return - total_height = well[0].topHeight for segment in well: if segment.shape == "conical": - top_radius = segment.topDiameter / 2 - bottom_radius = segment.bottomDiameter / 2 - a = pi * ((top_radius - bottom_radius) ** 2) / (3 * total_height**2) - b = pi * bottom_radius * (top_radius - bottom_radius) / total_height - c = pi * bottom_radius**2 - assert _circular_frustum_polynomial_roots( - top_radius=top_radius, - bottom_radius=bottom_radius, - total_frustum_height=total_height, - ) == (a, b, c) + a = segment.topDiameter / 2 + b = segment.bottomDiameter / 2 # test volume within a bunch of arbitrary heights - for target_height in range(round(total_height)): - expected_volume = ( - a * (target_height**3) - + b * (target_height**2) - + c * target_height + segment_height = segment.topHeight - segment.bottomHeight + for target_height in range(round(segment_height)): + r_y = (target_height / segment_height) * (a - b) + b + expected_volume = (pi * target_height / 3) * ( + b**2 + b * r_y + r_y**2 ) found_volume = _volume_from_height_circular( target_height=target_height, - total_frustum_height=total_height, - bottom_radius=bottom_radius, - top_radius=top_radius, + segment=segment, ) - assert found_volume == expected_volume + assert isclose(found_volume, expected_volume) # test going backwards to get height back found_height = _height_from_volume_circular( - volume=found_volume, - total_frustum_height=total_height, - bottom_radius=bottom_radius, - top_radius=top_radius, + target_volume=found_volume, segment=segment ) assert isclose(found_height, target_height) diff --git a/shared-data/labware/definitions/3/agilent_1_reservoir_290ml/2.json b/shared-data/labware/definitions/3/agilent_1_reservoir_290ml/2.json index 4a06fc94f97..f9bf94127ab 100644 --- a/shared-data/labware/definitions/3/agilent_1_reservoir_290ml/2.json +++ b/shared-data/labware/definitions/3/agilent_1_reservoir_290ml/2.json @@ -57,22 +57,22 @@ "sections": [ { "shape": "cuboidal", - "topXDimension": 107.25, + "topXDimension": 106.79, "topYDimension": 8, "bottomXDimension": 101.25, "bottomYDimension": 1.66, "topHeight": 2, - "bottomHeight": 8, + "bottomHeight": 0, "yCount": 8 }, { "shape": "cuboidal", "topXDimension": 107.5, "topYDimension": 71.25, - "bottomXDimension": 107.25, + "bottomXDimension": 106.79, "bottomYDimension": 71.0, - "topHeight": 39.22, - "bottomHeight": 2 + "topHeight": 39.23, + "bottomHeight": 2.0 } ] } diff --git a/shared-data/labware/definitions/3/appliedbiosystemsmicroamp_384_wellplate_40ul/2.json b/shared-data/labware/definitions/3/appliedbiosystemsmicroamp_384_wellplate_40ul/2.json index a6954ac9d06..d47afca68c4 100644 --- a/shared-data/labware/definitions/3/appliedbiosystemsmicroamp_384_wellplate_40ul/2.json +++ b/shared-data/labware/definitions/3/appliedbiosystemsmicroamp_384_wellplate_40ul/2.json @@ -4712,8 +4712,8 @@ }, { "shape": "conical", - "bottomDiameter": 1.4, "topDiameter": 3.17, + "bottomDiameter": 1.4, "topHeight": 5.77, "bottomHeight": 0.34 }, diff --git a/shared-data/labware/definitions/3/biorad_96_wellplate_200ul_pcr/3.json b/shared-data/labware/definitions/3/biorad_96_wellplate_200ul_pcr/3.json index 61f780b9bfd..24f0656db6b 100644 --- a/shared-data/labware/definitions/3/biorad_96_wellplate_200ul_pcr/3.json +++ b/shared-data/labware/definitions/3/biorad_96_wellplate_200ul_pcr/3.json @@ -38,9 +38,9 @@ "gripHeightFromLabwareBottom": 10.14, "wells": { "H1": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 14.38, "y": 11.24, @@ -48,9 +48,9 @@ "geometryDefinitionId": "conicalWell" }, "G1": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 14.38, "y": 20.24, @@ -58,9 +58,9 @@ "geometryDefinitionId": "conicalWell" }, "F1": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 14.38, "y": 29.24, @@ -68,9 +68,9 @@ "geometryDefinitionId": "conicalWell" }, "E1": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 14.38, "y": 38.24, @@ -78,9 +78,9 @@ "geometryDefinitionId": "conicalWell" }, "D1": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 14.38, "y": 47.24, @@ -88,9 +88,9 @@ "geometryDefinitionId": "conicalWell" }, "C1": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 14.38, "y": 56.24, @@ -98,9 +98,9 @@ "geometryDefinitionId": "conicalWell" }, "B1": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 14.38, "y": 65.24, @@ -108,9 +108,9 @@ "geometryDefinitionId": "conicalWell" }, "A1": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 14.38, "y": 74.24, @@ -118,9 +118,9 @@ "geometryDefinitionId": "conicalWell" }, "H2": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 23.38, "y": 11.24, @@ -128,9 +128,9 @@ "geometryDefinitionId": "conicalWell" }, "G2": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 23.38, "y": 20.24, @@ -138,9 +138,9 @@ "geometryDefinitionId": "conicalWell" }, "F2": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 23.38, "y": 29.24, @@ -148,9 +148,9 @@ "geometryDefinitionId": "conicalWell" }, "E2": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 23.38, "y": 38.24, @@ -158,9 +158,9 @@ "geometryDefinitionId": "conicalWell" }, "D2": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 23.38, "y": 47.24, @@ -168,9 +168,9 @@ "geometryDefinitionId": "conicalWell" }, "C2": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 23.38, "y": 56.24, @@ -178,9 +178,9 @@ "geometryDefinitionId": "conicalWell" }, "B2": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 23.38, "y": 65.24, @@ -188,9 +188,9 @@ "geometryDefinitionId": "conicalWell" }, "A2": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 23.38, "y": 74.24, @@ -198,9 +198,9 @@ "geometryDefinitionId": "conicalWell" }, "H3": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 32.38, "y": 11.24, @@ -208,9 +208,9 @@ "geometryDefinitionId": "conicalWell" }, "G3": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 32.38, "y": 20.24, @@ -218,9 +218,9 @@ "geometryDefinitionId": "conicalWell" }, "F3": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 32.38, "y": 29.24, @@ -228,9 +228,9 @@ "geometryDefinitionId": "conicalWell" }, "E3": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 32.38, "y": 38.24, @@ -238,9 +238,9 @@ "geometryDefinitionId": "conicalWell" }, "D3": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 32.38, "y": 47.24, @@ -248,9 +248,9 @@ "geometryDefinitionId": "conicalWell" }, "C3": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 32.38, "y": 56.24, @@ -258,9 +258,9 @@ "geometryDefinitionId": "conicalWell" }, "B3": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 32.38, "y": 65.24, @@ -268,9 +268,9 @@ "geometryDefinitionId": "conicalWell" }, "A3": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 32.38, "y": 74.24, @@ -278,9 +278,9 @@ "geometryDefinitionId": "conicalWell" }, "H4": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 41.38, "y": 11.24, @@ -288,9 +288,9 @@ "geometryDefinitionId": "conicalWell" }, "G4": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 41.38, "y": 20.24, @@ -298,9 +298,9 @@ "geometryDefinitionId": "conicalWell" }, "F4": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 41.38, "y": 29.24, @@ -308,9 +308,9 @@ "geometryDefinitionId": "conicalWell" }, "E4": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 41.38, "y": 38.24, @@ -318,9 +318,9 @@ "geometryDefinitionId": "conicalWell" }, "D4": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 41.38, "y": 47.24, @@ -328,9 +328,9 @@ "geometryDefinitionId": "conicalWell" }, "C4": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 41.38, "y": 56.24, @@ -338,9 +338,9 @@ "geometryDefinitionId": "conicalWell" }, "B4": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 41.38, "y": 65.24, @@ -348,9 +348,9 @@ "geometryDefinitionId": "conicalWell" }, "A4": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 41.38, "y": 74.24, @@ -358,9 +358,9 @@ "geometryDefinitionId": "conicalWell" }, "H5": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 50.38, "y": 11.24, @@ -368,9 +368,9 @@ "geometryDefinitionId": "conicalWell" }, "G5": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 50.38, "y": 20.24, @@ -378,9 +378,9 @@ "geometryDefinitionId": "conicalWell" }, "F5": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 50.38, "y": 29.24, @@ -388,9 +388,9 @@ "geometryDefinitionId": "conicalWell" }, "E5": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 50.38, "y": 38.24, @@ -398,9 +398,9 @@ "geometryDefinitionId": "conicalWell" }, "D5": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 50.38, "y": 47.24, @@ -408,9 +408,9 @@ "geometryDefinitionId": "conicalWell" }, "C5": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 50.38, "y": 56.24, @@ -418,9 +418,9 @@ "geometryDefinitionId": "conicalWell" }, "B5": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 50.38, "y": 65.24, @@ -428,9 +428,9 @@ "geometryDefinitionId": "conicalWell" }, "A5": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 50.38, "y": 74.24, @@ -438,9 +438,9 @@ "geometryDefinitionId": "conicalWell" }, "H6": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 59.38, "y": 11.24, @@ -448,9 +448,9 @@ "geometryDefinitionId": "conicalWell" }, "G6": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 59.38, "y": 20.24, @@ -458,9 +458,9 @@ "geometryDefinitionId": "conicalWell" }, "F6": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 59.38, "y": 29.24, @@ -468,9 +468,9 @@ "geometryDefinitionId": "conicalWell" }, "E6": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 59.38, "y": 38.24, @@ -478,9 +478,9 @@ "geometryDefinitionId": "conicalWell" }, "D6": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 59.38, "y": 47.24, @@ -488,9 +488,9 @@ "geometryDefinitionId": "conicalWell" }, "C6": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 59.38, "y": 56.24, @@ -498,9 +498,9 @@ "geometryDefinitionId": "conicalWell" }, "B6": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 59.38, "y": 65.24, @@ -508,9 +508,9 @@ "geometryDefinitionId": "conicalWell" }, "A6": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 59.38, "y": 74.24, @@ -518,9 +518,9 @@ "geometryDefinitionId": "conicalWell" }, "H7": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 68.38, "y": 11.24, @@ -528,9 +528,9 @@ "geometryDefinitionId": "conicalWell" }, "G7": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 68.38, "y": 20.24, @@ -538,9 +538,9 @@ "geometryDefinitionId": "conicalWell" }, "F7": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 68.38, "y": 29.24, @@ -548,9 +548,9 @@ "geometryDefinitionId": "conicalWell" }, "E7": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 68.38, "y": 38.24, @@ -558,9 +558,9 @@ "geometryDefinitionId": "conicalWell" }, "D7": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 68.38, "y": 47.24, @@ -568,9 +568,9 @@ "geometryDefinitionId": "conicalWell" }, "C7": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 68.38, "y": 56.24, @@ -578,9 +578,9 @@ "geometryDefinitionId": "conicalWell" }, "B7": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 68.38, "y": 65.24, @@ -588,9 +588,9 @@ "geometryDefinitionId": "conicalWell" }, "A7": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 68.38, "y": 74.24, @@ -598,9 +598,9 @@ "geometryDefinitionId": "conicalWell" }, "H8": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 77.38, "y": 11.24, @@ -608,9 +608,9 @@ "geometryDefinitionId": "conicalWell" }, "G8": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 77.38, "y": 20.24, @@ -618,9 +618,9 @@ "geometryDefinitionId": "conicalWell" }, "F8": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 77.38, "y": 29.24, @@ -628,9 +628,9 @@ "geometryDefinitionId": "conicalWell" }, "E8": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 77.38, "y": 38.24, @@ -638,9 +638,9 @@ "geometryDefinitionId": "conicalWell" }, "D8": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 77.38, "y": 47.24, @@ -648,9 +648,9 @@ "geometryDefinitionId": "conicalWell" }, "C8": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 77.38, "y": 56.24, @@ -658,9 +658,9 @@ "geometryDefinitionId": "conicalWell" }, "B8": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 77.38, "y": 65.24, @@ -668,9 +668,9 @@ "geometryDefinitionId": "conicalWell" }, "A8": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 77.38, "y": 74.24, @@ -678,9 +678,9 @@ "geometryDefinitionId": "conicalWell" }, "H9": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 86.38, "y": 11.24, @@ -688,9 +688,9 @@ "geometryDefinitionId": "conicalWell" }, "G9": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 86.38, "y": 20.24, @@ -698,9 +698,9 @@ "geometryDefinitionId": "conicalWell" }, "F9": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 86.38, "y": 29.24, @@ -708,9 +708,9 @@ "geometryDefinitionId": "conicalWell" }, "E9": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 86.38, "y": 38.24, @@ -718,9 +718,9 @@ "geometryDefinitionId": "conicalWell" }, "D9": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 86.38, "y": 47.24, @@ -728,9 +728,9 @@ "geometryDefinitionId": "conicalWell" }, "C9": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 86.38, "y": 56.24, @@ -738,9 +738,9 @@ "geometryDefinitionId": "conicalWell" }, "B9": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 86.38, "y": 65.24, @@ -748,9 +748,9 @@ "geometryDefinitionId": "conicalWell" }, "A9": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 86.38, "y": 74.24, @@ -758,9 +758,9 @@ "geometryDefinitionId": "conicalWell" }, "H10": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 95.38, "y": 11.24, @@ -768,9 +768,9 @@ "geometryDefinitionId": "conicalWell" }, "G10": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 95.38, "y": 20.24, @@ -778,9 +778,9 @@ "geometryDefinitionId": "conicalWell" }, "F10": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 95.38, "y": 29.24, @@ -788,9 +788,9 @@ "geometryDefinitionId": "conicalWell" }, "E10": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 95.38, "y": 38.24, @@ -798,9 +798,9 @@ "geometryDefinitionId": "conicalWell" }, "D10": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 95.38, "y": 47.24, @@ -808,9 +808,9 @@ "geometryDefinitionId": "conicalWell" }, "C10": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 95.38, "y": 56.24, @@ -818,9 +818,9 @@ "geometryDefinitionId": "conicalWell" }, "B10": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 95.38, "y": 65.24, @@ -828,9 +828,9 @@ "geometryDefinitionId": "conicalWell" }, "A10": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 95.38, "y": 74.24, @@ -838,9 +838,9 @@ "geometryDefinitionId": "conicalWell" }, "H11": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 104.38, "y": 11.24, @@ -848,9 +848,9 @@ "geometryDefinitionId": "conicalWell" }, "G11": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 104.38, "y": 20.24, @@ -858,9 +858,9 @@ "geometryDefinitionId": "conicalWell" }, "F11": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 104.38, "y": 29.24, @@ -868,9 +868,9 @@ "geometryDefinitionId": "conicalWell" }, "E11": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 104.38, "y": 38.24, @@ -878,9 +878,9 @@ "geometryDefinitionId": "conicalWell" }, "D11": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 104.38, "y": 47.24, @@ -888,9 +888,9 @@ "geometryDefinitionId": "conicalWell" }, "C11": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 104.38, "y": 56.24, @@ -898,9 +898,9 @@ "geometryDefinitionId": "conicalWell" }, "B11": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 104.38, "y": 65.24, @@ -908,9 +908,9 @@ "geometryDefinitionId": "conicalWell" }, "A11": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 104.38, "y": 74.24, @@ -918,9 +918,9 @@ "geometryDefinitionId": "conicalWell" }, "H12": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 113.38, "y": 11.24, @@ -928,9 +928,9 @@ "geometryDefinitionId": "conicalWell" }, "G12": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 113.38, "y": 20.24, @@ -938,9 +938,9 @@ "geometryDefinitionId": "conicalWell" }, "F12": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 113.38, "y": 29.24, @@ -948,9 +948,9 @@ "geometryDefinitionId": "conicalWell" }, "E12": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 113.38, "y": 38.24, @@ -958,9 +958,9 @@ "geometryDefinitionId": "conicalWell" }, "D12": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 113.38, "y": 47.24, @@ -968,9 +968,9 @@ "geometryDefinitionId": "conicalWell" }, "C12": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 113.38, "y": 56.24, @@ -978,9 +978,9 @@ "geometryDefinitionId": "conicalWell" }, "B12": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 113.38, "y": 65.24, @@ -988,9 +988,9 @@ "geometryDefinitionId": "conicalWell" }, "A12": { - "depth": 14.81, + "depth": 14.57, "shape": "circular", - "diameter": 5.46, + "diameter": 5.44, "totalLiquidVolume": 200, "x": 113.38, "y": 74.24, @@ -1150,22 +1150,22 @@ }, { "shape": "conical", + "topDiameter": 3.0, "bottomDiameter": 2.81, - "topDiameter": 3, "topHeight": 1.87, "bottomHeight": 1.21 }, { "shape": "conical", - "bottomDiameter": 3, "topDiameter": 4.98, + "bottomDiameter": 3, "topHeight": 8.58, "bottomHeight": 1.87 }, { "shape": "conical", - "bottomDiameter": 3, "topDiameter": 5.44, + "bottomDiameter": 4.98, "topHeight": 10.14, "bottomHeight": 8.58 }, diff --git a/shared-data/labware/definitions/3/corning_12_wellplate_6.9ml_flat/3.json b/shared-data/labware/definitions/3/corning_12_wellplate_6.9ml_flat/3.json index f51bce0859c..3a0001ef016 100644 --- a/shared-data/labware/definitions/3/corning_12_wellplate_6.9ml_flat/3.json +++ b/shared-data/labware/definitions/3/corning_12_wellplate_6.9ml_flat/3.json @@ -31,7 +31,7 @@ "wells": { "C1": { "shape": "circular", - "depth": 17.53, + "depth": 17.399, "diameter": 22.73, "totalLiquidVolume": 6900, "x": 24.94, @@ -41,7 +41,7 @@ }, "B1": { "shape": "circular", - "depth": 17.53, + "depth": 17.399, "diameter": 22.73, "totalLiquidVolume": 6900, "x": 24.94, @@ -51,7 +51,7 @@ }, "A1": { "shape": "circular", - "depth": 17.53, + "depth": 17.399, "diameter": 22.73, "totalLiquidVolume": 6900, "x": 24.94, @@ -61,7 +61,7 @@ }, "C2": { "shape": "circular", - "depth": 17.53, + "depth": 17.399, "diameter": 22.73, "totalLiquidVolume": 6900, "x": 50.95, @@ -71,7 +71,7 @@ }, "B2": { "shape": "circular", - "depth": 17.53, + "depth": 17.399, "diameter": 22.73, "totalLiquidVolume": 6900, "x": 50.95, @@ -81,7 +81,7 @@ }, "A2": { "shape": "circular", - "depth": 17.53, + "depth": 17.399, "diameter": 22.73, "totalLiquidVolume": 6900, "x": 50.95, @@ -91,7 +91,7 @@ }, "C3": { "shape": "circular", - "depth": 17.53, + "depth": 17.399, "diameter": 22.73, "totalLiquidVolume": 6900, "x": 76.96, @@ -101,7 +101,7 @@ }, "B3": { "shape": "circular", - "depth": 17.53, + "depth": 17.399, "diameter": 22.73, "totalLiquidVolume": 6900, "x": 76.96, @@ -111,7 +111,7 @@ }, "A3": { "shape": "circular", - "depth": 17.53, + "depth": 17.399, "diameter": 22.73, "totalLiquidVolume": 6900, "x": 76.96, @@ -121,7 +121,7 @@ }, "C4": { "shape": "circular", - "depth": 17.53, + "depth": 17.399, "diameter": 22.73, "totalLiquidVolume": 6900, "x": 102.97, @@ -131,7 +131,7 @@ }, "B4": { "shape": "circular", - "depth": 17.53, + "depth": 17.399, "diameter": 22.73, "totalLiquidVolume": 6900, "x": 102.97, @@ -141,7 +141,7 @@ }, "A4": { "shape": "circular", - "depth": 17.53, + "depth": 17.399, "diameter": 22.73, "totalLiquidVolume": 6900, "x": 102.97, diff --git a/shared-data/labware/definitions/3/corning_384_wellplate_112ul_flat/3.json b/shared-data/labware/definitions/3/corning_384_wellplate_112ul_flat/3.json index ca3758f2339..69a3b324063 100644 --- a/shared-data/labware/definitions/3/corning_384_wellplate_112ul_flat/3.json +++ b/shared-data/labware/definitions/3/corning_384_wellplate_112ul_flat/3.json @@ -457,7 +457,7 @@ "gripHeightFromLabwareBottom": 12.4, "wells": { "P1": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -465,10 +465,10 @@ "x": 12.12, "y": 8.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "O1": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -476,10 +476,10 @@ "x": 12.12, "y": 13.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "N1": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -487,10 +487,10 @@ "x": 12.12, "y": 17.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "M1": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -498,10 +498,10 @@ "x": 12.12, "y": 22.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "L1": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -509,10 +509,10 @@ "x": 12.12, "y": 26.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "K1": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -520,10 +520,10 @@ "x": 12.12, "y": 31.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "J1": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -531,10 +531,10 @@ "x": 12.12, "y": 35.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "I1": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -542,10 +542,10 @@ "x": 12.12, "y": 40.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "H1": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -553,10 +553,10 @@ "x": 12.12, "y": 44.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "G1": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -564,10 +564,10 @@ "x": 12.12, "y": 49.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "F1": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -575,10 +575,10 @@ "x": 12.12, "y": 53.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "E1": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -586,10 +586,10 @@ "x": 12.12, "y": 58.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "D1": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -597,10 +597,10 @@ "x": 12.12, "y": 62.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "C1": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -608,10 +608,10 @@ "x": 12.12, "y": 67.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "B1": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -619,10 +619,10 @@ "x": 12.12, "y": 71.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "A1": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -630,10 +630,10 @@ "x": 12.12, "y": 76.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "P2": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -641,10 +641,10 @@ "x": 16.62, "y": 8.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "O2": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -652,10 +652,10 @@ "x": 16.62, "y": 13.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "N2": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -663,10 +663,10 @@ "x": 16.62, "y": 17.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "M2": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -674,10 +674,10 @@ "x": 16.62, "y": 22.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "L2": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -685,10 +685,10 @@ "x": 16.62, "y": 26.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "K2": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -696,10 +696,10 @@ "x": 16.62, "y": 31.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "J2": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -707,10 +707,10 @@ "x": 16.62, "y": 35.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "I2": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -718,10 +718,10 @@ "x": 16.62, "y": 40.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "H2": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -729,10 +729,10 @@ "x": 16.62, "y": 44.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "G2": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -740,10 +740,10 @@ "x": 16.62, "y": 49.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "F2": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -751,10 +751,10 @@ "x": 16.62, "y": 53.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "E2": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -762,10 +762,10 @@ "x": 16.62, "y": 58.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "D2": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -773,10 +773,10 @@ "x": 16.62, "y": 62.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "C2": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -784,10 +784,10 @@ "x": 16.62, "y": 67.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "B2": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -795,10 +795,10 @@ "x": 16.62, "y": 71.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "A2": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -806,10 +806,10 @@ "x": 16.62, "y": 76.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "P3": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -817,10 +817,10 @@ "x": 21.12, "y": 8.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "O3": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -828,10 +828,10 @@ "x": 21.12, "y": 13.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "N3": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -839,10 +839,10 @@ "x": 21.12, "y": 17.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "M3": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -850,10 +850,10 @@ "x": 21.12, "y": 22.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "L3": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -861,10 +861,10 @@ "x": 21.12, "y": 26.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "K3": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -872,10 +872,10 @@ "x": 21.12, "y": 31.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "J3": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -883,10 +883,10 @@ "x": 21.12, "y": 35.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "I3": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -894,10 +894,10 @@ "x": 21.12, "y": 40.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "H3": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -905,10 +905,10 @@ "x": 21.12, "y": 44.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "G3": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -916,10 +916,10 @@ "x": 21.12, "y": 49.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "F3": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -927,10 +927,10 @@ "x": 21.12, "y": 53.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "E3": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -938,10 +938,10 @@ "x": 21.12, "y": 58.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "D3": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -949,10 +949,10 @@ "x": 21.12, "y": 62.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "C3": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -960,10 +960,10 @@ "x": 21.12, "y": 67.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "B3": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -971,10 +971,10 @@ "x": 21.12, "y": 71.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "A3": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -982,10 +982,10 @@ "x": 21.12, "y": 76.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "P4": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -993,10 +993,10 @@ "x": 25.62, "y": 8.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "O4": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1004,10 +1004,10 @@ "x": 25.62, "y": 13.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "N4": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1015,10 +1015,10 @@ "x": 25.62, "y": 17.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "M4": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1026,10 +1026,10 @@ "x": 25.62, "y": 22.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "L4": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1037,10 +1037,10 @@ "x": 25.62, "y": 26.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "K4": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1048,10 +1048,10 @@ "x": 25.62, "y": 31.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "J4": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1059,10 +1059,10 @@ "x": 25.62, "y": 35.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "I4": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1070,10 +1070,10 @@ "x": 25.62, "y": 40.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "H4": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1081,10 +1081,10 @@ "x": 25.62, "y": 44.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "G4": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1092,10 +1092,10 @@ "x": 25.62, "y": 49.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "F4": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1103,10 +1103,10 @@ "x": 25.62, "y": 53.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "E4": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1114,10 +1114,10 @@ "x": 25.62, "y": 58.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "D4": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1125,10 +1125,10 @@ "x": 25.62, "y": 62.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "C4": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1136,10 +1136,10 @@ "x": 25.62, "y": 67.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "B4": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1147,10 +1147,10 @@ "x": 25.62, "y": 71.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "A4": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1158,10 +1158,10 @@ "x": 25.62, "y": 76.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "P5": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1169,10 +1169,10 @@ "x": 30.12, "y": 8.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "O5": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1180,10 +1180,10 @@ "x": 30.12, "y": 13.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "N5": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1191,10 +1191,10 @@ "x": 30.12, "y": 17.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "M5": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1202,10 +1202,10 @@ "x": 30.12, "y": 22.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "L5": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1213,10 +1213,10 @@ "x": 30.12, "y": 26.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "K5": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1224,10 +1224,10 @@ "x": 30.12, "y": 31.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "J5": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1235,10 +1235,10 @@ "x": 30.12, "y": 35.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "I5": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1246,10 +1246,10 @@ "x": 30.12, "y": 40.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "H5": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1257,10 +1257,10 @@ "x": 30.12, "y": 44.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "G5": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1268,10 +1268,10 @@ "x": 30.12, "y": 49.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "F5": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1279,10 +1279,10 @@ "x": 30.12, "y": 53.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "E5": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1290,10 +1290,10 @@ "x": 30.12, "y": 58.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "D5": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1301,10 +1301,10 @@ "x": 30.12, "y": 62.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "C5": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1312,10 +1312,10 @@ "x": 30.12, "y": 67.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "B5": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1323,10 +1323,10 @@ "x": 30.12, "y": 71.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "A5": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1334,10 +1334,10 @@ "x": 30.12, "y": 76.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "P6": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1345,10 +1345,10 @@ "x": 34.62, "y": 8.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "O6": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1356,10 +1356,10 @@ "x": 34.62, "y": 13.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "N6": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1367,10 +1367,10 @@ "x": 34.62, "y": 17.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "M6": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1378,10 +1378,10 @@ "x": 34.62, "y": 22.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "L6": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1389,10 +1389,10 @@ "x": 34.62, "y": 26.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "K6": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1400,10 +1400,10 @@ "x": 34.62, "y": 31.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "J6": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1411,10 +1411,10 @@ "x": 34.62, "y": 35.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "I6": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1422,10 +1422,10 @@ "x": 34.62, "y": 40.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "H6": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1433,10 +1433,10 @@ "x": 34.62, "y": 44.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "G6": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1444,10 +1444,10 @@ "x": 34.62, "y": 49.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "F6": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1455,10 +1455,10 @@ "x": 34.62, "y": 53.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "E6": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1466,10 +1466,10 @@ "x": 34.62, "y": 58.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "D6": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1477,10 +1477,10 @@ "x": 34.62, "y": 62.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "C6": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1488,10 +1488,10 @@ "x": 34.62, "y": 67.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "B6": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1499,10 +1499,10 @@ "x": 34.62, "y": 71.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "A6": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1510,10 +1510,10 @@ "x": 34.62, "y": 76.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "P7": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1521,10 +1521,10 @@ "x": 39.12, "y": 8.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "O7": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1532,10 +1532,10 @@ "x": 39.12, "y": 13.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "N7": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1543,10 +1543,10 @@ "x": 39.12, "y": 17.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "M7": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1554,10 +1554,10 @@ "x": 39.12, "y": 22.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "L7": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1565,10 +1565,10 @@ "x": 39.12, "y": 26.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "K7": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1576,10 +1576,10 @@ "x": 39.12, "y": 31.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "J7": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1587,10 +1587,10 @@ "x": 39.12, "y": 35.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "I7": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1598,10 +1598,10 @@ "x": 39.12, "y": 40.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "H7": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1609,10 +1609,10 @@ "x": 39.12, "y": 44.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "G7": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1620,10 +1620,10 @@ "x": 39.12, "y": 49.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "F7": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1631,10 +1631,10 @@ "x": 39.12, "y": 53.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "E7": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1642,10 +1642,10 @@ "x": 39.12, "y": 58.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "D7": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1653,10 +1653,10 @@ "x": 39.12, "y": 62.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "C7": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1664,10 +1664,10 @@ "x": 39.12, "y": 67.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "B7": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1675,10 +1675,10 @@ "x": 39.12, "y": 71.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "A7": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1686,10 +1686,10 @@ "x": 39.12, "y": 76.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "P8": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1697,10 +1697,10 @@ "x": 43.62, "y": 8.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "O8": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1708,10 +1708,10 @@ "x": 43.62, "y": 13.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "N8": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1719,10 +1719,10 @@ "x": 43.62, "y": 17.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "M8": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1730,10 +1730,10 @@ "x": 43.62, "y": 22.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "L8": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1741,10 +1741,10 @@ "x": 43.62, "y": 26.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "K8": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1752,10 +1752,10 @@ "x": 43.62, "y": 31.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "J8": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1763,10 +1763,10 @@ "x": 43.62, "y": 35.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "I8": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1774,10 +1774,10 @@ "x": 43.62, "y": 40.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "H8": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1785,10 +1785,10 @@ "x": 43.62, "y": 44.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "G8": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1796,10 +1796,10 @@ "x": 43.62, "y": 49.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "F8": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1807,10 +1807,10 @@ "x": 43.62, "y": 53.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "E8": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1818,10 +1818,10 @@ "x": 43.62, "y": 58.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "D8": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1829,10 +1829,10 @@ "x": 43.62, "y": 62.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "C8": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1840,10 +1840,10 @@ "x": 43.62, "y": 67.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "B8": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1851,10 +1851,10 @@ "x": 43.62, "y": 71.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "A8": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1862,10 +1862,10 @@ "x": 43.62, "y": 76.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "P9": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1873,10 +1873,10 @@ "x": 48.12, "y": 8.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "O9": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1884,10 +1884,10 @@ "x": 48.12, "y": 13.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "N9": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1895,10 +1895,10 @@ "x": 48.12, "y": 17.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "M9": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1906,10 +1906,10 @@ "x": 48.12, "y": 22.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "L9": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1917,10 +1917,10 @@ "x": 48.12, "y": 26.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "K9": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1928,10 +1928,10 @@ "x": 48.12, "y": 31.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "J9": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1939,10 +1939,10 @@ "x": 48.12, "y": 35.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "I9": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1950,10 +1950,10 @@ "x": 48.12, "y": 40.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "H9": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1961,10 +1961,10 @@ "x": 48.12, "y": 44.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "G9": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1972,10 +1972,10 @@ "x": 48.12, "y": 49.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "F9": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1983,10 +1983,10 @@ "x": 48.12, "y": 53.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "E9": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -1994,10 +1994,10 @@ "x": 48.12, "y": 58.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "D9": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2005,10 +2005,10 @@ "x": 48.12, "y": 62.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "C9": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2016,10 +2016,10 @@ "x": 48.12, "y": 67.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "B9": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2027,10 +2027,10 @@ "x": 48.12, "y": 71.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "A9": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2038,10 +2038,10 @@ "x": 48.12, "y": 76.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "P10": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2049,10 +2049,10 @@ "x": 52.62, "y": 8.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "O10": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2060,10 +2060,10 @@ "x": 52.62, "y": 13.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "N10": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2071,10 +2071,10 @@ "x": 52.62, "y": 17.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "M10": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2082,10 +2082,10 @@ "x": 52.62, "y": 22.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "L10": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2093,10 +2093,10 @@ "x": 52.62, "y": 26.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "K10": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2104,10 +2104,10 @@ "x": 52.62, "y": 31.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "J10": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2115,10 +2115,10 @@ "x": 52.62, "y": 35.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "I10": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2126,10 +2126,10 @@ "x": 52.62, "y": 40.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "H10": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2137,10 +2137,10 @@ "x": 52.62, "y": 44.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "G10": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2148,10 +2148,10 @@ "x": 52.62, "y": 49.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "F10": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2159,10 +2159,10 @@ "x": 52.62, "y": 53.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "E10": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2170,10 +2170,10 @@ "x": 52.62, "y": 58.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "D10": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2181,10 +2181,10 @@ "x": 52.62, "y": 62.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "C10": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2192,10 +2192,10 @@ "x": 52.62, "y": 67.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "B10": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2203,10 +2203,10 @@ "x": 52.62, "y": 71.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "A10": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2214,10 +2214,10 @@ "x": 52.62, "y": 76.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "P11": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2225,10 +2225,10 @@ "x": 57.12, "y": 8.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "O11": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2236,10 +2236,10 @@ "x": 57.12, "y": 13.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "N11": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2247,10 +2247,10 @@ "x": 57.12, "y": 17.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "M11": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2258,10 +2258,10 @@ "x": 57.12, "y": 22.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "L11": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2269,10 +2269,10 @@ "x": 57.12, "y": 26.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "K11": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2280,10 +2280,10 @@ "x": 57.12, "y": 31.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "J11": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2291,10 +2291,10 @@ "x": 57.12, "y": 35.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "I11": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2302,10 +2302,10 @@ "x": 57.12, "y": 40.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "H11": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2313,10 +2313,10 @@ "x": 57.12, "y": 44.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "G11": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2324,10 +2324,10 @@ "x": 57.12, "y": 49.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "F11": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2335,10 +2335,10 @@ "x": 57.12, "y": 53.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "E11": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2346,10 +2346,10 @@ "x": 57.12, "y": 58.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "D11": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2357,10 +2357,10 @@ "x": 57.12, "y": 62.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "C11": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2368,10 +2368,10 @@ "x": 57.12, "y": 67.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "B11": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2379,10 +2379,10 @@ "x": 57.12, "y": 71.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "A11": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2390,10 +2390,10 @@ "x": 57.12, "y": 76.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "P12": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2401,10 +2401,10 @@ "x": 61.62, "y": 8.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "O12": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2412,10 +2412,10 @@ "x": 61.62, "y": 13.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "N12": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2423,10 +2423,10 @@ "x": 61.62, "y": 17.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "M12": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2434,10 +2434,10 @@ "x": 61.62, "y": 22.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "L12": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2445,10 +2445,10 @@ "x": 61.62, "y": 26.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "K12": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2456,10 +2456,10 @@ "x": 61.62, "y": 31.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "J12": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2467,10 +2467,10 @@ "x": 61.62, "y": 35.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "I12": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2478,10 +2478,10 @@ "x": 61.62, "y": 40.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "H12": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2489,10 +2489,10 @@ "x": 61.62, "y": 44.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "G12": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2500,10 +2500,10 @@ "x": 61.62, "y": 49.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "F12": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2511,10 +2511,10 @@ "x": 61.62, "y": 53.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "E12": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2522,10 +2522,10 @@ "x": 61.62, "y": 58.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "D12": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2533,10 +2533,10 @@ "x": 61.62, "y": 62.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "C12": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2544,10 +2544,10 @@ "x": 61.62, "y": 67.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "B12": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2555,10 +2555,10 @@ "x": 61.62, "y": 71.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "A12": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2566,10 +2566,10 @@ "x": 61.62, "y": 76.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "P13": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2577,10 +2577,10 @@ "x": 66.12, "y": 8.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "O13": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2588,10 +2588,10 @@ "x": 66.12, "y": 13.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "N13": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2599,10 +2599,10 @@ "x": 66.12, "y": 17.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "M13": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2610,10 +2610,10 @@ "x": 66.12, "y": 22.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "L13": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2621,10 +2621,10 @@ "x": 66.12, "y": 26.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "K13": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2632,10 +2632,10 @@ "x": 66.12, "y": 31.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "J13": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2643,10 +2643,10 @@ "x": 66.12, "y": 35.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "I13": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2654,10 +2654,10 @@ "x": 66.12, "y": 40.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "H13": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2665,10 +2665,10 @@ "x": 66.12, "y": 44.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "G13": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2676,10 +2676,10 @@ "x": 66.12, "y": 49.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "F13": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2687,10 +2687,10 @@ "x": 66.12, "y": 53.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "E13": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2698,10 +2698,10 @@ "x": 66.12, "y": 58.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "D13": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2709,10 +2709,10 @@ "x": 66.12, "y": 62.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "C13": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2720,10 +2720,10 @@ "x": 66.12, "y": 67.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "B13": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2731,10 +2731,10 @@ "x": 66.12, "y": 71.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "A13": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2742,10 +2742,10 @@ "x": 66.12, "y": 76.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "P14": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2753,10 +2753,10 @@ "x": 70.62, "y": 8.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "O14": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2764,10 +2764,10 @@ "x": 70.62, "y": 13.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "N14": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2775,10 +2775,10 @@ "x": 70.62, "y": 17.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "M14": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2786,10 +2786,10 @@ "x": 70.62, "y": 22.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "L14": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2797,10 +2797,10 @@ "x": 70.62, "y": 26.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "K14": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2808,10 +2808,10 @@ "x": 70.62, "y": 31.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "J14": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2819,10 +2819,10 @@ "x": 70.62, "y": 35.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "I14": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2830,10 +2830,10 @@ "x": 70.62, "y": 40.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "H14": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2841,10 +2841,10 @@ "x": 70.62, "y": 44.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "G14": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2852,10 +2852,10 @@ "x": 70.62, "y": 49.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "F14": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2863,10 +2863,10 @@ "x": 70.62, "y": 53.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "E14": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2874,10 +2874,10 @@ "x": 70.62, "y": 58.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "D14": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2885,10 +2885,10 @@ "x": 70.62, "y": 62.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "C14": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2896,10 +2896,10 @@ "x": 70.62, "y": 67.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "B14": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2907,10 +2907,10 @@ "x": 70.62, "y": 71.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "A14": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2918,10 +2918,10 @@ "x": 70.62, "y": 76.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "P15": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2929,10 +2929,10 @@ "x": 75.12, "y": 8.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "O15": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2940,10 +2940,10 @@ "x": 75.12, "y": 13.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "N15": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2951,10 +2951,10 @@ "x": 75.12, "y": 17.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "M15": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2962,10 +2962,10 @@ "x": 75.12, "y": 22.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "L15": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2973,10 +2973,10 @@ "x": 75.12, "y": 26.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "K15": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2984,10 +2984,10 @@ "x": 75.12, "y": 31.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "J15": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -2995,10 +2995,10 @@ "x": 75.12, "y": 35.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "I15": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3006,10 +3006,10 @@ "x": 75.12, "y": 40.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "H15": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3017,10 +3017,10 @@ "x": 75.12, "y": 44.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "G15": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3028,10 +3028,10 @@ "x": 75.12, "y": 49.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "F15": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3039,10 +3039,10 @@ "x": 75.12, "y": 53.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "E15": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3050,10 +3050,10 @@ "x": 75.12, "y": 58.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "D15": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3061,10 +3061,10 @@ "x": 75.12, "y": 62.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "C15": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3072,10 +3072,10 @@ "x": 75.12, "y": 67.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "B15": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3083,10 +3083,10 @@ "x": 75.12, "y": 71.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "A15": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3094,10 +3094,10 @@ "x": 75.12, "y": 76.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "P16": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3105,10 +3105,10 @@ "x": 79.62, "y": 8.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "O16": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3116,10 +3116,10 @@ "x": 79.62, "y": 13.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "N16": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3127,10 +3127,10 @@ "x": 79.62, "y": 17.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "M16": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3138,10 +3138,10 @@ "x": 79.62, "y": 22.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "L16": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3149,10 +3149,10 @@ "x": 79.62, "y": 26.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "K16": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3160,10 +3160,10 @@ "x": 79.62, "y": 31.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "J16": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3171,10 +3171,10 @@ "x": 79.62, "y": 35.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "I16": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3182,10 +3182,10 @@ "x": 79.62, "y": 40.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "H16": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3193,10 +3193,10 @@ "x": 79.62, "y": 44.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "G16": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3204,10 +3204,10 @@ "x": 79.62, "y": 49.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "F16": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3215,10 +3215,10 @@ "x": 79.62, "y": 53.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "E16": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3226,10 +3226,10 @@ "x": 79.62, "y": 58.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "D16": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3237,10 +3237,10 @@ "x": 79.62, "y": 62.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "C16": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3248,10 +3248,10 @@ "x": 79.62, "y": 67.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "B16": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3259,10 +3259,10 @@ "x": 79.62, "y": 71.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "A16": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3270,10 +3270,10 @@ "x": 79.62, "y": 76.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "P17": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3281,10 +3281,10 @@ "x": 84.12, "y": 8.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "O17": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3292,10 +3292,10 @@ "x": 84.12, "y": 13.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "N17": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3303,10 +3303,10 @@ "x": 84.12, "y": 17.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "M17": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3314,10 +3314,10 @@ "x": 84.12, "y": 22.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "L17": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3325,10 +3325,10 @@ "x": 84.12, "y": 26.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "K17": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3336,10 +3336,10 @@ "x": 84.12, "y": 31.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "J17": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3347,10 +3347,10 @@ "x": 84.12, "y": 35.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "I17": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3358,10 +3358,10 @@ "x": 84.12, "y": 40.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "H17": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3369,10 +3369,10 @@ "x": 84.12, "y": 44.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "G17": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3380,10 +3380,10 @@ "x": 84.12, "y": 49.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "F17": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3391,10 +3391,10 @@ "x": 84.12, "y": 53.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "E17": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3402,10 +3402,10 @@ "x": 84.12, "y": 58.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "D17": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3413,10 +3413,10 @@ "x": 84.12, "y": 62.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "C17": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3424,10 +3424,10 @@ "x": 84.12, "y": 67.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "B17": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3435,10 +3435,10 @@ "x": 84.12, "y": 71.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "A17": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3446,10 +3446,10 @@ "x": 84.12, "y": 76.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "P18": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3457,10 +3457,10 @@ "x": 88.62, "y": 8.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "O18": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3468,10 +3468,10 @@ "x": 88.62, "y": 13.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "N18": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3479,10 +3479,10 @@ "x": 88.62, "y": 17.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "M18": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3490,10 +3490,10 @@ "x": 88.62, "y": 22.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "L18": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3501,10 +3501,10 @@ "x": 88.62, "y": 26.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "K18": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3512,10 +3512,10 @@ "x": 88.62, "y": 31.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "J18": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3523,10 +3523,10 @@ "x": 88.62, "y": 35.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "I18": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3534,10 +3534,10 @@ "x": 88.62, "y": 40.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "H18": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3545,10 +3545,10 @@ "x": 88.62, "y": 44.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "G18": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3556,10 +3556,10 @@ "x": 88.62, "y": 49.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "F18": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3567,10 +3567,10 @@ "x": 88.62, "y": 53.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "E18": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3578,10 +3578,10 @@ "x": 88.62, "y": 58.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "D18": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3589,10 +3589,10 @@ "x": 88.62, "y": 62.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "C18": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3600,10 +3600,10 @@ "x": 88.62, "y": 67.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "B18": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3611,10 +3611,10 @@ "x": 88.62, "y": 71.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "A18": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3622,10 +3622,10 @@ "x": 88.62, "y": 76.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "P19": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3633,10 +3633,10 @@ "x": 93.12, "y": 8.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "O19": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3644,10 +3644,10 @@ "x": 93.12, "y": 13.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "N19": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3655,10 +3655,10 @@ "x": 93.12, "y": 17.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "M19": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3666,10 +3666,10 @@ "x": 93.12, "y": 22.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "L19": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3677,10 +3677,10 @@ "x": 93.12, "y": 26.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "K19": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3688,10 +3688,10 @@ "x": 93.12, "y": 31.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "J19": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3699,10 +3699,10 @@ "x": 93.12, "y": 35.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "I19": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3710,10 +3710,10 @@ "x": 93.12, "y": 40.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "H19": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3721,10 +3721,10 @@ "x": 93.12, "y": 44.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "G19": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3732,10 +3732,10 @@ "x": 93.12, "y": 49.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "F19": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3743,10 +3743,10 @@ "x": 93.12, "y": 53.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "E19": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3754,10 +3754,10 @@ "x": 93.12, "y": 58.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "D19": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3765,10 +3765,10 @@ "x": 93.12, "y": 62.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "C19": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3776,10 +3776,10 @@ "x": 93.12, "y": 67.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "B19": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3787,10 +3787,10 @@ "x": 93.12, "y": 71.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "A19": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3798,10 +3798,10 @@ "x": 93.12, "y": 76.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "P20": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3809,10 +3809,10 @@ "x": 97.62, "y": 8.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "O20": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3820,10 +3820,10 @@ "x": 97.62, "y": 13.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "N20": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3831,10 +3831,10 @@ "x": 97.62, "y": 17.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "M20": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3842,10 +3842,10 @@ "x": 97.62, "y": 22.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "L20": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3853,10 +3853,10 @@ "x": 97.62, "y": 26.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "K20": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3864,10 +3864,10 @@ "x": 97.62, "y": 31.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "J20": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3875,10 +3875,10 @@ "x": 97.62, "y": 35.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "I20": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3886,10 +3886,10 @@ "x": 97.62, "y": 40.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "H20": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3897,10 +3897,10 @@ "x": 97.62, "y": 44.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "G20": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3908,10 +3908,10 @@ "x": 97.62, "y": 49.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "F20": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3919,10 +3919,10 @@ "x": 97.62, "y": 53.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "E20": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3930,10 +3930,10 @@ "x": 97.62, "y": 58.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "D20": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3941,10 +3941,10 @@ "x": 97.62, "y": 62.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "C20": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3952,10 +3952,10 @@ "x": 97.62, "y": 67.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "B20": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3963,10 +3963,10 @@ "x": 97.62, "y": 71.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "A20": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3974,10 +3974,10 @@ "x": 97.62, "y": 76.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "P21": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3985,10 +3985,10 @@ "x": 102.12, "y": 8.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "O21": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -3996,10 +3996,10 @@ "x": 102.12, "y": 13.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "N21": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4007,10 +4007,10 @@ "x": 102.12, "y": 17.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "M21": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4018,10 +4018,10 @@ "x": 102.12, "y": 22.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "L21": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4029,10 +4029,10 @@ "x": 102.12, "y": 26.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "K21": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4040,10 +4040,10 @@ "x": 102.12, "y": 31.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "J21": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4051,10 +4051,10 @@ "x": 102.12, "y": 35.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "I21": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4062,10 +4062,10 @@ "x": 102.12, "y": 40.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "H21": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4073,10 +4073,10 @@ "x": 102.12, "y": 44.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "G21": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4084,10 +4084,10 @@ "x": 102.12, "y": 49.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "F21": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4095,10 +4095,10 @@ "x": 102.12, "y": 53.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "E21": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4106,10 +4106,10 @@ "x": 102.12, "y": 58.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "D21": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4117,10 +4117,10 @@ "x": 102.12, "y": 62.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "C21": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4128,10 +4128,10 @@ "x": 102.12, "y": 67.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "B21": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4139,10 +4139,10 @@ "x": 102.12, "y": 71.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "A21": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4150,10 +4150,10 @@ "x": 102.12, "y": 76.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "P22": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4161,10 +4161,10 @@ "x": 106.62, "y": 8.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "O22": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4172,10 +4172,10 @@ "x": 106.62, "y": 13.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "N22": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4183,10 +4183,10 @@ "x": 106.62, "y": 17.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "M22": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4194,10 +4194,10 @@ "x": 106.62, "y": 22.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "L22": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4205,10 +4205,10 @@ "x": 106.62, "y": 26.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "K22": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4216,10 +4216,10 @@ "x": 106.62, "y": 31.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "J22": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4227,10 +4227,10 @@ "x": 106.62, "y": 35.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "I22": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4238,10 +4238,10 @@ "x": 106.62, "y": 40.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "H22": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4249,10 +4249,10 @@ "x": 106.62, "y": 44.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "G22": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4260,10 +4260,10 @@ "x": 106.62, "y": 49.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "F22": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4271,10 +4271,10 @@ "x": 106.62, "y": 53.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "E22": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4282,10 +4282,10 @@ "x": 106.62, "y": 58.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "D22": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4293,10 +4293,10 @@ "x": 106.62, "y": 62.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "C22": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4304,10 +4304,10 @@ "x": 106.62, "y": 67.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "B22": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4315,10 +4315,10 @@ "x": 106.62, "y": 71.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "A22": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4326,10 +4326,10 @@ "x": 106.62, "y": 76.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "P23": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4337,10 +4337,10 @@ "x": 111.12, "y": 8.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "O23": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4348,10 +4348,10 @@ "x": 111.12, "y": 13.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "N23": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4359,10 +4359,10 @@ "x": 111.12, "y": 17.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "M23": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4370,10 +4370,10 @@ "x": 111.12, "y": 22.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "L23": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4381,10 +4381,10 @@ "x": 111.12, "y": 26.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "K23": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4392,10 +4392,10 @@ "x": 111.12, "y": 31.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "J23": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4403,10 +4403,10 @@ "x": 111.12, "y": 35.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "I23": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4414,10 +4414,10 @@ "x": 111.12, "y": 40.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "H23": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4425,10 +4425,10 @@ "x": 111.12, "y": 44.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "G23": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4436,10 +4436,10 @@ "x": 111.12, "y": 49.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "F23": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4447,10 +4447,10 @@ "x": 111.12, "y": 53.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "E23": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4458,10 +4458,10 @@ "x": 111.12, "y": 58.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "D23": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4469,10 +4469,10 @@ "x": 111.12, "y": 62.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "C23": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4480,10 +4480,10 @@ "x": 111.12, "y": 67.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "B23": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4491,10 +4491,10 @@ "x": 111.12, "y": 71.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "A23": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4502,10 +4502,10 @@ "x": 111.12, "y": 76.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "P24": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4513,10 +4513,10 @@ "x": 115.62, "y": 8.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "O24": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4524,10 +4524,10 @@ "x": 115.62, "y": 13.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "N24": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4535,10 +4535,10 @@ "x": 115.62, "y": 17.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "M24": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4546,10 +4546,10 @@ "x": 115.62, "y": 22.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "L24": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4557,10 +4557,10 @@ "x": 115.62, "y": 26.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "K24": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4568,10 +4568,10 @@ "x": 115.62, "y": 31.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "J24": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4579,10 +4579,10 @@ "x": 115.62, "y": 35.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "I24": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4590,10 +4590,10 @@ "x": 115.62, "y": 40.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "H24": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4601,10 +4601,10 @@ "x": 115.62, "y": 44.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "G24": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4612,10 +4612,10 @@ "x": 115.62, "y": 49.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "F24": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4623,10 +4623,10 @@ "x": 115.62, "y": 53.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "E24": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4634,10 +4634,10 @@ "x": 115.62, "y": 58.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "D24": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4645,10 +4645,10 @@ "x": 115.62, "y": 62.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "C24": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4656,10 +4656,10 @@ "x": 115.62, "y": 67.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "B24": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4667,10 +4667,10 @@ "x": 115.62, "y": 71.99, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" }, "A24": { - "shape": "rectangular", + "shape": "circular", "depth": 11.43, "xDimension": 3.63, "yDimension": 3.63, @@ -4678,7 +4678,7 @@ "x": 115.62, "y": 76.49, "z": 2.79, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "flatWell" } }, "brand": { @@ -5099,13 +5099,15 @@ } }, "innerLabwareGeometry": { - "conicalWell": { + "flatWell": { "sections": [ { - "shape": "conical", - "bottomDiameter": 3.64, - "topDiameter": 2.74, - "topHeight": 11.65, + "shape": "cuboidal", + "topXDimension": 3.6322, + "topYDimension": 3.6322, + "bottomXDimension": 2.667, + "bottomYDimension": 2.667, + "topHeight": 11.43, "bottomHeight": 0.0 } ] diff --git a/shared-data/labware/definitions/3/corning_48_wellplate_1.6ml_flat/3.json b/shared-data/labware/definitions/3/corning_48_wellplate_1.6ml_flat/3.json index 9caad9af4b0..ad4bf3005ac 100644 --- a/shared-data/labware/definitions/3/corning_48_wellplate_1.6ml_flat/3.json +++ b/shared-data/labware/definitions/3/corning_48_wellplate_1.6ml_flat/3.json @@ -35,7 +35,7 @@ "F1": { "shape": "circular", "depth": 17.4, - "diameter": 11.56, + "diameter": 11.1, "totalLiquidVolume": 1600, "x": 18.16, "y": 10.08, @@ -45,7 +45,7 @@ "E1": { "shape": "circular", "depth": 17.4, - "diameter": 11.56, + "diameter": 11.1, "totalLiquidVolume": 1600, "x": 18.16, "y": 23.16, @@ -55,7 +55,7 @@ "D1": { "shape": "circular", "depth": 17.4, - "diameter": 11.56, + "diameter": 11.1, "totalLiquidVolume": 1600, "x": 18.16, "y": 36.24, @@ -65,7 +65,7 @@ "C1": { "shape": "circular", "depth": 17.4, - "diameter": 11.56, + "diameter": 11.1, "totalLiquidVolume": 1600, "x": 18.16, "y": 49.32, @@ -75,7 +75,7 @@ "B1": { "shape": "circular", "depth": 17.4, - "diameter": 11.56, + "diameter": 11.1, "totalLiquidVolume": 1600, "x": 18.16, "y": 62.4, @@ -85,7 +85,7 @@ "A1": { "shape": "circular", "depth": 17.4, - "diameter": 11.56, + "diameter": 11.1, "totalLiquidVolume": 1600, "x": 18.16, "y": 75.48, @@ -95,7 +95,7 @@ "F2": { "shape": "circular", "depth": 17.4, - "diameter": 11.56, + "diameter": 11.1, "totalLiquidVolume": 1600, "x": 31.24, "y": 10.08, @@ -105,7 +105,7 @@ "E2": { "shape": "circular", "depth": 17.4, - "diameter": 11.56, + "diameter": 11.1, "totalLiquidVolume": 1600, "x": 31.24, "y": 23.16, @@ -115,7 +115,7 @@ "D2": { "shape": "circular", "depth": 17.4, - "diameter": 11.56, + "diameter": 11.1, "totalLiquidVolume": 1600, "x": 31.24, "y": 36.24, @@ -125,7 +125,7 @@ "C2": { "shape": "circular", "depth": 17.4, - "diameter": 11.56, + "diameter": 11.1, "totalLiquidVolume": 1600, "x": 31.24, "y": 49.32, @@ -135,7 +135,7 @@ "B2": { "shape": "circular", "depth": 17.4, - "diameter": 11.56, + "diameter": 11.1, "totalLiquidVolume": 1600, "x": 31.24, "y": 62.4, @@ -145,7 +145,7 @@ "A2": { "shape": "circular", "depth": 17.4, - "diameter": 11.56, + "diameter": 11.1, "totalLiquidVolume": 1600, "x": 31.24, "y": 75.48, @@ -155,7 +155,7 @@ "F3": { "shape": "circular", "depth": 17.4, - "diameter": 11.56, + "diameter": 11.1, "totalLiquidVolume": 1600, "x": 44.32, "y": 10.08, @@ -165,7 +165,7 @@ "E3": { "shape": "circular", "depth": 17.4, - "diameter": 11.56, + "diameter": 11.1, "totalLiquidVolume": 1600, "x": 44.32, "y": 23.16, @@ -175,7 +175,7 @@ "D3": { "shape": "circular", "depth": 17.4, - "diameter": 11.56, + "diameter": 11.1, "totalLiquidVolume": 1600, "x": 44.32, "y": 36.24, @@ -185,7 +185,7 @@ "C3": { "shape": "circular", "depth": 17.4, - "diameter": 11.56, + "diameter": 11.1, "totalLiquidVolume": 1600, "x": 44.32, "y": 49.32, @@ -195,7 +195,7 @@ "B3": { "shape": "circular", "depth": 17.4, - "diameter": 11.56, + "diameter": 11.1, "totalLiquidVolume": 1600, "x": 44.32, "y": 62.4, @@ -205,7 +205,7 @@ "A3": { "shape": "circular", "depth": 17.4, - "diameter": 11.56, + "diameter": 11.1, "totalLiquidVolume": 1600, "x": 44.32, "y": 75.48, @@ -215,7 +215,7 @@ "F4": { "shape": "circular", "depth": 17.4, - "diameter": 11.56, + "diameter": 11.1, "totalLiquidVolume": 1600, "x": 57.4, "y": 10.08, @@ -225,7 +225,7 @@ "E4": { "shape": "circular", "depth": 17.4, - "diameter": 11.56, + "diameter": 11.1, "totalLiquidVolume": 1600, "x": 57.4, "y": 23.16, @@ -235,7 +235,7 @@ "D4": { "shape": "circular", "depth": 17.4, - "diameter": 11.56, + "diameter": 11.1, "totalLiquidVolume": 1600, "x": 57.4, "y": 36.24, @@ -245,7 +245,7 @@ "C4": { "shape": "circular", "depth": 17.4, - "diameter": 11.56, + "diameter": 11.1, "totalLiquidVolume": 1600, "x": 57.4, "y": 49.32, @@ -255,7 +255,7 @@ "B4": { "shape": "circular", "depth": 17.4, - "diameter": 11.56, + "diameter": 11.1, "totalLiquidVolume": 1600, "x": 57.4, "y": 62.4, @@ -265,7 +265,7 @@ "A4": { "shape": "circular", "depth": 17.4, - "diameter": 11.56, + "diameter": 11.1, "totalLiquidVolume": 1600, "x": 57.4, "y": 75.48, @@ -275,7 +275,7 @@ "F5": { "shape": "circular", "depth": 17.4, - "diameter": 11.56, + "diameter": 11.1, "totalLiquidVolume": 1600, "x": 70.48, "y": 10.08, @@ -285,7 +285,7 @@ "E5": { "shape": "circular", "depth": 17.4, - "diameter": 11.56, + "diameter": 11.1, "totalLiquidVolume": 1600, "x": 70.48, "y": 23.16, @@ -295,7 +295,7 @@ "D5": { "shape": "circular", "depth": 17.4, - "diameter": 11.56, + "diameter": 11.1, "totalLiquidVolume": 1600, "x": 70.48, "y": 36.24, @@ -305,7 +305,7 @@ "C5": { "shape": "circular", "depth": 17.4, - "diameter": 11.56, + "diameter": 11.1, "totalLiquidVolume": 1600, "x": 70.48, "y": 49.32, @@ -315,7 +315,7 @@ "B5": { "shape": "circular", "depth": 17.4, - "diameter": 11.56, + "diameter": 11.1, "totalLiquidVolume": 1600, "x": 70.48, "y": 62.4, @@ -325,7 +325,7 @@ "A5": { "shape": "circular", "depth": 17.4, - "diameter": 11.56, + "diameter": 11.1, "totalLiquidVolume": 1600, "x": 70.48, "y": 75.48, @@ -335,7 +335,7 @@ "F6": { "shape": "circular", "depth": 17.4, - "diameter": 11.56, + "diameter": 11.1, "totalLiquidVolume": 1600, "x": 83.56, "y": 10.08, @@ -345,7 +345,7 @@ "E6": { "shape": "circular", "depth": 17.4, - "diameter": 11.56, + "diameter": 11.1, "totalLiquidVolume": 1600, "x": 83.56, "y": 23.16, @@ -355,7 +355,7 @@ "D6": { "shape": "circular", "depth": 17.4, - "diameter": 11.56, + "diameter": 11.1, "totalLiquidVolume": 1600, "x": 83.56, "y": 36.24, @@ -365,7 +365,7 @@ "C6": { "shape": "circular", "depth": 17.4, - "diameter": 11.56, + "diameter": 11.1, "totalLiquidVolume": 1600, "x": 83.56, "y": 49.32, @@ -375,7 +375,7 @@ "B6": { "shape": "circular", "depth": 17.4, - "diameter": 11.56, + "diameter": 11.1, "totalLiquidVolume": 1600, "x": 83.56, "y": 62.4, @@ -385,7 +385,7 @@ "A6": { "shape": "circular", "depth": 17.4, - "diameter": 11.56, + "diameter": 11.1, "totalLiquidVolume": 1600, "x": 83.56, "y": 75.48, @@ -395,7 +395,7 @@ "F7": { "shape": "circular", "depth": 17.4, - "diameter": 11.56, + "diameter": 11.1, "totalLiquidVolume": 1600, "x": 96.64, "y": 10.08, @@ -405,7 +405,7 @@ "E7": { "shape": "circular", "depth": 17.4, - "diameter": 11.56, + "diameter": 11.1, "totalLiquidVolume": 1600, "x": 96.64, "y": 23.16, @@ -415,7 +415,7 @@ "D7": { "shape": "circular", "depth": 17.4, - "diameter": 11.56, + "diameter": 11.1, "totalLiquidVolume": 1600, "x": 96.64, "y": 36.24, @@ -425,7 +425,7 @@ "C7": { "shape": "circular", "depth": 17.4, - "diameter": 11.56, + "diameter": 11.1, "totalLiquidVolume": 1600, "x": 96.64, "y": 49.32, @@ -435,7 +435,7 @@ "B7": { "shape": "circular", "depth": 17.4, - "diameter": 11.56, + "diameter": 11.1, "totalLiquidVolume": 1600, "x": 96.64, "y": 62.4, @@ -445,7 +445,7 @@ "A7": { "shape": "circular", "depth": 17.4, - "diameter": 11.56, + "diameter": 11.1, "totalLiquidVolume": 1600, "x": 96.64, "y": 75.48, @@ -455,7 +455,7 @@ "F8": { "shape": "circular", "depth": 17.4, - "diameter": 11.56, + "diameter": 11.1, "totalLiquidVolume": 1600, "x": 109.72, "y": 10.08, @@ -465,7 +465,7 @@ "E8": { "shape": "circular", "depth": 17.4, - "diameter": 11.56, + "diameter": 11.1, "totalLiquidVolume": 1600, "x": 109.72, "y": 23.16, @@ -475,7 +475,7 @@ "D8": { "shape": "circular", "depth": 17.4, - "diameter": 11.56, + "diameter": 11.1, "totalLiquidVolume": 1600, "x": 109.72, "y": 36.24, @@ -485,7 +485,7 @@ "C8": { "shape": "circular", "depth": 17.4, - "diameter": 11.56, + "diameter": 11.1, "totalLiquidVolume": 1600, "x": 109.72, "y": 49.32, @@ -495,7 +495,7 @@ "B8": { "shape": "circular", "depth": 17.4, - "diameter": 11.56, + "diameter": 11.1, "totalLiquidVolume": 1600, "x": 109.72, "y": 62.4, @@ -505,7 +505,7 @@ "A8": { "shape": "circular", "depth": 17.4, - "diameter": 11.56, + "diameter": 11.1, "totalLiquidVolume": 1600, "x": 109.72, "y": 75.48, @@ -594,9 +594,9 @@ "sections": [ { "shape": "conical", - "bottomDiameter": 11.0998, - "topDiameter": 10.6426, - "topHeight": 17.399, + "bottomDiameter": 10.6426, + "topDiameter": 11.0998, + "topHeight": 17.4, "bottomHeight": 0.0 } ] diff --git a/shared-data/labware/definitions/3/nest_1_reservoir_195ml/3.json b/shared-data/labware/definitions/3/nest_1_reservoir_195ml/3.json index 842b916fb8c..a5fb287ad8c 100644 --- a/shared-data/labware/definitions/3/nest_1_reservoir_195ml/3.json +++ b/shared-data/labware/definitions/3/nest_1_reservoir_195ml/3.json @@ -20,7 +20,7 @@ "gripHeightFromLabwareBottom": 16.8, "wells": { "A1": { - "depth": 25, + "depth": 26.85, "shape": "rectangular", "xDimension": 106.8, "yDimension": 71.2, @@ -71,11 +71,11 @@ { "shape": "cuboidal", "topXDimension": 71.3, - "topYDimension": 70.6, - "bottomXDimension": 107.3, + "topYDimension": 107.3, + "bottomXDimension": 70.6, "bottomYDimension": 106.8, "topHeight": 26.85, - "bottomHeight": 2 + "bottomHeight": 2.0 } ] } diff --git a/shared-data/labware/definitions/3/nest_1_reservoir_290ml/2.json b/shared-data/labware/definitions/3/nest_1_reservoir_290ml/2.json index 13e9cd8f40c..46c5a494533 100644 --- a/shared-data/labware/definitions/3/nest_1_reservoir_290ml/2.json +++ b/shared-data/labware/definitions/3/nest_1_reservoir_290ml/2.json @@ -57,12 +57,22 @@ "sections": [ { "shape": "cuboidal", - "topXDimension": 70.6, - "topYDimension": 106.8, - "bottomXDimension": 71.3, - "bottomYDimension": 107.3, - "topHeight": 2.05, - "bottomHeight": 0.0 + "topXDimension": 7.75, + "topYDimension": 70.75, + "bottomXDimension": 3.127, + "bottomYDimension": 66.85, + "topHeight": 2.0, + "bottomHeight": 0.0, + "xCount": 12 + }, + { + "shape": "cuboidal", + "topXDimension": 107.76, + "topYDimension": 71.0, + "bottomXDimension": 106.75, + "bottomYDimension": 70.75, + "topHeight": 39.55, + "bottomHeight": 2.0 } ] } diff --git a/shared-data/labware/definitions/3/nest_96_wellplate_100ul_pcr_full_skirt/3.json b/shared-data/labware/definitions/3/nest_96_wellplate_100ul_pcr_full_skirt/3.json index 3e55fa4ed84..44114349497 100644 --- a/shared-data/labware/definitions/3/nest_96_wellplate_100ul_pcr_full_skirt/3.json +++ b/shared-data/labware/definitions/3/nest_96_wellplate_100ul_pcr_full_skirt/3.json @@ -33,7 +33,7 @@ "gripHeightFromLabwareBottom": 10.65, "wells": { "A1": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -43,7 +43,7 @@ "geometryDefinitionId": "conicalWell" }, "B1": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -53,7 +53,7 @@ "geometryDefinitionId": "conicalWell" }, "C1": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -63,7 +63,7 @@ "geometryDefinitionId": "conicalWell" }, "D1": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -73,7 +73,7 @@ "geometryDefinitionId": "conicalWell" }, "E1": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -83,7 +83,7 @@ "geometryDefinitionId": "conicalWell" }, "F1": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -93,7 +93,7 @@ "geometryDefinitionId": "conicalWell" }, "G1": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -103,7 +103,7 @@ "geometryDefinitionId": "conicalWell" }, "H1": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -113,7 +113,7 @@ "geometryDefinitionId": "conicalWell" }, "A2": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -123,7 +123,7 @@ "geometryDefinitionId": "conicalWell" }, "B2": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -133,7 +133,7 @@ "geometryDefinitionId": "conicalWell" }, "C2": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -143,7 +143,7 @@ "geometryDefinitionId": "conicalWell" }, "D2": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -153,7 +153,7 @@ "geometryDefinitionId": "conicalWell" }, "E2": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -163,7 +163,7 @@ "geometryDefinitionId": "conicalWell" }, "F2": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -173,7 +173,7 @@ "geometryDefinitionId": "conicalWell" }, "G2": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -183,7 +183,7 @@ "geometryDefinitionId": "conicalWell" }, "H2": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -193,7 +193,7 @@ "geometryDefinitionId": "conicalWell" }, "A3": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -203,7 +203,7 @@ "geometryDefinitionId": "conicalWell" }, "B3": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -213,7 +213,7 @@ "geometryDefinitionId": "conicalWell" }, "C3": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -223,7 +223,7 @@ "geometryDefinitionId": "conicalWell" }, "D3": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -233,7 +233,7 @@ "geometryDefinitionId": "conicalWell" }, "E3": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -243,7 +243,7 @@ "geometryDefinitionId": "conicalWell" }, "F3": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -253,7 +253,7 @@ "geometryDefinitionId": "conicalWell" }, "G3": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -263,7 +263,7 @@ "geometryDefinitionId": "conicalWell" }, "H3": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -273,7 +273,7 @@ "geometryDefinitionId": "conicalWell" }, "A4": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -283,7 +283,7 @@ "geometryDefinitionId": "conicalWell" }, "B4": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -293,7 +293,7 @@ "geometryDefinitionId": "conicalWell" }, "C4": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -303,7 +303,7 @@ "geometryDefinitionId": "conicalWell" }, "D4": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -313,7 +313,7 @@ "geometryDefinitionId": "conicalWell" }, "E4": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -323,7 +323,7 @@ "geometryDefinitionId": "conicalWell" }, "F4": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -333,7 +333,7 @@ "geometryDefinitionId": "conicalWell" }, "G4": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -343,7 +343,7 @@ "geometryDefinitionId": "conicalWell" }, "H4": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -353,7 +353,7 @@ "geometryDefinitionId": "conicalWell" }, "A5": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -363,7 +363,7 @@ "geometryDefinitionId": "conicalWell" }, "B5": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -373,7 +373,7 @@ "geometryDefinitionId": "conicalWell" }, "C5": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -383,7 +383,7 @@ "geometryDefinitionId": "conicalWell" }, "D5": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -393,7 +393,7 @@ "geometryDefinitionId": "conicalWell" }, "E5": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -403,7 +403,7 @@ "geometryDefinitionId": "conicalWell" }, "F5": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -413,7 +413,7 @@ "geometryDefinitionId": "conicalWell" }, "G5": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -423,7 +423,7 @@ "geometryDefinitionId": "conicalWell" }, "H5": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -433,7 +433,7 @@ "geometryDefinitionId": "conicalWell" }, "A6": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -443,7 +443,7 @@ "geometryDefinitionId": "conicalWell" }, "B6": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -453,7 +453,7 @@ "geometryDefinitionId": "conicalWell" }, "C6": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -463,7 +463,7 @@ "geometryDefinitionId": "conicalWell" }, "D6": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -473,7 +473,7 @@ "geometryDefinitionId": "conicalWell" }, "E6": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -483,7 +483,7 @@ "geometryDefinitionId": "conicalWell" }, "F6": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -493,7 +493,7 @@ "geometryDefinitionId": "conicalWell" }, "G6": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -503,7 +503,7 @@ "geometryDefinitionId": "conicalWell" }, "H6": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -513,7 +513,7 @@ "geometryDefinitionId": "conicalWell" }, "A7": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -523,7 +523,7 @@ "geometryDefinitionId": "conicalWell" }, "B7": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -533,7 +533,7 @@ "geometryDefinitionId": "conicalWell" }, "C7": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -543,7 +543,7 @@ "geometryDefinitionId": "conicalWell" }, "D7": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -553,7 +553,7 @@ "geometryDefinitionId": "conicalWell" }, "E7": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -563,7 +563,7 @@ "geometryDefinitionId": "conicalWell" }, "F7": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -573,7 +573,7 @@ "geometryDefinitionId": "conicalWell" }, "G7": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -583,7 +583,7 @@ "geometryDefinitionId": "conicalWell" }, "H7": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -593,7 +593,7 @@ "geometryDefinitionId": "conicalWell" }, "A8": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -603,7 +603,7 @@ "geometryDefinitionId": "conicalWell" }, "B8": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -613,7 +613,7 @@ "geometryDefinitionId": "conicalWell" }, "C8": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -623,7 +623,7 @@ "geometryDefinitionId": "conicalWell" }, "D8": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -633,7 +633,7 @@ "geometryDefinitionId": "conicalWell" }, "E8": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -643,7 +643,7 @@ "geometryDefinitionId": "conicalWell" }, "F8": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -653,7 +653,7 @@ "geometryDefinitionId": "conicalWell" }, "G8": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -663,7 +663,7 @@ "geometryDefinitionId": "conicalWell" }, "H8": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -673,7 +673,7 @@ "geometryDefinitionId": "conicalWell" }, "A9": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -683,7 +683,7 @@ "geometryDefinitionId": "conicalWell" }, "B9": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -693,7 +693,7 @@ "geometryDefinitionId": "conicalWell" }, "C9": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -703,7 +703,7 @@ "geometryDefinitionId": "conicalWell" }, "D9": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -713,7 +713,7 @@ "geometryDefinitionId": "conicalWell" }, "E9": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -723,7 +723,7 @@ "geometryDefinitionId": "conicalWell" }, "F9": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -733,7 +733,7 @@ "geometryDefinitionId": "conicalWell" }, "G9": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -743,7 +743,7 @@ "geometryDefinitionId": "conicalWell" }, "H9": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -753,7 +753,7 @@ "geometryDefinitionId": "conicalWell" }, "A10": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -763,7 +763,7 @@ "geometryDefinitionId": "conicalWell" }, "B10": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -773,7 +773,7 @@ "geometryDefinitionId": "conicalWell" }, "C10": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -783,7 +783,7 @@ "geometryDefinitionId": "conicalWell" }, "D10": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -793,7 +793,7 @@ "geometryDefinitionId": "conicalWell" }, "E10": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -803,7 +803,7 @@ "geometryDefinitionId": "conicalWell" }, "F10": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -813,7 +813,7 @@ "geometryDefinitionId": "conicalWell" }, "G10": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -823,7 +823,7 @@ "geometryDefinitionId": "conicalWell" }, "H10": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -833,7 +833,7 @@ "geometryDefinitionId": "conicalWell" }, "A11": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -843,7 +843,7 @@ "geometryDefinitionId": "conicalWell" }, "B11": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -853,7 +853,7 @@ "geometryDefinitionId": "conicalWell" }, "C11": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -863,7 +863,7 @@ "geometryDefinitionId": "conicalWell" }, "D11": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -873,7 +873,7 @@ "geometryDefinitionId": "conicalWell" }, "E11": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -883,7 +883,7 @@ "geometryDefinitionId": "conicalWell" }, "F11": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -893,7 +893,7 @@ "geometryDefinitionId": "conicalWell" }, "G11": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -903,7 +903,7 @@ "geometryDefinitionId": "conicalWell" }, "H11": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -913,7 +913,7 @@ "geometryDefinitionId": "conicalWell" }, "A12": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -923,7 +923,7 @@ "geometryDefinitionId": "conicalWell" }, "B12": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -933,7 +933,7 @@ "geometryDefinitionId": "conicalWell" }, "C12": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -943,7 +943,7 @@ "geometryDefinitionId": "conicalWell" }, "D12": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -953,7 +953,7 @@ "geometryDefinitionId": "conicalWell" }, "E12": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -963,7 +963,7 @@ "geometryDefinitionId": "conicalWell" }, "F12": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -973,7 +973,7 @@ "geometryDefinitionId": "conicalWell" }, "G12": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, @@ -983,7 +983,7 @@ "geometryDefinitionId": "conicalWell" }, "H12": { - "depth": 14.78, + "depth": 14.7, "shape": "circular", "diameter": 5.34, "totalLiquidVolume": 100, diff --git a/shared-data/labware/definitions/3/opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical/2.json b/shared-data/labware/definitions/3/opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical/2.json index 7827cbb5916..788e56ee3ba 100644 --- a/shared-data/labware/definitions/3/opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical/2.json +++ b/shared-data/labware/definitions/3/opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical/2.json @@ -90,7 +90,7 @@ "totalLiquidVolume": 50000, "diameter": 27.81, "shape": "circular", - "depth": 113, + "depth": 112.85, "x": 71.38, "y": 60.25, "z": 7.3, @@ -100,7 +100,7 @@ "totalLiquidVolume": 50000, "diameter": 27.81, "shape": "circular", - "depth": 113, + "depth": 112.85, "x": 71.38, "y": 25.25, "z": 7.3, @@ -110,7 +110,7 @@ "totalLiquidVolume": 50000, "diameter": 27.81, "shape": "circular", - "depth": 113, + "depth": 112.85, "x": 106.38, "y": 60.25, "z": 7.3, @@ -120,7 +120,7 @@ "totalLiquidVolume": 50000, "diameter": 27.81, "shape": "circular", - "depth": 113, + "depth": 112.85, "x": 106.38, "y": 25.25, "z": 7.3, diff --git a/shared-data/labware/definitions/3/opentrons_10_tuberack_nest_4x50ml_6x15ml_conical/2.json b/shared-data/labware/definitions/3/opentrons_10_tuberack_nest_4x50ml_6x15ml_conical/2.json index 417e3e893de..209aeac29e6 100644 --- a/shared-data/labware/definitions/3/opentrons_10_tuberack_nest_4x50ml_6x15ml_conical/2.json +++ b/shared-data/labware/definitions/3/opentrons_10_tuberack_nest_4x50ml_6x15ml_conical/2.json @@ -8,7 +8,7 @@ "x": 13.88, "y": 67.75, "z": 6.85, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "conicalWell15mL" }, "B1": { "totalLiquidVolume": 15000, @@ -18,7 +18,7 @@ "x": 13.88, "y": 42.75, "z": 6.85, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "conicalWell15mL" }, "C1": { "totalLiquidVolume": 15000, @@ -28,7 +28,7 @@ "x": 13.88, "y": 17.75, "z": 6.85, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "conicalWell15mL" }, "A2": { "totalLiquidVolume": 15000, @@ -38,7 +38,7 @@ "x": 38.88, "y": 67.75, "z": 6.85, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "conicalWell15mL" }, "B2": { "totalLiquidVolume": 15000, @@ -48,7 +48,7 @@ "x": 38.88, "y": 42.75, "z": 6.85, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "conicalWell15mL" }, "C2": { "totalLiquidVolume": 15000, @@ -58,47 +58,47 @@ "x": 38.88, "y": 17.75, "z": 6.85, - "geometryDefinitionId": "conicalWell" + "geometryDefinitionId": "conicalWell15mL" }, "A3": { "totalLiquidVolume": 50000, - "diameter": 27.95, + "diameter": 28.18, "shape": "circular", - "depth": 113.05, + "depth": 113.1, "x": 71.38, "y": 60.25, "z": 7.3, - "geometryDefinitionId": "b" + "geometryDefinitionId": "conicalWell50mL" }, "B3": { "totalLiquidVolume": 50000, - "diameter": 27.95, + "diameter": 28.18, "shape": "circular", - "depth": 113.05, + "depth": 113.1, "x": 71.38, "y": 25.25, "z": 7.3, - "geometryDefinitionId": "b" + "geometryDefinitionId": "conicalWell50mL" }, "A4": { "totalLiquidVolume": 50000, - "diameter": 27.95, + "diameter": 28.18, "shape": "circular", - "depth": 113.05, + "depth": 113.1, "x": 106.38, "y": 60.25, "z": 7.3, - "geometryDefinitionId": "b" + "geometryDefinitionId": "conicalWell50mL" }, "B4": { "totalLiquidVolume": 50000, - "diameter": 27.95, + "diameter": 28.18, "shape": "circular", - "depth": 113.05, + "depth": 113.1, "x": 106.38, "y": 25.25, "z": 7.3, - "geometryDefinitionId": "b" + "geometryDefinitionId": "conicalWell50mL" } }, "groups": [ @@ -168,53 +168,66 @@ "z": 0 }, "innerLabwareGeometry": { - "conicalWell": { + "conicalWell15mL": { "sections": [ + { + "shape": "spherical", + "radiusOfCurvature": 1.235, + "topHeight": 0.92, + "bottomHeight": 0.0 + }, { "shape": "conical", "topDiameter": 13.8, - "bottomDiameter": 2.5, + "bottomDiameter": 2.38, "topHeight": 22.55, - "bottomHeight": 0.0 + "bottomHeight": 0.92 }, { "shape": "conical", - "topDiameter": 14.78, + "topDiameter": 14.56, "bottomDiameter": 13.8, - "topHeight": 109.03, + "topHeight": 113.8, "bottomHeight": 22.55 }, { "shape": "conical", "topDiameter": 15.5, - "bottomDiameter": 14.78, + "bottomDiameter": 14.56, "topHeight": 117.8, - "bottomHeight": 109.03 + "bottomHeight": 113.8 } ] }, - "b": { + "conicalWell50mL": { "sections": [ { "shape": "conical", "topDiameter": 26.0, - "bottomDiameter": 6.0, - "topHeight": 14.28, + "bottomDiameter": 4.5, + "topHeight": 14.35, "bottomHeight": 0.0 }, { "shape": "conical", - "topDiameter": 27.0, + "topDiameter": 27.69, "bottomDiameter": 26.0, - "topHeight": 109.0, - "bottomHeight": 14.28 + "topHeight": 108.8, + "bottomHeight": 14.35 + }, + { + "shape": "conical", + "topDiameter": 27.95, + "bottomDiameter": 27.69, + "topHeight": 109.1, + "bottomHeight": 108.8 }, { "shape": "conical", - "topDiameter": 27.45, - "bottomDiameter": 27.0, - "topHeight": 113.3, - "bottomHeight": 109.0 + "topDiameter": 28.18, + "bottomDiameter": 27.95, + "topHeight": 113.1, + "bottomHeight": 109.1 } ] } diff --git a/shared-data/labware/definitions/3/opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap/2.json b/shared-data/labware/definitions/3/opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap/2.json index 1a0cc9ea508..97726f203f7 100644 --- a/shared-data/labware/definitions/3/opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap/2.json +++ b/shared-data/labware/definitions/3/opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap/2.json @@ -334,7 +334,140 @@ }, "innerLabwareGeometry": { "conicalWell": { - "sections": [] + "sections": [ + { + "shape": "spherical", + "radiusOfCurvature": 2.88, + "topHeight": 1.45, + "bottomHeight": 0.0 + }, + { + "shape": "conical", + "topDiameter": 6.0, + "bottomDiameter": 5.0, + "topHeight": 2.2, + "bottomHeight": 1.45 + }, + { + "shape": "conical", + "topDiameter": 6.4, + "bottomDiameter": 6.0, + "topHeight": 2.45, + "bottomHeight": 2.2 + }, + { + "shape": "conical", + "topDiameter": 6.8, + "bottomDiameter": 6.4, + "topHeight": 2.75, + "bottomHeight": 2.45 + }, + { + "shape": "conical", + "topDiameter": 7.2, + "bottomDiameter": 6.8, + "topHeight": 3.14, + "bottomHeight": 2.75 + }, + { + "shape": "conical", + "topDiameter": 7.6, + "bottomDiameter": 7.2, + "topHeight": 3.67, + "bottomHeight": 3.14 + }, + { + "shape": "conical", + "topDiameter": 7.7, + "bottomDiameter": 7.6, + "topHeight": 3.93, + "bottomHeight": 3.67 + }, + { + "shape": "conical", + "topDiameter": 8.0, + "bottomDiameter": 7.7, + "topHeight": 4.29, + "bottomHeight": 3.93 + }, + { + "shape": "conical", + "topDiameter": 8.2, + "bottomDiameter": 8.0, + "topHeight": 4.53, + "bottomHeight": 4.29 + }, + { + "shape": "conical", + "topDiameter": 8.4, + "bottomDiameter": 8.2, + "topHeight": 5.03, + "bottomHeight": 4.53 + }, + { + "shape": "conical", + "topDiameter": 8.5, + "bottomDiameter": 8.4, + "topHeight": 5.15, + "bottomHeight": 5.03 + }, + { + "shape": "conical", + "topDiameter": 8.6, + "bottomDiameter": 8.5, + "topHeight": 5.43, + "bottomHeight": 5.15 + }, + { + "shape": "conical", + "topDiameter": 8.78, + "bottomDiameter": 8.6, + "topHeight": 6.97, + "bottomHeight": 5.43 + }, + { + "shape": "conical", + "topDiameter": 8.9, + "bottomDiameter": 8.78, + "topHeight": 10.17, + "bottomHeight": 6.97 + }, + { + "shape": "conical", + "topDiameter": 9.0, + "bottomDiameter": 8.9, + "topHeight": 13.32, + "bottomHeight": 10.17 + }, + { + "shape": "conical", + "topDiameter": 9.1, + "bottomDiameter": 9.0, + "topHeight": 25.26, + "bottomHeight": 13.32 + }, + { + "shape": "conical", + "topDiameter": 9.2, + "bottomDiameter": 9.1, + "topHeight": 32.5, + "bottomHeight": 25.26 + }, + { + "shape": "conical", + "topDiameter": 9.6, + "bottomDiameter": 9.2, + "topHeight": 33.96, + "bottomHeight": 32.5 + }, + { + "shape": "conical", + "topDiameter": 10.0, + "bottomDiameter": 9.6, + "topHeight": 39.02, + "bottomHeight": 33.96 + } + ] } } } diff --git a/shared-data/labware/definitions/3/opentrons_24_tuberack_generic_2ml_screwcap/2.json b/shared-data/labware/definitions/3/opentrons_24_tuberack_generic_2ml_screwcap/2.json index 660331eedfd..0914789708c 100644 --- a/shared-data/labware/definitions/3/opentrons_24_tuberack_generic_2ml_screwcap/2.json +++ b/shared-data/labware/definitions/3/opentrons_24_tuberack_generic_2ml_screwcap/2.json @@ -323,7 +323,29 @@ }, "innerLabwareGeometry": { "conicalWell": { - "sections": [] + "sections": [ + { + "shape": "conical", + "topDiameter": 6.5, + "bottomDiameter": 1.21, + "topHeight": 2.08, + "bottomHeight": 0.0 + }, + { + "shape": "conical", + "topDiameter": 8.14, + "bottomDiameter": 6.5, + "topHeight": 3.04, + "bottomHeight": 2.08 + }, + { + "shape": "conical", + "topDiameter": 8.5, + "bottomDiameter": 8.14, + "topHeight": 42.0, + "bottomHeight": 3.04 + } + ] } } } diff --git a/shared-data/labware/definitions/3/opentrons_24_tuberack_nest_1.5ml_screwcap/2.json b/shared-data/labware/definitions/3/opentrons_24_tuberack_nest_1.5ml_screwcap/2.json index 7d7a193d55d..9544e5cc9c2 100644 --- a/shared-data/labware/definitions/3/opentrons_24_tuberack_nest_1.5ml_screwcap/2.json +++ b/shared-data/labware/definitions/3/opentrons_24_tuberack_nest_1.5ml_screwcap/2.json @@ -27,9 +27,9 @@ }, "wells": { "A1": { - "depth": 43.9, + "depth": 42.6, "shape": "circular", - "diameter": 8.69, + "diameter": 8.55, "totalLiquidVolume": 1500, "x": 18.21, "y": 75.43, @@ -37,9 +37,9 @@ "geometryDefinitionId": "conicalWell" }, "B1": { - "depth": 43.9, + "depth": 42.6, "shape": "circular", - "diameter": 8.69, + "diameter": 8.55, "totalLiquidVolume": 1500, "x": 18.21, "y": 56.15, @@ -47,9 +47,9 @@ "geometryDefinitionId": "conicalWell" }, "C1": { - "depth": 43.9, + "depth": 42.6, "shape": "circular", - "diameter": 8.69, + "diameter": 8.55, "totalLiquidVolume": 1500, "x": 18.21, "y": 36.87, @@ -57,9 +57,9 @@ "geometryDefinitionId": "conicalWell" }, "D1": { - "depth": 43.9, + "depth": 42.6, "shape": "circular", - "diameter": 8.69, + "diameter": 8.55, "totalLiquidVolume": 1500, "x": 18.21, "y": 17.59, @@ -67,9 +67,9 @@ "geometryDefinitionId": "conicalWell" }, "A2": { - "depth": 43.9, + "depth": 42.6, "shape": "circular", - "diameter": 8.69, + "diameter": 8.55, "totalLiquidVolume": 1500, "x": 38.1, "y": 75.43, @@ -77,9 +77,9 @@ "geometryDefinitionId": "conicalWell" }, "B2": { - "depth": 43.9, + "depth": 42.6, "shape": "circular", - "diameter": 8.69, + "diameter": 8.55, "totalLiquidVolume": 1500, "x": 38.1, "y": 56.15, @@ -87,9 +87,9 @@ "geometryDefinitionId": "conicalWell" }, "C2": { - "depth": 43.9, + "depth": 42.6, "shape": "circular", - "diameter": 8.69, + "diameter": 8.55, "totalLiquidVolume": 1500, "x": 38.1, "y": 36.87, @@ -97,9 +97,9 @@ "geometryDefinitionId": "conicalWell" }, "D2": { - "depth": 43.9, + "depth": 42.6, "shape": "circular", - "diameter": 8.69, + "diameter": 8.55, "totalLiquidVolume": 1500, "x": 38.1, "y": 17.59, @@ -107,9 +107,9 @@ "geometryDefinitionId": "conicalWell" }, "A3": { - "depth": 43.9, + "depth": 42.6, "shape": "circular", - "diameter": 8.69, + "diameter": 8.55, "totalLiquidVolume": 1500, "x": 57.99, "y": 75.43, @@ -117,9 +117,9 @@ "geometryDefinitionId": "conicalWell" }, "B3": { - "depth": 43.9, + "depth": 42.6, "shape": "circular", - "diameter": 8.69, + "diameter": 8.55, "totalLiquidVolume": 1500, "x": 57.99, "y": 56.15, @@ -127,9 +127,9 @@ "geometryDefinitionId": "conicalWell" }, "C3": { - "depth": 43.9, + "depth": 42.6, "shape": "circular", - "diameter": 8.69, + "diameter": 8.55, "totalLiquidVolume": 1500, "x": 57.99, "y": 36.87, @@ -137,9 +137,9 @@ "geometryDefinitionId": "conicalWell" }, "D3": { - "depth": 43.9, + "depth": 42.6, "shape": "circular", - "diameter": 8.69, + "diameter": 8.55, "totalLiquidVolume": 1500, "x": 57.99, "y": 17.59, @@ -147,9 +147,9 @@ "geometryDefinitionId": "conicalWell" }, "A4": { - "depth": 43.9, + "depth": 42.6, "shape": "circular", - "diameter": 8.69, + "diameter": 8.55, "totalLiquidVolume": 1500, "x": 77.88, "y": 75.43, @@ -157,9 +157,9 @@ "geometryDefinitionId": "conicalWell" }, "B4": { - "depth": 43.9, + "depth": 42.6, "shape": "circular", - "diameter": 8.69, + "diameter": 8.55, "totalLiquidVolume": 1500, "x": 77.88, "y": 56.15, @@ -167,9 +167,9 @@ "geometryDefinitionId": "conicalWell" }, "C4": { - "depth": 43.9, + "depth": 42.6, "shape": "circular", - "diameter": 8.69, + "diameter": 8.55, "totalLiquidVolume": 1500, "x": 77.88, "y": 36.87, @@ -177,9 +177,9 @@ "geometryDefinitionId": "conicalWell" }, "D4": { - "depth": 43.9, + "depth": 42.6, "shape": "circular", - "diameter": 8.69, + "diameter": 8.55, "totalLiquidVolume": 1500, "x": 77.88, "y": 17.59, @@ -187,9 +187,9 @@ "geometryDefinitionId": "conicalWell" }, "A5": { - "depth": 43.9, + "depth": 42.6, "shape": "circular", - "diameter": 8.69, + "diameter": 8.55, "totalLiquidVolume": 1500, "x": 97.77, "y": 75.43, @@ -197,9 +197,9 @@ "geometryDefinitionId": "conicalWell" }, "B5": { - "depth": 43.9, + "depth": 42.6, "shape": "circular", - "diameter": 8.69, + "diameter": 8.55, "totalLiquidVolume": 1500, "x": 97.77, "y": 56.15, @@ -207,9 +207,9 @@ "geometryDefinitionId": "conicalWell" }, "C5": { - "depth": 43.9, + "depth": 42.6, "shape": "circular", - "diameter": 8.69, + "diameter": 8.55, "totalLiquidVolume": 1500, "x": 97.77, "y": 36.87, @@ -217,9 +217,9 @@ "geometryDefinitionId": "conicalWell" }, "D5": { - "depth": 43.9, + "depth": 42.6, "shape": "circular", - "diameter": 8.69, + "diameter": 8.55, "totalLiquidVolume": 1500, "x": 97.77, "y": 17.59, @@ -227,9 +227,9 @@ "geometryDefinitionId": "conicalWell" }, "A6": { - "depth": 43.9, + "depth": 42.6, "shape": "circular", - "diameter": 8.69, + "diameter": 8.55, "totalLiquidVolume": 1500, "x": 117.66, "y": 75.43, @@ -237,9 +237,9 @@ "geometryDefinitionId": "conicalWell" }, "B6": { - "depth": 43.9, + "depth": 42.6, "shape": "circular", - "diameter": 8.69, + "diameter": 8.55, "totalLiquidVolume": 1500, "x": 117.66, "y": 56.15, @@ -247,9 +247,9 @@ "geometryDefinitionId": "conicalWell" }, "C6": { - "depth": 43.9, + "depth": 42.6, "shape": "circular", - "diameter": 8.69, + "diameter": 8.55, "totalLiquidVolume": 1500, "x": 117.66, "y": 36.87, @@ -257,9 +257,9 @@ "geometryDefinitionId": "conicalWell" }, "D6": { - "depth": 43.9, + "depth": 42.6, "shape": "circular", - "diameter": 8.69, + "diameter": 8.55, "totalLiquidVolume": 1500, "x": 117.66, "y": 17.59, diff --git a/shared-data/labware/definitions/3/opentrons_24_tuberack_nest_1.5ml_snapcap/2.json b/shared-data/labware/definitions/3/opentrons_24_tuberack_nest_1.5ml_snapcap/2.json index c1025a18ad1..af1f609a7f4 100644 --- a/shared-data/labware/definitions/3/opentrons_24_tuberack_nest_1.5ml_snapcap/2.json +++ b/shared-data/labware/definitions/3/opentrons_24_tuberack_nest_1.5ml_snapcap/2.json @@ -29,7 +29,7 @@ "A1": { "depth": 37.9, "shape": "circular", - "diameter": 10.2, + "diameter": 9.9, "totalLiquidVolume": 1500, "x": 18.21, "y": 75.43, @@ -39,7 +39,7 @@ "B1": { "depth": 37.9, "shape": "circular", - "diameter": 10.2, + "diameter": 9.9, "totalLiquidVolume": 1500, "x": 18.21, "y": 56.15, @@ -49,7 +49,7 @@ "C1": { "depth": 37.9, "shape": "circular", - "diameter": 10.2, + "diameter": 9.9, "totalLiquidVolume": 1500, "x": 18.21, "y": 36.87, @@ -59,7 +59,7 @@ "D1": { "depth": 37.9, "shape": "circular", - "diameter": 10.2, + "diameter": 9.9, "totalLiquidVolume": 1500, "x": 18.21, "y": 17.59, @@ -69,7 +69,7 @@ "A2": { "depth": 37.9, "shape": "circular", - "diameter": 10.2, + "diameter": 9.9, "totalLiquidVolume": 1500, "x": 38.1, "y": 75.43, @@ -79,7 +79,7 @@ "B2": { "depth": 37.9, "shape": "circular", - "diameter": 10.2, + "diameter": 9.9, "totalLiquidVolume": 1500, "x": 38.1, "y": 56.15, @@ -89,7 +89,7 @@ "C2": { "depth": 37.9, "shape": "circular", - "diameter": 10.2, + "diameter": 9.9, "totalLiquidVolume": 1500, "x": 38.1, "y": 36.87, @@ -99,7 +99,7 @@ "D2": { "depth": 37.9, "shape": "circular", - "diameter": 10.2, + "diameter": 9.9, "totalLiquidVolume": 1500, "x": 38.1, "y": 17.59, @@ -109,7 +109,7 @@ "A3": { "depth": 37.9, "shape": "circular", - "diameter": 10.2, + "diameter": 9.9, "totalLiquidVolume": 1500, "x": 57.99, "y": 75.43, @@ -119,7 +119,7 @@ "B3": { "depth": 37.9, "shape": "circular", - "diameter": 10.2, + "diameter": 9.9, "totalLiquidVolume": 1500, "x": 57.99, "y": 56.15, @@ -129,7 +129,7 @@ "C3": { "depth": 37.9, "shape": "circular", - "diameter": 10.2, + "diameter": 9.9, "totalLiquidVolume": 1500, "x": 57.99, "y": 36.87, @@ -139,7 +139,7 @@ "D3": { "depth": 37.9, "shape": "circular", - "diameter": 10.2, + "diameter": 9.9, "totalLiquidVolume": 1500, "x": 57.99, "y": 17.59, @@ -149,7 +149,7 @@ "A4": { "depth": 37.9, "shape": "circular", - "diameter": 10.2, + "diameter": 9.9, "totalLiquidVolume": 1500, "x": 77.88, "y": 75.43, @@ -159,7 +159,7 @@ "B4": { "depth": 37.9, "shape": "circular", - "diameter": 10.2, + "diameter": 9.9, "totalLiquidVolume": 1500, "x": 77.88, "y": 56.15, @@ -169,7 +169,7 @@ "C4": { "depth": 37.9, "shape": "circular", - "diameter": 10.2, + "diameter": 9.9, "totalLiquidVolume": 1500, "x": 77.88, "y": 36.87, @@ -179,7 +179,7 @@ "D4": { "depth": 37.9, "shape": "circular", - "diameter": 10.2, + "diameter": 9.9, "totalLiquidVolume": 1500, "x": 77.88, "y": 17.59, @@ -189,7 +189,7 @@ "A5": { "depth": 37.9, "shape": "circular", - "diameter": 10.2, + "diameter": 9.9, "totalLiquidVolume": 1500, "x": 97.77, "y": 75.43, @@ -199,7 +199,7 @@ "B5": { "depth": 37.9, "shape": "circular", - "diameter": 10.2, + "diameter": 9.9, "totalLiquidVolume": 1500, "x": 97.77, "y": 56.15, @@ -209,7 +209,7 @@ "C5": { "depth": 37.9, "shape": "circular", - "diameter": 10.2, + "diameter": 9.9, "totalLiquidVolume": 1500, "x": 97.77, "y": 36.87, @@ -219,7 +219,7 @@ "D5": { "depth": 37.9, "shape": "circular", - "diameter": 10.2, + "diameter": 9.9, "totalLiquidVolume": 1500, "x": 97.77, "y": 17.59, @@ -229,7 +229,7 @@ "A6": { "depth": 37.9, "shape": "circular", - "diameter": 10.2, + "diameter": 9.9, "totalLiquidVolume": 1500, "x": 117.66, "y": 75.43, @@ -239,7 +239,7 @@ "B6": { "depth": 37.9, "shape": "circular", - "diameter": 10.2, + "diameter": 9.9, "totalLiquidVolume": 1500, "x": 117.66, "y": 56.15, @@ -249,7 +249,7 @@ "C6": { "depth": 37.9, "shape": "circular", - "diameter": 10.2, + "diameter": 9.9, "totalLiquidVolume": 1500, "x": 117.66, "y": 36.87, @@ -259,7 +259,7 @@ "D6": { "depth": 37.9, "shape": "circular", - "diameter": 10.2, + "diameter": 9.9, "totalLiquidVolume": 1500, "x": 117.66, "y": 17.59, @@ -328,23 +328,30 @@ "sections": [ { "shape": "spherical", - "radiusOfCurvature": 2.72, - "topHeight": 1.57, + "radiusOfCurvature": 1.87, + "topHeight": 1.56, "bottomHeight": 0.0 }, { "shape": "conical", - "topDiameter": 8.9, + "topDiameter": 8.98, "bottomDiameter": 3.69, - "topHeight": 17.7, - "bottomHeight": 1.57 + "topHeight": 17.4, + "bottomHeight": 1.56 }, { "shape": "conical", "topDiameter": 9.28, - "bottomDiameter": 8.9, + "bottomDiameter": 8.98, + "topHeight": 35.4, + "bottomHeight": 17.4 + }, + { + "shape": "conical", + "topDiameter": 9.9, + "bottomDiameter": 9.28, "topHeight": 37.9, - "bottomHeight": 17.7 + "bottomHeight": 35.4 } ] } diff --git a/shared-data/labware/definitions/3/opentrons_24_tuberack_nest_2ml_screwcap/2.json b/shared-data/labware/definitions/3/opentrons_24_tuberack_nest_2ml_screwcap/2.json index 7b1ab858fe6..a66604fbb00 100644 --- a/shared-data/labware/definitions/3/opentrons_24_tuberack_nest_2ml_screwcap/2.json +++ b/shared-data/labware/definitions/3/opentrons_24_tuberack_nest_2ml_screwcap/2.json @@ -27,9 +27,9 @@ }, "wells": { "A1": { - "depth": 44.05, + "depth": 43.4, "shape": "circular", - "diameter": 8.69, + "diameter": 8.55, "totalLiquidVolume": 2000, "x": 18.21, "y": 75.43, @@ -37,9 +37,9 @@ "geometryDefinitionId": "conicalWell" }, "B1": { - "depth": 44.05, + "depth": 43.4, "shape": "circular", - "diameter": 8.69, + "diameter": 8.55, "totalLiquidVolume": 2000, "x": 18.21, "y": 56.15, @@ -47,9 +47,9 @@ "geometryDefinitionId": "conicalWell" }, "C1": { - "depth": 44.05, + "depth": 43.4, "shape": "circular", - "diameter": 8.69, + "diameter": 8.55, "totalLiquidVolume": 2000, "x": 18.21, "y": 36.87, @@ -57,9 +57,9 @@ "geometryDefinitionId": "conicalWell" }, "D1": { - "depth": 44.05, + "depth": 43.4, "shape": "circular", - "diameter": 8.69, + "diameter": 8.55, "totalLiquidVolume": 2000, "x": 18.21, "y": 17.59, @@ -67,9 +67,9 @@ "geometryDefinitionId": "conicalWell" }, "A2": { - "depth": 44.05, + "depth": 43.4, "shape": "circular", - "diameter": 8.69, + "diameter": 8.55, "totalLiquidVolume": 2000, "x": 38.1, "y": 75.43, @@ -77,9 +77,9 @@ "geometryDefinitionId": "conicalWell" }, "B2": { - "depth": 44.05, + "depth": 43.4, "shape": "circular", - "diameter": 8.69, + "diameter": 8.55, "totalLiquidVolume": 2000, "x": 38.1, "y": 56.15, @@ -87,9 +87,9 @@ "geometryDefinitionId": "conicalWell" }, "C2": { - "depth": 44.05, + "depth": 43.4, "shape": "circular", - "diameter": 8.69, + "diameter": 8.55, "totalLiquidVolume": 2000, "x": 38.1, "y": 36.87, @@ -97,9 +97,9 @@ "geometryDefinitionId": "conicalWell" }, "D2": { - "depth": 44.05, + "depth": 43.4, "shape": "circular", - "diameter": 8.69, + "diameter": 8.55, "totalLiquidVolume": 2000, "x": 38.1, "y": 17.59, @@ -107,9 +107,9 @@ "geometryDefinitionId": "conicalWell" }, "A3": { - "depth": 44.05, + "depth": 43.4, "shape": "circular", - "diameter": 8.69, + "diameter": 8.55, "totalLiquidVolume": 2000, "x": 57.99, "y": 75.43, @@ -117,9 +117,9 @@ "geometryDefinitionId": "conicalWell" }, "B3": { - "depth": 44.05, + "depth": 43.4, "shape": "circular", - "diameter": 8.69, + "diameter": 8.55, "totalLiquidVolume": 2000, "x": 57.99, "y": 56.15, @@ -127,9 +127,9 @@ "geometryDefinitionId": "conicalWell" }, "C3": { - "depth": 44.05, + "depth": 43.4, "shape": "circular", - "diameter": 8.69, + "diameter": 8.55, "totalLiquidVolume": 2000, "x": 57.99, "y": 36.87, @@ -137,9 +137,9 @@ "geometryDefinitionId": "conicalWell" }, "D3": { - "depth": 44.05, + "depth": 43.4, "shape": "circular", - "diameter": 8.69, + "diameter": 8.55, "totalLiquidVolume": 2000, "x": 57.99, "y": 17.59, @@ -147,9 +147,9 @@ "geometryDefinitionId": "conicalWell" }, "A4": { - "depth": 44.05, + "depth": 43.4, "shape": "circular", - "diameter": 8.69, + "diameter": 8.55, "totalLiquidVolume": 2000, "x": 77.88, "y": 75.43, @@ -157,9 +157,9 @@ "geometryDefinitionId": "conicalWell" }, "B4": { - "depth": 44.05, + "depth": 43.4, "shape": "circular", - "diameter": 8.69, + "diameter": 8.55, "totalLiquidVolume": 2000, "x": 77.88, "y": 56.15, @@ -167,9 +167,9 @@ "geometryDefinitionId": "conicalWell" }, "C4": { - "depth": 44.05, + "depth": 43.4, "shape": "circular", - "diameter": 8.69, + "diameter": 8.55, "totalLiquidVolume": 2000, "x": 77.88, "y": 36.87, @@ -177,9 +177,9 @@ "geometryDefinitionId": "conicalWell" }, "D4": { - "depth": 44.05, + "depth": 43.4, "shape": "circular", - "diameter": 8.69, + "diameter": 8.55, "totalLiquidVolume": 2000, "x": 77.88, "y": 17.59, @@ -187,9 +187,9 @@ "geometryDefinitionId": "conicalWell" }, "A5": { - "depth": 44.05, + "depth": 43.4, "shape": "circular", - "diameter": 8.69, + "diameter": 8.55, "totalLiquidVolume": 2000, "x": 97.77, "y": 75.43, @@ -197,9 +197,9 @@ "geometryDefinitionId": "conicalWell" }, "B5": { - "depth": 44.05, + "depth": 43.4, "shape": "circular", - "diameter": 8.69, + "diameter": 8.55, "totalLiquidVolume": 2000, "x": 97.77, "y": 56.15, @@ -207,9 +207,9 @@ "geometryDefinitionId": "conicalWell" }, "C5": { - "depth": 44.05, + "depth": 43.4, "shape": "circular", - "diameter": 8.69, + "diameter": 8.55, "totalLiquidVolume": 2000, "x": 97.77, "y": 36.87, @@ -217,9 +217,9 @@ "geometryDefinitionId": "conicalWell" }, "D5": { - "depth": 44.05, + "depth": 43.4, "shape": "circular", - "diameter": 8.69, + "diameter": 8.55, "totalLiquidVolume": 2000, "x": 97.77, "y": 17.59, @@ -227,9 +227,9 @@ "geometryDefinitionId": "conicalWell" }, "A6": { - "depth": 44.05, + "depth": 43.4, "shape": "circular", - "diameter": 8.69, + "diameter": 8.55, "totalLiquidVolume": 2000, "x": 117.66, "y": 75.43, @@ -237,9 +237,9 @@ "geometryDefinitionId": "conicalWell" }, "B6": { - "depth": 44.05, + "depth": 43.4, "shape": "circular", - "diameter": 8.69, + "diameter": 8.55, "totalLiquidVolume": 2000, "x": 117.66, "y": 56.15, @@ -247,9 +247,9 @@ "geometryDefinitionId": "conicalWell" }, "C6": { - "depth": 44.05, + "depth": 43.4, "shape": "circular", - "diameter": 8.69, + "diameter": 8.55, "totalLiquidVolume": 2000, "x": 117.66, "y": 36.87, @@ -257,9 +257,9 @@ "geometryDefinitionId": "conicalWell" }, "D6": { - "depth": 44.05, + "depth": 43.4, "shape": "circular", - "diameter": 8.69, + "diameter": 8.55, "totalLiquidVolume": 2000, "x": 117.66, "y": 17.59, diff --git a/shared-data/labware/definitions/3/opentrons_24_tuberack_nest_2ml_snapcap/2.json b/shared-data/labware/definitions/3/opentrons_24_tuberack_nest_2ml_snapcap/2.json index 7ae81c69e0c..3918d0c0c42 100644 --- a/shared-data/labware/definitions/3/opentrons_24_tuberack_nest_2ml_snapcap/2.json +++ b/shared-data/labware/definitions/3/opentrons_24_tuberack_nest_2ml_snapcap/2.json @@ -29,7 +29,7 @@ "A1": { "depth": 39.28, "shape": "circular", - "diameter": 10.18, + "diameter": 9.28, "totalLiquidVolume": 2000, "x": 18.21, "y": 75.43, @@ -39,7 +39,7 @@ "B1": { "depth": 39.28, "shape": "circular", - "diameter": 10.18, + "diameter": 9.28, "totalLiquidVolume": 2000, "x": 18.21, "y": 56.15, @@ -49,7 +49,7 @@ "C1": { "depth": 39.28, "shape": "circular", - "diameter": 10.18, + "diameter": 9.28, "totalLiquidVolume": 2000, "x": 18.21, "y": 36.87, @@ -59,7 +59,7 @@ "D1": { "depth": 39.28, "shape": "circular", - "diameter": 10.18, + "diameter": 9.28, "totalLiquidVolume": 2000, "x": 18.21, "y": 17.59, @@ -69,7 +69,7 @@ "A2": { "depth": 39.28, "shape": "circular", - "diameter": 10.18, + "diameter": 9.28, "totalLiquidVolume": 2000, "x": 38.1, "y": 75.43, @@ -79,7 +79,7 @@ "B2": { "depth": 39.28, "shape": "circular", - "diameter": 10.18, + "diameter": 9.28, "totalLiquidVolume": 2000, "x": 38.1, "y": 56.15, @@ -89,7 +89,7 @@ "C2": { "depth": 39.28, "shape": "circular", - "diameter": 10.18, + "diameter": 9.28, "totalLiquidVolume": 2000, "x": 38.1, "y": 36.87, @@ -99,7 +99,7 @@ "D2": { "depth": 39.28, "shape": "circular", - "diameter": 10.18, + "diameter": 9.28, "totalLiquidVolume": 2000, "x": 38.1, "y": 17.59, @@ -109,7 +109,7 @@ "A3": { "depth": 39.28, "shape": "circular", - "diameter": 10.18, + "diameter": 9.28, "totalLiquidVolume": 2000, "x": 57.99, "y": 75.43, @@ -119,7 +119,7 @@ "B3": { "depth": 39.28, "shape": "circular", - "diameter": 10.18, + "diameter": 9.28, "totalLiquidVolume": 2000, "x": 57.99, "y": 56.15, @@ -129,7 +129,7 @@ "C3": { "depth": 39.28, "shape": "circular", - "diameter": 10.18, + "diameter": 9.28, "totalLiquidVolume": 2000, "x": 57.99, "y": 36.87, @@ -139,7 +139,7 @@ "D3": { "depth": 39.28, "shape": "circular", - "diameter": 10.18, + "diameter": 9.28, "totalLiquidVolume": 2000, "x": 57.99, "y": 17.59, @@ -149,7 +149,7 @@ "A4": { "depth": 39.28, "shape": "circular", - "diameter": 10.18, + "diameter": 9.28, "totalLiquidVolume": 2000, "x": 77.88, "y": 75.43, @@ -159,7 +159,7 @@ "B4": { "depth": 39.28, "shape": "circular", - "diameter": 10.18, + "diameter": 9.28, "totalLiquidVolume": 2000, "x": 77.88, "y": 56.15, @@ -169,7 +169,7 @@ "C4": { "depth": 39.28, "shape": "circular", - "diameter": 10.18, + "diameter": 9.28, "totalLiquidVolume": 2000, "x": 77.88, "y": 36.87, @@ -179,7 +179,7 @@ "D4": { "depth": 39.28, "shape": "circular", - "diameter": 10.18, + "diameter": 9.28, "totalLiquidVolume": 2000, "x": 77.88, "y": 17.59, @@ -189,7 +189,7 @@ "A5": { "depth": 39.28, "shape": "circular", - "diameter": 10.18, + "diameter": 9.28, "totalLiquidVolume": 2000, "x": 97.77, "y": 75.43, @@ -199,7 +199,7 @@ "B5": { "depth": 39.28, "shape": "circular", - "diameter": 10.18, + "diameter": 9.28, "totalLiquidVolume": 2000, "x": 97.77, "y": 56.15, @@ -209,7 +209,7 @@ "C5": { "depth": 39.28, "shape": "circular", - "diameter": 10.18, + "diameter": 9.28, "totalLiquidVolume": 2000, "x": 97.77, "y": 36.87, @@ -219,7 +219,7 @@ "D5": { "depth": 39.28, "shape": "circular", - "diameter": 10.18, + "diameter": 9.28, "totalLiquidVolume": 2000, "x": 97.77, "y": 17.59, @@ -229,7 +229,7 @@ "A6": { "depth": 39.28, "shape": "circular", - "diameter": 10.18, + "diameter": 9.28, "totalLiquidVolume": 2000, "x": 117.66, "y": 75.43, @@ -239,7 +239,7 @@ "B6": { "depth": 39.28, "shape": "circular", - "diameter": 10.18, + "diameter": 9.28, "totalLiquidVolume": 2000, "x": 117.66, "y": 56.15, @@ -249,7 +249,7 @@ "C6": { "depth": 39.28, "shape": "circular", - "diameter": 10.18, + "diameter": 9.28, "totalLiquidVolume": 2000, "x": 117.66, "y": 36.87, @@ -259,7 +259,7 @@ "D6": { "depth": 39.28, "shape": "circular", - "diameter": 10.18, + "diameter": 9.28, "totalLiquidVolume": 2000, "x": 117.66, "y": 17.59, @@ -362,11 +362,18 @@ }, { "shape": "conical", - "topDiameter": 8.9, + "topDiameter": 8.74, "bottomDiameter": 8.0, - "topHeight": 15.04, + "topHeight": 6.26, "bottomHeight": 3.98 }, + { + "shape": "conical", + "topDiameter": 8.9, + "bottomDiameter": 8.74, + "topHeight": 15.04, + "bottomHeight": 6.26 + }, { "shape": "conical", "topDiameter": 9.28, diff --git a/shared-data/labware/definitions/3/usascientific_12_reservoir_22ml/2.json b/shared-data/labware/definitions/3/usascientific_12_reservoir_22ml/2.json index d17d27c041a..bbc013e5d09 100644 --- a/shared-data/labware/definitions/3/usascientific_12_reservoir_22ml/2.json +++ b/shared-data/labware/definitions/3/usascientific_12_reservoir_22ml/2.json @@ -37,7 +37,7 @@ "wells": { "A1": { "shape": "rectangular", - "depth": 42.16, + "depth": 41.75, "xDimension": 8.33, "yDimension": 71.88, "totalLiquidVolume": 22000, @@ -48,7 +48,7 @@ }, "A2": { "shape": "rectangular", - "depth": 42.16, + "depth": 41.75, "xDimension": 8.33, "yDimension": 71.88, "totalLiquidVolume": 22000, @@ -59,7 +59,7 @@ }, "A3": { "shape": "rectangular", - "depth": 42.16, + "depth": 41.75, "xDimension": 8.33, "yDimension": 71.88, "totalLiquidVolume": 22000, @@ -70,7 +70,7 @@ }, "A4": { "shape": "rectangular", - "depth": 42.16, + "depth": 41.75, "xDimension": 8.33, "yDimension": 71.88, "totalLiquidVolume": 22000, @@ -81,7 +81,7 @@ }, "A5": { "shape": "rectangular", - "depth": 42.16, + "depth": 41.75, "xDimension": 8.33, "yDimension": 71.88, "totalLiquidVolume": 22000, @@ -92,7 +92,7 @@ }, "A6": { "shape": "rectangular", - "depth": 42.16, + "depth": 41.75, "xDimension": 8.33, "yDimension": 71.88, "totalLiquidVolume": 22000, @@ -103,7 +103,7 @@ }, "A7": { "shape": "rectangular", - "depth": 42.16, + "depth": 41.75, "xDimension": 8.33, "yDimension": 71.88, "totalLiquidVolume": 22000, @@ -114,7 +114,7 @@ }, "A8": { "shape": "rectangular", - "depth": 42.16, + "depth": 41.75, "xDimension": 8.33, "yDimension": 71.88, "totalLiquidVolume": 22000, @@ -125,7 +125,7 @@ }, "A9": { "shape": "rectangular", - "depth": 42.16, + "depth": 41.75, "xDimension": 8.33, "yDimension": 71.88, "totalLiquidVolume": 22000, @@ -136,7 +136,7 @@ }, "A10": { "shape": "rectangular", - "depth": 42.16, + "depth": 41.75, "xDimension": 8.33, "yDimension": 71.88, "totalLiquidVolume": 22000, @@ -147,7 +147,7 @@ }, "A11": { "shape": "rectangular", - "depth": 42.16, + "depth": 41.75, "xDimension": 8.33, "yDimension": 71.88, "totalLiquidVolume": 22000, @@ -158,7 +158,7 @@ }, "A12": { "shape": "rectangular", - "depth": 42.16, + "depth": 41.75, "xDimension": 8.33, "yDimension": 71.88, "totalLiquidVolume": 22000, @@ -204,24 +204,32 @@ "innerLabwareGeometry": { "cuboidalWell": { "sections": [ + { + "shape": "spherical", + "radiusOfCurvature": 1.5362, + "topHeight": 0.25, + "bottomHeight": 0.0, + "yCount": 8 + }, { "shape": "squaredcone", "bottomCrossSection": "circular", - "circleDiameter": 2.5, - "rectangleXDimension": 7.98, - "rectangleYDimension": 70.98, - "topHeight": 4.05, - "bottomHeight": 0.0, + "circleDiameter": 1.68, + "rectangleXDimension": 7.9, + "rectangleYDimension": 7.9, + "topHeight": 4.0, + "bottomHeight": 0.25, + "xCount": 1, "yCount": 8 }, { "shape": "cuboidal", "topXDimension": 8.34, "topYDimension": 71.85, - "bottomXDimension": 7.98, - "bottomYDimension": 70.98, + "bottomXDimension": 7.9, + "bottomYDimension": 71.75, "topHeight": 41.75, - "bottomHeight": 4.05 + "bottomHeight": 4.0 } ] } diff --git a/shared-data/labware/definitions/3/usascientific_96_wellplate_2.4ml_deep/2.json b/shared-data/labware/definitions/3/usascientific_96_wellplate_2.4ml_deep/2.json index d9741e18c57..d7011a4920e 100644 --- a/shared-data/labware/definitions/3/usascientific_96_wellplate_2.4ml_deep/2.json +++ b/shared-data/labware/definitions/3/usascientific_96_wellplate_2.4ml_deep/2.json @@ -1211,7 +1211,26 @@ }, "innerLabwareGeometry": { "cuboidalWell": { - "sections": [] + "sections": [ + { + "shape": "cuboidal", + "topXDimension": 7.52, + "topYDimension": 7.52, + "bottomXDimension": 0.25, + "bottomYDimension": 0.25, + "topHeight": 2.63, + "bottomHeight": 0.0 + }, + { + "shape": "cuboidal", + "topXDimension": 8.2, + "topYDimension": 8.2, + "bottomXDimension": 7.52, + "bottomYDimension": 7.52, + "topHeight": 41.3, + "bottomHeight": 2.63 + } + ] } } } diff --git a/shared-data/python/opentrons_shared_data/labware/labware_definition.py b/shared-data/python/opentrons_shared_data/labware/labware_definition.py index c25f37962c1..57f86016de5 100644 --- a/shared-data/python/opentrons_shared_data/labware/labware_definition.py +++ b/shared-data/python/opentrons_shared_data/labware/labware_definition.py @@ -299,6 +299,30 @@ class ConicalFrustum(BaseModel): description="Number of instances of this shape in the stackup, used for wells that have multiple sub-wells", ) + @cached_property + def height_to_volume_table(self) -> Dict[float, float]: + """Return a lookup table of heights to volumes.""" + # the accuracy of this method is approximately +- 10*dx so for dx of 0.001 we have a +- 0.01 ul + dx = 0.005 + total_height = self.topHeight - self.bottomHeight + y = 0.0 + table: Dict[float, float] = {} + # fill in the table + a = self.topDiameter / 2 + b = self.bottomDiameter / 2 + while y < total_height: + r_y = (y / total_height) * (a - b) + b + table[y] = (pi * y / 3) * (b**2 + b * r_y + r_y**2) + y = y + dx + + # we always want to include the volume at the max height + table[total_height] = (pi * total_height / 3) * (b**2 + a * b + a**2) + return table + + @cached_property + def volume_to_height_table(self) -> Dict[float, float]: + return dict((v, k) for k, v in self.height_to_volume_table.items()) + @cached_property def count(self) -> int: return self.xCount * self.yCount From f54a1937b09e4975449f09380b362470d6570c16 Mon Sep 17 00:00:00 2001 From: TamarZanzouri Date: Tue, 28 Jan 2025 14:52:50 -0500 Subject: [PATCH 033/150] fix(api):show plate reader files in run log (#17369) --- .../protocol_engine/commands/absorbance_reader/read.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/api/src/opentrons/protocol_engine/commands/absorbance_reader/read.py b/api/src/opentrons/protocol_engine/commands/absorbance_reader/read.py index fc230d1dee9..a4a3aa58a5e 100644 --- a/api/src/opentrons/protocol_engine/commands/absorbance_reader/read.py +++ b/api/src/opentrons/protocol_engine/commands/absorbance_reader/read.py @@ -182,6 +182,9 @@ async def execute( # noqa: C901 ) file_ids.append(file_id) + state_update.files_added = update_types.FilesAddedUpdate( + file_ids=file_ids + ) # Return success data to api return SuccessData( public=ReadAbsorbanceResult( From c048e5bdd6c980846d32d0f7726b40ffc29e61d1 Mon Sep 17 00:00:00 2001 From: Laura Cox <31892318+Laura-Danielle@users.noreply.github.com> Date: Tue, 28 Jan 2025 14:17:40 -0600 Subject: [PATCH 034/150] feat(shared-data, api): Add evo tips definition and restrictions on loading (#17237) Add evo tip adapter and evo tips labware definition but as a labware so that liquid handling actions can happen in the 'labware'. --- ...[pl_BacteriaInoculation_Flex_6plates].json | 5 + ...03a95825][Flex_S_v2_19_QIASeq_FX_48x].json | 5 + ...][Flex_S_v2_18_Illumina_DNA_Prep_48x].json | 5 + ..._EM_seq_48Samples_AllSteps_Edits_150].json | 10 + ...llumina_Stranded_total_RNA_Ribo_Zero].json | 5 + ...0fccf4][pl_microBioID_beads_touchtip].json | 5 + ...l_Dynabeads_IP_Flex_96well_RIT_final].json | 10 + ...c080][pl_MagMax_RNA_Cells_Flex_multi].json | 5 + ..._Omega_HDQ_DNA_Cells_Flex_96_channel].json | 25 + ...7961bc58][pl_NiNTA_Flex_96well_final].json | 25 + ...9][pl_Omega_HDQ_DNA_Cells_Flex_multi].json | 5 + ...pl_Omega_HDQ_DNA_Bacteria_Flex_multi].json | 5 + ...2bc6830494][pl_langone_ribo_pt1_ramp].json | 5 + ...TC_TM_TriggerPrepareForMountMovement].json | 5 + ...f][pl_Dynabeads_IP_Flex_96well_final].json | 10 + ...shot[4148613317][Flex_S_v2_19_ligseq].json | 5 + ...apshot[42beea80be][pl_96_ch_demo_rtp].json | 10 + ...50c02c81][Flex_S_v2_19_AMPure_XP_48x].json | 5 + ...][pl_Zymo_Quick_RNA_Cells_Flex_multi].json | 5 + ...][Flex_S_v2_19_Illumina_DNA_Prep_48x].json | 5 + ...shot[59b00713a7][Flex_S_v2_18_ligseq].json | 5 + ...ega_HDQ_DNA_Bacteria_Flex_96_channel].json | 35 + ...b47][pl_M_N_Nucleomag_DNA_Flex_multi].json | 5 + ...96_GRIP_HS_MB_TM_MagMaxRNAExtraction].json | 25 + ..._HS_TM_MB_TC_IlluminaDNAEnrichmentV4].json | 5 + ...[pl_SamplePrep_MS_Digest_Flex_upto96].json | 5 + ...e61426a2][Flex_S_v2_18_AMPure_XP_48x].json | 5 + ..._QIAseq_FX_24x_Normalizer_Workflow_B].json | 5 + ...84cbc4][Flex_S_v2_18_IDT_xGen_EZ_48x].json | 5 + ...Zymo_Quick_RNA_Cells_Flex_96_Channel].json | 35 + ...pl_NiNTA_Flex_96well_PlatePrep_final].json | 20 + ...747b2f9][pl_Illumina_DNA_Prep_48x_v8].json | 5 + ..._TM_MB_OmegaHDQDNAExtractionBacteria].json | 35 + ...pl_SamplePrep_MS_Cleanup_Flex_upto96].json | 10 + ...][Flex_S_v2_19_Illumina_DNA_PCR_Free].json | 5 + ...37534569][Flex_S_v2_19_kapahyperplus].json | 5 + ...l_Nanopore_Genomic_Ligation_v5_Final].json | 5 + ...4d3b3a2d3][pl_96_ch_demo_rtp_with_hs].json | 10 + ...a8a5ad823d][pl_cherrypicking_flex_v3].json | 5 + ...4f22054f][Flex_S_v2_18_kapahyperplus].json | 5 + ..._snapshot[aa61eee0bf][pl_sigdx_part2].json | 15 + ...shot[ac5a46e74b][pl_langone_pt2_ribo].json | 5 + ...6_GRIP_HS_MB_TC_TM_IDTXgen96Part1to3].json | 20 + ...llumina_Stranded_total_RNA_Ribo_Zero].json | 5 + ...[pl_MagMax_RNA_Cells_Flex_96_Channel].json | 30 + ...d2ca0089][Flex_S_v2_18_QIASeq_FX_48x].json | 5 + ...pl_Zymo_Magbead_DNA_Cells_Flex_multi].json | 5 + ...shot[d29d74d7fb][pl_QIASeq_FX_48x_v8].json | 5 + ...oMagbeadRNAExtractionCellsOrBacteria].json | 35 + ...mo_Magbead_DNA_Cells_Flex_96_channel].json | 35 + ...39e6a3][Flex_S_v2_19_IDT_xGen_EZ_48x].json | 5 + ...shot[d6389183c0][pl_AMPure_XP_48x_v8].json | 5 + ...1][pl_Hyperplus_tiptracking_V4_final].json | 5 + ...tranded_total_RNA_Ribo_Zero_protocol].json | 5 + ...][Flex_S_v2_18_Illumina_DNA_PCR_Free].json | 5 + ...e71b031f47][pl_Illumina_DNA_PCR_Free].json | 5 + ...P_HS_MB_TC_TM_IlluminaDNAPrep96PART3].json | 20 + .../protocol_engine/commands/load_labware.py | 5 + .../protocol_engine/commands/move_labware.py | 9 + .../protocol_engine/errors/__init__.py | 2 + .../protocol_engine/errors/exceptions.py | 13 + .../resources/labware_validation.py | 8 + .../protocol_engine/state/labware.py | 13 + .../ODD/QuickTransferFlow/constants.ts | 3 + .../js/__tests__/labwareDefQuirks.test.ts | 1 + shared-data/js/labware.ts | 6 + .../2/nest_96_wellplate_2ml_deep/2.json | 5 + .../3/evotips_flex_96_tiprack_adapter/1.json | 41 + .../3/evotips_opentrons_96_labware/1.json | 1045 +++++++++++++++++ 69 files changed, 1756 insertions(+) create mode 100644 shared-data/labware/definitions/3/evotips_flex_96_tiprack_adapter/1.json create mode 100644 shared-data/labware/definitions/3/evotips_opentrons_96_labware/1.json diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[00574c503f][pl_BacteriaInoculation_Flex_6plates].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[00574c503f][pl_BacteriaInoculation_Flex_6plates].json index 0a408e946c3..0cf14e731b6 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[00574c503f][pl_BacteriaInoculation_Flex_6plates].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[00574c503f][pl_BacteriaInoculation_Flex_6plates].json @@ -982,6 +982,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0903a95825][Flex_S_v2_19_QIASeq_FX_48x].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0903a95825][Flex_S_v2_19_QIASeq_FX_48x].json index a7e09aba292..fccf2aae96c 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0903a95825][Flex_S_v2_19_QIASeq_FX_48x].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0903a95825][Flex_S_v2_19_QIASeq_FX_48x].json @@ -5144,6 +5144,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0a9ef592c8][Flex_S_v2_18_Illumina_DNA_Prep_48x].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0a9ef592c8][Flex_S_v2_18_Illumina_DNA_Prep_48x].json index 705c9658155..b49eaeb6609 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0a9ef592c8][Flex_S_v2_18_Illumina_DNA_Prep_48x].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0a9ef592c8][Flex_S_v2_18_Illumina_DNA_Prep_48x].json @@ -5205,6 +5205,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0dd21c0ee5][pl_EM_seq_48Samples_AllSteps_Edits_150].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0dd21c0ee5][pl_EM_seq_48Samples_AllSteps_Edits_150].json index b964f2a7367..c407d673c2b 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0dd21c0ee5][pl_EM_seq_48Samples_AllSteps_Edits_150].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0dd21c0ee5][pl_EM_seq_48Samples_AllSteps_Edits_150].json @@ -8631,6 +8631,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -9909,6 +9914,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[13ec753045][Flex_S_v2_18_Illumina_Stranded_total_RNA_Ribo_Zero].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[13ec753045][Flex_S_v2_18_Illumina_Stranded_total_RNA_Ribo_Zero].json index 087cbb927b9..8701aae97bc 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[13ec753045][Flex_S_v2_18_Illumina_Stranded_total_RNA_Ribo_Zero].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[13ec753045][Flex_S_v2_18_Illumina_Stranded_total_RNA_Ribo_Zero].json @@ -3283,6 +3283,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[15a60fccf4][pl_microBioID_beads_touchtip].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[15a60fccf4][pl_microBioID_beads_touchtip].json index 6b7d81ff805..0363b1ca1df 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[15a60fccf4][pl_microBioID_beads_touchtip].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[15a60fccf4][pl_microBioID_beads_touchtip].json @@ -3576,6 +3576,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[1b73b8a126][pl_Dynabeads_IP_Flex_96well_RIT_final].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[1b73b8a126][pl_Dynabeads_IP_Flex_96well_RIT_final].json index 29df1897867..a084faeeb15 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[1b73b8a126][pl_Dynabeads_IP_Flex_96well_RIT_final].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[1b73b8a126][pl_Dynabeads_IP_Flex_96well_RIT_final].json @@ -305,6 +305,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -6222,6 +6227,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[1d37cbc080][pl_MagMax_RNA_Cells_Flex_multi].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[1d37cbc080][pl_MagMax_RNA_Cells_Flex_multi].json index 03bb82c7b3c..7d89bcbae0c 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[1d37cbc080][pl_MagMax_RNA_Cells_Flex_multi].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[1d37cbc080][pl_MagMax_RNA_Cells_Flex_multi].json @@ -829,6 +829,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[248a2a3107][pl_Omega_HDQ_DNA_Cells_Flex_96_channel].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[248a2a3107][pl_Omega_HDQ_DNA_Cells_Flex_96_channel].json index 427cd1c997b..38d0810f4ad 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[248a2a3107][pl_Omega_HDQ_DNA_Cells_Flex_96_channel].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[248a2a3107][pl_Omega_HDQ_DNA_Cells_Flex_96_channel].json @@ -829,6 +829,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -5067,6 +5072,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -9802,6 +9812,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -14537,6 +14552,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -17544,6 +17564,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[277961bc58][pl_NiNTA_Flex_96well_final].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[277961bc58][pl_NiNTA_Flex_96well_final].json index 7602c8613f4..64cec1732c3 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[277961bc58][pl_NiNTA_Flex_96well_final].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[277961bc58][pl_NiNTA_Flex_96well_final].json @@ -305,6 +305,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -1584,6 +1589,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -2863,6 +2873,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -4142,6 +4157,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -8375,6 +8395,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[28fdeebdd9][pl_Omega_HDQ_DNA_Cells_Flex_multi].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[28fdeebdd9][pl_Omega_HDQ_DNA_Cells_Flex_multi].json index 1598272fc5c..936161f35e0 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[28fdeebdd9][pl_Omega_HDQ_DNA_Cells_Flex_multi].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[28fdeebdd9][pl_Omega_HDQ_DNA_Cells_Flex_multi].json @@ -829,6 +829,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[29bb5df52d][pl_Omega_HDQ_DNA_Bacteria_Flex_multi].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[29bb5df52d][pl_Omega_HDQ_DNA_Bacteria_Flex_multi].json index d6a2126b774..bce6b1bfc5c 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[29bb5df52d][pl_Omega_HDQ_DNA_Bacteria_Flex_multi].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[29bb5df52d][pl_Omega_HDQ_DNA_Bacteria_Flex_multi].json @@ -829,6 +829,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2bc6830494][pl_langone_ribo_pt1_ramp].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2bc6830494][pl_langone_ribo_pt1_ramp].json index 103852d1fad..cbbda041874 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2bc6830494][pl_langone_ribo_pt1_ramp].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2bc6830494][pl_langone_ribo_pt1_ramp].json @@ -4454,6 +4454,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2eaf98de6a][Flex_S_v2_16_P1000_96_GRIP_HS_MB_TC_TM_TriggerPrepareForMountMovement].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2eaf98de6a][Flex_S_v2_16_P1000_96_GRIP_HS_MB_TC_TM_TriggerPrepareForMountMovement].json index 527f7681c11..cade2906ff1 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2eaf98de6a][Flex_S_v2_16_P1000_96_GRIP_HS_MB_TC_TM_TriggerPrepareForMountMovement].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2eaf98de6a][Flex_S_v2_16_P1000_96_GRIP_HS_MB_TC_TM_TriggerPrepareForMountMovement].json @@ -3757,6 +3757,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[3a039d726f][pl_Dynabeads_IP_Flex_96well_final].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[3a039d726f][pl_Dynabeads_IP_Flex_96well_final].json index 67b6613beee..b38642d42ac 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[3a039d726f][pl_Dynabeads_IP_Flex_96well_final].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[3a039d726f][pl_Dynabeads_IP_Flex_96well_final].json @@ -305,6 +305,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -6191,6 +6196,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[4148613317][Flex_S_v2_19_ligseq].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[4148613317][Flex_S_v2_19_ligseq].json index c25eab4039e..be83efdb3d1 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[4148613317][Flex_S_v2_19_ligseq].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[4148613317][Flex_S_v2_19_ligseq].json @@ -2423,6 +2423,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[42beea80be][pl_96_ch_demo_rtp].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[42beea80be][pl_96_ch_demo_rtp].json index d01d2417596..42f66954c50 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[42beea80be][pl_96_ch_demo_rtp].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[42beea80be][pl_96_ch_demo_rtp].json @@ -3986,6 +3986,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -5265,6 +5270,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[4f50c02c81][Flex_S_v2_19_AMPure_XP_48x].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[4f50c02c81][Flex_S_v2_19_AMPure_XP_48x].json index 953bf5c133d..01407d2b421 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[4f50c02c81][Flex_S_v2_19_AMPure_XP_48x].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[4f50c02c81][Flex_S_v2_19_AMPure_XP_48x].json @@ -4032,6 +4032,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[50d7be4518][pl_Zymo_Quick_RNA_Cells_Flex_multi].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[50d7be4518][pl_Zymo_Quick_RNA_Cells_Flex_multi].json index c22754f270b..00eb89d9c69 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[50d7be4518][pl_Zymo_Quick_RNA_Cells_Flex_multi].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[50d7be4518][pl_Zymo_Quick_RNA_Cells_Flex_multi].json @@ -829,6 +829,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[555b2fff00][Flex_S_v2_19_Illumina_DNA_Prep_48x].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[555b2fff00][Flex_S_v2_19_Illumina_DNA_Prep_48x].json index 10732760f7a..22587a32c81 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[555b2fff00][Flex_S_v2_19_Illumina_DNA_Prep_48x].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[555b2fff00][Flex_S_v2_19_Illumina_DNA_Prep_48x].json @@ -5205,6 +5205,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[59b00713a7][Flex_S_v2_18_ligseq].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[59b00713a7][Flex_S_v2_18_ligseq].json index 17c3ea8b6a4..737dc286bb5 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[59b00713a7][Flex_S_v2_18_ligseq].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[59b00713a7][Flex_S_v2_18_ligseq].json @@ -2423,6 +2423,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[5c57add326][pl_Omega_HDQ_DNA_Bacteria_Flex_96_channel].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[5c57add326][pl_Omega_HDQ_DNA_Bacteria_Flex_96_channel].json index 00ec976bea7..026a1474062 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[5c57add326][pl_Omega_HDQ_DNA_Bacteria_Flex_96_channel].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[5c57add326][pl_Omega_HDQ_DNA_Bacteria_Flex_96_channel].json @@ -829,6 +829,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -2108,6 +2113,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -7979,6 +7989,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -12714,6 +12729,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -15721,6 +15741,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -18728,6 +18753,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -21735,6 +21765,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[63ea171b47][pl_M_N_Nucleomag_DNA_Flex_multi].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[63ea171b47][pl_M_N_Nucleomag_DNA_Flex_multi].json index 36c77e37312..4b86c4eccdc 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[63ea171b47][pl_M_N_Nucleomag_DNA_Flex_multi].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[63ea171b47][pl_M_N_Nucleomag_DNA_Flex_multi].json @@ -829,6 +829,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6e34343cfc][Flex_S_v2_15_P1000_96_GRIP_HS_MB_TM_MagMaxRNAExtraction].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6e34343cfc][Flex_S_v2_15_P1000_96_GRIP_HS_MB_TM_MagMaxRNAExtraction].json index 729e4b265eb..5bb400f3266 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6e34343cfc][Flex_S_v2_15_P1000_96_GRIP_HS_MB_TM_MagMaxRNAExtraction].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6e34343cfc][Flex_S_v2_15_P1000_96_GRIP_HS_MB_TM_MagMaxRNAExtraction].json @@ -761,6 +761,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -2039,6 +2044,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -5017,6 +5027,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -6295,6 +6310,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -7573,6 +7593,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6f246e1cd8][Flex_S_2_18_P1000M_P50M_GRIP_HS_TM_MB_TC_IlluminaDNAEnrichmentV4].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6f246e1cd8][Flex_S_2_18_P1000M_P50M_GRIP_HS_TM_MB_TC_IlluminaDNAEnrichmentV4].json index b2975565a97..a6b46f54c00 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6f246e1cd8][Flex_S_2_18_P1000M_P50M_GRIP_HS_TM_MB_TC_IlluminaDNAEnrichmentV4].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6f246e1cd8][Flex_S_2_18_P1000M_P50M_GRIP_HS_TM_MB_TC_IlluminaDNAEnrichmentV4].json @@ -1946,6 +1946,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[70b873c24b][pl_SamplePrep_MS_Digest_Flex_upto96].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[70b873c24b][pl_SamplePrep_MS_Digest_Flex_upto96].json index c62ce072bd9..9afcc19539c 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[70b873c24b][pl_SamplePrep_MS_Digest_Flex_upto96].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[70b873c24b][pl_SamplePrep_MS_Digest_Flex_upto96].json @@ -1600,6 +1600,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[79e61426a2][Flex_S_v2_18_AMPure_XP_48x].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[79e61426a2][Flex_S_v2_18_AMPure_XP_48x].json index ae9a44679de..744032008ce 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[79e61426a2][Flex_S_v2_18_AMPure_XP_48x].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[79e61426a2][Flex_S_v2_18_AMPure_XP_48x].json @@ -4032,6 +4032,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[7ebefe4580][pl_QIAseq_FX_24x_Normalizer_Workflow_B].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[7ebefe4580][pl_QIAseq_FX_24x_Normalizer_Workflow_B].json index 62f2ce5038d..c567c61d095 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[7ebefe4580][pl_QIAseq_FX_24x_Normalizer_Workflow_B].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[7ebefe4580][pl_QIAseq_FX_24x_Normalizer_Workflow_B].json @@ -857,6 +857,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[84f684cbc4][Flex_S_v2_18_IDT_xGen_EZ_48x].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[84f684cbc4][Flex_S_v2_18_IDT_xGen_EZ_48x].json index edafb62c064..b4e7172cb6c 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[84f684cbc4][Flex_S_v2_18_IDT_xGen_EZ_48x].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[84f684cbc4][Flex_S_v2_18_IDT_xGen_EZ_48x].json @@ -5144,6 +5144,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[88abcfdbca][pl_Zymo_Quick_RNA_Cells_Flex_96_Channel].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[88abcfdbca][pl_Zymo_Quick_RNA_Cells_Flex_96_Channel].json index 080564645c6..d929f2211bb 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[88abcfdbca][pl_Zymo_Quick_RNA_Cells_Flex_96_Channel].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[88abcfdbca][pl_Zymo_Quick_RNA_Cells_Flex_96_Channel].json @@ -829,6 +829,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -6714,6 +6719,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -9721,6 +9731,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -14456,6 +14471,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -17463,6 +17483,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -20470,6 +20495,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -26384,6 +26414,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[8e1f35ed6c][pl_NiNTA_Flex_96well_PlatePrep_final].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[8e1f35ed6c][pl_NiNTA_Flex_96well_PlatePrep_final].json index 37e82771ce7..23a738dea13 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[8e1f35ed6c][pl_NiNTA_Flex_96well_PlatePrep_final].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[8e1f35ed6c][pl_NiNTA_Flex_96well_PlatePrep_final].json @@ -305,6 +305,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -1584,6 +1589,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -2863,6 +2873,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -5195,6 +5210,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[918747b2f9][pl_Illumina_DNA_Prep_48x_v8].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[918747b2f9][pl_Illumina_DNA_Prep_48x_v8].json index 7215d1d2813..4e22ae14eb6 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[918747b2f9][pl_Illumina_DNA_Prep_48x_v8].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[918747b2f9][pl_Illumina_DNA_Prep_48x_v8].json @@ -5205,6 +5205,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[95da6fbef2][Flex_S_2_15_P1000M_GRIP_HS_TM_MB_OmegaHDQDNAExtractionBacteria].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[95da6fbef2][Flex_S_2_15_P1000M_GRIP_HS_TM_MB_OmegaHDQDNAExtractionBacteria].json index 3dc6df75eb5..27170407315 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[95da6fbef2][Flex_S_2_15_P1000M_GRIP_HS_TM_MB_OmegaHDQDNAExtractionBacteria].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[95da6fbef2][Flex_S_2_15_P1000M_GRIP_HS_TM_MB_OmegaHDQDNAExtractionBacteria].json @@ -829,6 +829,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -2108,6 +2113,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -6251,6 +6261,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -7530,6 +7545,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -8809,6 +8829,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -10088,6 +10113,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -11367,6 +11397,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a0dad2eb8e][pl_SamplePrep_MS_Cleanup_Flex_upto96].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a0dad2eb8e][pl_SamplePrep_MS_Cleanup_Flex_upto96].json index 65c642d5802..a42786e59e3 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a0dad2eb8e][pl_SamplePrep_MS_Cleanup_Flex_upto96].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a0dad2eb8e][pl_SamplePrep_MS_Cleanup_Flex_upto96].json @@ -2124,6 +2124,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -3652,6 +3657,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a3dfca7f0c][Flex_S_v2_19_Illumina_DNA_PCR_Free].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a3dfca7f0c][Flex_S_v2_19_Illumina_DNA_PCR_Free].json index 6b9ce6ed6d2..6da5b62e4ec 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a3dfca7f0c][Flex_S_v2_19_Illumina_DNA_PCR_Free].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a3dfca7f0c][Flex_S_v2_19_Illumina_DNA_PCR_Free].json @@ -6158,6 +6158,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a437534569][Flex_S_v2_19_kapahyperplus].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a437534569][Flex_S_v2_19_kapahyperplus].json index 17c5183316b..814c874d188 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a437534569][Flex_S_v2_19_kapahyperplus].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a437534569][Flex_S_v2_19_kapahyperplus].json @@ -6866,6 +6866,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a46928c103][pl_Nanopore_Genomic_Ligation_v5_Final].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a46928c103][pl_Nanopore_Genomic_Ligation_v5_Final].json index f022770ef34..8faa3209168 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a46928c103][pl_Nanopore_Genomic_Ligation_v5_Final].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a46928c103][pl_Nanopore_Genomic_Ligation_v5_Final].json @@ -2423,6 +2423,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a4d3b3a2d3][pl_96_ch_demo_rtp_with_hs].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a4d3b3a2d3][pl_96_ch_demo_rtp_with_hs].json index cb8b6964316..0c84054c2ff 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a4d3b3a2d3][pl_96_ch_demo_rtp_with_hs].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a4d3b3a2d3][pl_96_ch_demo_rtp_with_hs].json @@ -4524,6 +4524,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -5803,6 +5808,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a8a5ad823d][pl_cherrypicking_flex_v3].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a8a5ad823d][pl_cherrypicking_flex_v3].json index 335d8570804..9be279fa95e 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a8a5ad823d][pl_cherrypicking_flex_v3].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a8a5ad823d][pl_cherrypicking_flex_v3].json @@ -1816,6 +1816,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a94f22054f][Flex_S_v2_18_kapahyperplus].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a94f22054f][Flex_S_v2_18_kapahyperplus].json index e2cf7a80abc..784df7d0aa1 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a94f22054f][Flex_S_v2_18_kapahyperplus].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a94f22054f][Flex_S_v2_18_kapahyperplus].json @@ -6866,6 +6866,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[aa61eee0bf][pl_sigdx_part2].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[aa61eee0bf][pl_sigdx_part2].json index d9080b06e23..6c5410c683b 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[aa61eee0bf][pl_sigdx_part2].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[aa61eee0bf][pl_sigdx_part2].json @@ -763,6 +763,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -2623,6 +2628,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -3901,6 +3911,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[ac5a46e74b][pl_langone_pt2_ribo].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[ac5a46e74b][pl_langone_pt2_ribo].json index 6f5fe499523..f4bafb81e72 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[ac5a46e74b][pl_langone_pt2_ribo].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[ac5a46e74b][pl_langone_pt2_ribo].json @@ -8494,6 +8494,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[ac886d7768][Flex_S_v2_15_P1000_96_GRIP_HS_MB_TC_TM_IDTXgen96Part1to3].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[ac886d7768][Flex_S_v2_15_P1000_96_GRIP_HS_MB_TC_TM_IDTXgen96Part1to3].json index 3436029e76b..b5cf2f13f52 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[ac886d7768][Flex_S_v2_15_P1000_96_GRIP_HS_MB_TC_TM_IDTXgen96Part1to3].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[ac886d7768][Flex_S_v2_15_P1000_96_GRIP_HS_MB_TC_TM_IDTXgen96Part1to3].json @@ -1506,6 +1506,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -4019,6 +4024,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -7698,6 +7708,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -10203,6 +10218,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[b777168ac1][Flex_S_v2_19_Illumina_Stranded_total_RNA_Ribo_Zero].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[b777168ac1][Flex_S_v2_19_Illumina_Stranded_total_RNA_Ribo_Zero].json index 68b2b5c1f76..7fa95382fb8 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[b777168ac1][Flex_S_v2_19_Illumina_Stranded_total_RNA_Ribo_Zero].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[b777168ac1][Flex_S_v2_19_Illumina_Stranded_total_RNA_Ribo_Zero].json @@ -3283,6 +3283,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[b91d31eaa2][pl_MagMax_RNA_Cells_Flex_96_Channel].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[b91d31eaa2][pl_MagMax_RNA_Cells_Flex_96_Channel].json index 4157d11e090..9256b703b2c 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[b91d31eaa2][pl_MagMax_RNA_Cells_Flex_96_Channel].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[b91d31eaa2][pl_MagMax_RNA_Cells_Flex_96_Channel].json @@ -829,6 +829,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -6714,6 +6719,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -8024,6 +8034,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -11031,6 +11046,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -14038,6 +14058,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -17045,6 +17070,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[c8d2ca0089][Flex_S_v2_18_QIASeq_FX_48x].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[c8d2ca0089][Flex_S_v2_18_QIASeq_FX_48x].json index 6c54624f311..c7cc6586b5d 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[c8d2ca0089][Flex_S_v2_18_QIASeq_FX_48x].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[c8d2ca0089][Flex_S_v2_18_QIASeq_FX_48x].json @@ -5144,6 +5144,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d14738bdfe][pl_Zymo_Magbead_DNA_Cells_Flex_multi].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d14738bdfe][pl_Zymo_Magbead_DNA_Cells_Flex_multi].json index 14a7616b697..c8f00ac080e 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d14738bdfe][pl_Zymo_Magbead_DNA_Cells_Flex_multi].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d14738bdfe][pl_Zymo_Magbead_DNA_Cells_Flex_multi].json @@ -829,6 +829,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d29d74d7fb][pl_QIASeq_FX_48x_v8].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d29d74d7fb][pl_QIASeq_FX_48x_v8].json index 9cb48b08976..a9306a86942 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d29d74d7fb][pl_QIASeq_FX_48x_v8].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d29d74d7fb][pl_QIASeq_FX_48x_v8].json @@ -5144,6 +5144,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d391213095][Flex_S_v2_15_P1000_96_GRIP_HS_TM_QuickZymoMagbeadRNAExtractionCellsOrBacteria].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d391213095][Flex_S_v2_15_P1000_96_GRIP_HS_TM_QuickZymoMagbeadRNAExtractionCellsOrBacteria].json index 2523a86633a..426c94558c1 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d391213095][Flex_S_v2_15_P1000_96_GRIP_HS_TM_QuickZymoMagbeadRNAExtractionCellsOrBacteria].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d391213095][Flex_S_v2_15_P1000_96_GRIP_HS_TM_QuickZymoMagbeadRNAExtractionCellsOrBacteria].json @@ -829,6 +829,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -4972,6 +4977,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -6251,6 +6261,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -7530,6 +7545,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -8809,6 +8829,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -10088,6 +10113,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -11367,6 +11397,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d3b28ea1d7][pl_Zymo_Magbead_DNA_Cells_Flex_96_channel].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d3b28ea1d7][pl_Zymo_Magbead_DNA_Cells_Flex_96_channel].json index 90e2c5c4dfb..9214cce5922 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d3b28ea1d7][pl_Zymo_Magbead_DNA_Cells_Flex_96_channel].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d3b28ea1d7][pl_Zymo_Magbead_DNA_Cells_Flex_96_channel].json @@ -829,6 +829,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -4972,6 +4977,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -9707,6 +9717,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -14442,6 +14457,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -17449,6 +17469,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -20456,6 +20481,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -23463,6 +23493,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d61739e6a3][Flex_S_v2_19_IDT_xGen_EZ_48x].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d61739e6a3][Flex_S_v2_19_IDT_xGen_EZ_48x].json index 48cb632ccd4..a8f00e1a0f1 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d61739e6a3][Flex_S_v2_19_IDT_xGen_EZ_48x].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d61739e6a3][Flex_S_v2_19_IDT_xGen_EZ_48x].json @@ -5144,6 +5144,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d6389183c0][pl_AMPure_XP_48x_v8].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d6389183c0][pl_AMPure_XP_48x_v8].json index 1310283b324..a19d8ed0c76 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d6389183c0][pl_AMPure_XP_48x_v8].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d6389183c0][pl_AMPure_XP_48x_v8].json @@ -4032,6 +4032,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[da326082e1][pl_Hyperplus_tiptracking_V4_final].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[da326082e1][pl_Hyperplus_tiptracking_V4_final].json index 47372d63a60..b3678fd89b2 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[da326082e1][pl_Hyperplus_tiptracking_V4_final].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[da326082e1][pl_Hyperplus_tiptracking_V4_final].json @@ -6866,6 +6866,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[e0b0133ffb][pl_Illumina_Stranded_total_RNA_Ribo_Zero_protocol].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[e0b0133ffb][pl_Illumina_Stranded_total_RNA_Ribo_Zero_protocol].json index dba92ac69c0..590ca209392 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[e0b0133ffb][pl_Illumina_Stranded_total_RNA_Ribo_Zero_protocol].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[e0b0133ffb][pl_Illumina_Stranded_total_RNA_Ribo_Zero_protocol].json @@ -3283,6 +3283,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[e4b5b30b2e][Flex_S_v2_18_Illumina_DNA_PCR_Free].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[e4b5b30b2e][Flex_S_v2_18_Illumina_DNA_PCR_Free].json index 881892ce99c..4459fe971fd 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[e4b5b30b2e][Flex_S_v2_18_Illumina_DNA_PCR_Free].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[e4b5b30b2e][Flex_S_v2_18_Illumina_DNA_PCR_Free].json @@ -6158,6 +6158,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[e71b031f47][pl_Illumina_DNA_PCR_Free].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[e71b031f47][pl_Illumina_DNA_PCR_Free].json index 94c209d56fb..cffdb1bb54c 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[e71b031f47][pl_Illumina_DNA_PCR_Free].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[e71b031f47][pl_Illumina_DNA_PCR_Free].json @@ -6158,6 +6158,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f24bb0b4d9][Flex_S_v2_15_P1000_96_GRIP_HS_MB_TC_TM_IlluminaDNAPrep96PART3].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f24bb0b4d9][Flex_S_v2_15_P1000_96_GRIP_HS_MB_TC_TM_IlluminaDNAPrep96PART3].json index bcc3989e9f6..1c7b1c8237d 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f24bb0b4d9][Flex_S_v2_15_P1000_96_GRIP_HS_MB_TC_TM_IlluminaDNAPrep96PART3].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f24bb0b4d9][Flex_S_v2_15_P1000_96_GRIP_HS_MB_TC_TM_IlluminaDNAPrep96PART3].json @@ -4870,6 +4870,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -6148,6 +6153,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -9943,6 +9953,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, @@ -11221,6 +11236,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, diff --git a/api/src/opentrons/protocol_engine/commands/load_labware.py b/api/src/opentrons/protocol_engine/commands/load_labware.py index d0e83863616..d965c1116ad 100644 --- a/api/src/opentrons/protocol_engine/commands/load_labware.py +++ b/api/src/opentrons/protocol_engine/commands/load_labware.py @@ -192,6 +192,11 @@ async def execute( self._state_view.labware.raise_if_labware_incompatible_with_plate_reader( loaded_labware.definition ) + + self._state_view.labware.raise_if_labware_cannot_be_ondeck( + location=params.location, labware_definition=loaded_labware.definition + ) + return SuccessData( public=LoadLabwareResult( labwareId=loaded_labware.labware_id, diff --git a/api/src/opentrons/protocol_engine/commands/move_labware.py b/api/src/opentrons/protocol_engine/commands/move_labware.py index 8eb93ce9217..5b3d751bbfb 100644 --- a/api/src/opentrons/protocol_engine/commands/move_labware.py +++ b/api/src/opentrons/protocol_engine/commands/move_labware.py @@ -223,6 +223,15 @@ async def execute(self, params: MoveLabwareParams) -> _ExecuteReturn: # noqa: C self._state_view.labware.raise_if_labware_has_labware_on_top( labware_id=params.labwareId ) + + if isinstance(available_new_location, DeckSlotLocation): + self._state_view.labware.raise_if_labware_cannot_be_ondeck( + location=available_new_location, + labware_definition=self._state_view.labware.get_definition( + params.labwareId + ), + ) + if isinstance(available_new_location, OnLabwareLocation): self._state_view.labware.raise_if_labware_has_labware_on_top( available_new_location.labwareId diff --git a/api/src/opentrons/protocol_engine/errors/__init__.py b/api/src/opentrons/protocol_engine/errors/__init__.py index 2b0fb6a6060..419043120a6 100644 --- a/api/src/opentrons/protocol_engine/errors/__init__.py +++ b/api/src/opentrons/protocol_engine/errors/__init__.py @@ -18,6 +18,7 @@ LiquidDoesNotExistError, LabwareDefinitionDoesNotExistError, LabwareCannotBeStackedError, + LabwareCannotSitOnDeckError, LabwareIsInStackError, LabwareOffsetDoesNotExistError, LabwareIsNotTipRackError, @@ -105,6 +106,7 @@ "LiquidDoesNotExistError", "LabwareDefinitionDoesNotExistError", "LabwareCannotBeStackedError", + "LabwareCannotSitOnDeckError", "LabwareIsInStackError", "LabwareOffsetDoesNotExistError", "LabwareIsNotTipRackError", diff --git a/api/src/opentrons/protocol_engine/errors/exceptions.py b/api/src/opentrons/protocol_engine/errors/exceptions.py index c3fddf99a61..2f7e4b07e56 100644 --- a/api/src/opentrons/protocol_engine/errors/exceptions.py +++ b/api/src/opentrons/protocol_engine/errors/exceptions.py @@ -283,6 +283,19 @@ def __init__( super().__init__(ErrorCodes.GENERAL_ERROR, message, details, wrapping) +class LabwareCannotSitOnDeckError(ProtocolEngineError): + """Raised when a labware is incompatible with a deck slot.""" + + def __init__( + self, + message: Optional[str] = None, + details: Optional[Dict[str, Any]] = None, + wrapping: Optional[Sequence[EnumeratedError]] = None, + ) -> None: + """Build a LabwareCannotSitOnDeckError.""" + super().__init__(ErrorCodes.GENERAL_ERROR, message, details, wrapping) + + class LabwareIsInStackError(ProtocolEngineError): """Raised when trying to move to or physically interact with a labware that has another labware on top.""" diff --git a/api/src/opentrons/protocol_engine/resources/labware_validation.py b/api/src/opentrons/protocol_engine/resources/labware_validation.py index efe6d6daf65..451f3afbfab 100644 --- a/api/src/opentrons/protocol_engine/resources/labware_validation.py +++ b/api/src/opentrons/protocol_engine/resources/labware_validation.py @@ -44,6 +44,14 @@ def validate_labware_can_be_stacked( return below_labware_load_name in top_labware_definition.stackingOffsetWithLabware +def validate_labware_can_be_ondeck(definition: LabwareDefinition) -> bool: + """Validate that the labware being loaded onto the deck can sit in a slot.""" + return ( + definition.parameters.quirks is None + or "stackingOnly" not in definition.parameters.quirks + ) + + def validate_gripper_compatible(definition: LabwareDefinition) -> bool: """Validate that the labware definition does not have a quirk disallowing movement with gripper.""" return ( diff --git a/api/src/opentrons/protocol_engine/state/labware.py b/api/src/opentrons/protocol_engine/state/labware.py index 58909f5be9f..60ae8344930 100644 --- a/api/src/opentrons/protocol_engine/state/labware.py +++ b/api/src/opentrons/protocol_engine/state/labware.py @@ -886,6 +886,19 @@ def raise_if_labware_in_location( f"Labware {labware.loadName} is already present at {location}." ) + def raise_if_labware_cannot_be_ondeck( + self, + location: LabwareLocation, + labware_definition: LabwareDefinition, + ) -> None: + """Raise an error if the labware cannot be in the specified location.""" + if isinstance( + location, (DeckSlotLocation, AddressableAreaLocation) + ) and not labware_validation.validate_labware_can_be_ondeck(labware_definition): + raise errors.LabwareCannotSitOnDeckError( + f"{labware_definition.parameters.loadName} cannot sit in a slot by itself." + ) + def raise_if_labware_incompatible_with_plate_reader( self, labware_definition: LabwareDefinition, diff --git a/app/src/organisms/ODD/QuickTransferFlow/constants.ts b/app/src/organisms/ODD/QuickTransferFlow/constants.ts index dd1b18cda43..5aa6aa3b60d 100644 --- a/app/src/organisms/ODD/QuickTransferFlow/constants.ts +++ b/app/src/organisms/ODD/QuickTransferFlow/constants.ts @@ -100,6 +100,7 @@ export const SINGLE_CHANNEL_COMPATIBLE_LABWARE = [ 'opentrons/thermoscientificnunc_96_wellplate_2000ul/1', 'opentrons/usascientific_12_reservoir_22ml/1', 'opentrons/usascientific_96_wellplate_2.4ml_deep/1', + 'opentrons/evotips_opentrons_96_labware/1', ] export const EIGHT_CHANNEL_COMPATIBLE_LABWARE = [ @@ -144,6 +145,7 @@ export const EIGHT_CHANNEL_COMPATIBLE_LABWARE = [ 'opentrons/thermoscientificnunc_96_wellplate_2000ul/1', 'opentrons/usascientific_12_reservoir_22ml/1', 'opentrons/usascientific_96_wellplate_2.4ml_deep/1', + 'opentrons/evotips_opentrons_96_labware/1', ] export const NINETY_SIX_CHANNEL_COMPATIBLE_LABWARE = [ @@ -188,4 +190,5 @@ export const NINETY_SIX_CHANNEL_COMPATIBLE_LABWARE = [ 'opentrons/thermoscientificnunc_96_wellplate_2000ul/1', 'opentrons/usascientific_12_reservoir_22ml/1', 'opentrons/usascientific_96_wellplate_2.4ml_deep/1', + 'opentrons/evotips_opentrons_96_labware/1', ] diff --git a/shared-data/js/__tests__/labwareDefQuirks.test.ts b/shared-data/js/__tests__/labwareDefQuirks.test.ts index 6251c894647..4ef69b5cb51 100644 --- a/shared-data/js/__tests__/labwareDefQuirks.test.ts +++ b/shared-data/js/__tests__/labwareDefQuirks.test.ts @@ -14,6 +14,7 @@ const EXPECTED_VALID_QUIRKS = [ 'gripperIncompatible', 'tiprackAdapterFor96Channel', 'stackingMaxFive', + 'stackingOnly', ] describe('check quirks for all labware defs', () => { diff --git a/shared-data/js/labware.ts b/shared-data/js/labware.ts index 20d41c3a697..9faa6ced497 100644 --- a/shared-data/js/labware.ts +++ b/shared-data/js/labware.ts @@ -121,6 +121,8 @@ import thermoscientificnunc96Wellplate2000UlV1Uncasted from '../labware/definiti import tipone96Tiprack200UlV1Uncasted from '../labware/definitions/2/tipone_96_tiprack_200ul/1.json' import usascientific12Reservoir22MlV1Uncasted from '../labware/definitions/2/usascientific_12_reservoir_22ml/1.json' import usascientific96Wellplate24MlDeepV1Uncasted from '../labware/definitions/2/usascientific_96_wellplate_2.4ml_deep/1.json' +import evotipsFlex96TiprackAdapterV1Uncasted from '../labware/definitions/3/evotips_flex_96_tiprack_adapter/1.json' +import evotipsOpentrons96LabwareV1Uncasted from '../labware/definitions/3/evotips_opentrons_96_labware/1.json' // v1 legacy labware definitions @@ -297,6 +299,8 @@ const thermoscientificnunc96Wellplate2000UlV1 = thermoscientificnunc96Wellplate2 const tipone96Tiprack200UlV1 = tipone96Tiprack200UlV1Uncasted as LabwareDefinition2 const usascientific12Reservoir22MlV1 = usascientific12Reservoir22MlV1Uncasted as LabwareDefinition2 const usascientific96Wellplate24MlDeepV1 = usascientific96Wellplate24MlDeepV1Uncasted as LabwareDefinition2 +const evotipsFlex96TiprackAdapterV1 = evotipsFlex96TiprackAdapterV1Uncasted as LabwareDefinition2 +const evotipsOpentrons96LabwareV1 = evotipsOpentrons96LabwareV1Uncasted as LabwareDefinition2 // cast v1 defs @@ -466,6 +470,8 @@ const latestDefs = { tipone96Tiprack200UlV1, usascientific12Reservoir22MlV1, usascientific96Wellplate24MlDeepV1, + evotipsFlex96TiprackAdapterV1, + evotipsOpentrons96LabwareV1, } // labware definitions const getAllLabwareDefs = (): Record< diff --git a/shared-data/labware/definitions/2/nest_96_wellplate_2ml_deep/2.json b/shared-data/labware/definitions/2/nest_96_wellplate_2ml_deep/2.json index 775596e7386..ad48d50fecc 100644 --- a/shared-data/labware/definitions/2/nest_96_wellplate_2ml_deep/2.json +++ b/shared-data/labware/definitions/2/nest_96_wellplate_2ml_deep/2.json @@ -1130,6 +1130,11 @@ "x": 0, "y": 0, "z": 16.1 + }, + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 } }, "stackingOffsetWithModule": { diff --git a/shared-data/labware/definitions/3/evotips_flex_96_tiprack_adapter/1.json b/shared-data/labware/definitions/3/evotips_flex_96_tiprack_adapter/1.json new file mode 100644 index 00000000000..36125856ad3 --- /dev/null +++ b/shared-data/labware/definitions/3/evotips_flex_96_tiprack_adapter/1.json @@ -0,0 +1,41 @@ +{ + "ordering": [], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "metadata": { + "displayName": "Evotips adapter", + "displayCategory": "adapter", + "displayVolumeUnits": "\u00b5L", + "tags": [] + }, + "dimensions": { + "xDimension": 156.5, + "yDimension": 105, + "zDimension": 132 + }, + "wells": {}, + "groups": [ + { + "metadata": {}, + "wells": [] + } + ], + "parameters": { + "format": "96Standard", + "quirks": ["tiprackAdapterFor96Channel", "stackingMaxFive"], + "isTiprack": false, + "isMagneticModuleCompatible": false, + "loadName": "evotips_flex_96_tiprack_adapter" + }, + "namespace": "opentrons", + "version": 1, + "schemaVersion": 3, + "allowedRoles": ["adapter"], + "cornerOffsetFromSlot": { + "x": -14.25, + "y": -3.5, + "z": 0 + } +} diff --git a/shared-data/labware/definitions/3/evotips_opentrons_96_labware/1.json b/shared-data/labware/definitions/3/evotips_opentrons_96_labware/1.json new file mode 100644 index 00000000000..43b2616c6f5 --- /dev/null +++ b/shared-data/labware/definitions/3/evotips_opentrons_96_labware/1.json @@ -0,0 +1,1045 @@ +{ + "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": "opentrons", + "brandId": [] + }, + "metadata": { + "displayName": "Evotips", + "displayCategory": "wellPlate", + "displayVolumeUnits": "µL", + "tags": [] + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 86, + "zDimension": 39.25 + }, + "wells": { + "A1": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 14.08, + "y": 75.25, + "z": 1 + }, + "B1": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 14.08, + "y": 66.25, + "z": 1 + }, + "C1": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 14.08, + "y": 57.25, + "z": 1 + }, + "D1": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 14.08, + "y": 48.25, + "z": 1 + }, + "E1": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 14.08, + "y": 39.25, + "z": 1 + }, + "F1": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 14.08, + "y": 30.25, + "z": 1 + }, + "G1": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 14.08, + "y": 21.25, + "z": 1 + }, + "H1": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 14.08, + "y": 12.25, + "z": 1 + }, + "A2": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 23.08, + "y": 75.25, + "z": 1 + }, + "B2": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 23.08, + "y": 66.25, + "z": 1 + }, + "C2": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 23.08, + "y": 57.25, + "z": 1 + }, + "D2": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 23.08, + "y": 48.25, + "z": 1 + }, + "E2": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 23.08, + "y": 39.25, + "z": 1 + }, + "F2": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 23.08, + "y": 30.25, + "z": 1 + }, + "G2": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 23.08, + "y": 21.25, + "z": 1 + }, + "H2": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 23.08, + "y": 12.25, + "z": 1 + }, + "A3": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 32.08, + "y": 75.25, + "z": 1 + }, + "B3": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 32.08, + "y": 66.25, + "z": 1 + }, + "C3": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 32.08, + "y": 57.25, + "z": 1 + }, + "D3": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 32.08, + "y": 48.25, + "z": 1 + }, + "E3": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 32.08, + "y": 39.25, + "z": 1 + }, + "F3": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 32.08, + "y": 30.25, + "z": 1 + }, + "G3": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 32.08, + "y": 21.25, + "z": 1 + }, + "H3": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 32.08, + "y": 12.25, + "z": 1 + }, + "A4": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 41.08, + "y": 75.25, + "z": 1 + }, + "B4": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 41.08, + "y": 66.25, + "z": 1 + }, + "C4": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 41.08, + "y": 57.25, + "z": 1 + }, + "D4": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 41.08, + "y": 48.25, + "z": 1 + }, + "E4": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 41.08, + "y": 39.25, + "z": 1 + }, + "F4": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 41.08, + "y": 30.25, + "z": 1 + }, + "G4": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 41.08, + "y": 21.25, + "z": 1 + }, + "H4": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 41.08, + "y": 12.25, + "z": 1 + }, + "A5": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 50.08, + "y": 75.25, + "z": 1 + }, + "B5": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 50.08, + "y": 66.25, + "z": 1 + }, + "C5": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 50.08, + "y": 57.25, + "z": 1 + }, + "D5": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 50.08, + "y": 48.25, + "z": 1 + }, + "E5": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 50.08, + "y": 39.25, + "z": 1 + }, + "F5": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 50.08, + "y": 30.25, + "z": 1 + }, + "G5": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 50.08, + "y": 21.25, + "z": 1 + }, + "H5": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 50.08, + "y": 12.25, + "z": 1 + }, + "A6": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 59.08, + "y": 75.25, + "z": 1 + }, + "B6": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 59.08, + "y": 66.25, + "z": 1 + }, + "C6": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 59.08, + "y": 57.25, + "z": 1 + }, + "D6": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 59.08, + "y": 48.25, + "z": 1 + }, + "E6": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 59.08, + "y": 39.25, + "z": 1 + }, + "F6": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 59.08, + "y": 30.25, + "z": 1 + }, + "G6": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 59.08, + "y": 21.25, + "z": 1 + }, + "H6": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 59.08, + "y": 12.25, + "z": 1 + }, + "A7": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 68.08, + "y": 75.25, + "z": 1 + }, + "B7": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 68.08, + "y": 66.25, + "z": 1 + }, + "C7": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 68.08, + "y": 57.25, + "z": 1 + }, + "D7": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 68.08, + "y": 48.25, + "z": 1 + }, + "E7": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 68.08, + "y": 39.25, + "z": 1 + }, + "F7": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 68.08, + "y": 30.25, + "z": 1 + }, + "G7": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 68.08, + "y": 21.25, + "z": 1 + }, + "H7": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 68.08, + "y": 12.25, + "z": 1 + }, + "A8": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 77.08, + "y": 75.25, + "z": 1 + }, + "B8": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 77.08, + "y": 66.25, + "z": 1 + }, + "C8": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 77.08, + "y": 57.25, + "z": 1 + }, + "D8": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 77.08, + "y": 48.25, + "z": 1 + }, + "E8": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 77.08, + "y": 39.25, + "z": 1 + }, + "F8": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 77.08, + "y": 30.25, + "z": 1 + }, + "G8": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 77.08, + "y": 21.25, + "z": 1 + }, + "H8": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 77.08, + "y": 12.25, + "z": 1 + }, + "A9": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 86.08, + "y": 75.25, + "z": 1 + }, + "B9": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 86.08, + "y": 66.25, + "z": 1 + }, + "C9": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 86.08, + "y": 57.25, + "z": 1 + }, + "D9": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 86.08, + "y": 48.25, + "z": 1 + }, + "E9": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 86.08, + "y": 39.25, + "z": 1 + }, + "F9": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 86.08, + "y": 30.25, + "z": 1 + }, + "G9": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 86.08, + "y": 21.25, + "z": 1 + }, + "H9": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 86.08, + "y": 12.25, + "z": 1 + }, + "A10": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 95.08, + "y": 75.25, + "z": 1 + }, + "B10": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 95.08, + "y": 66.25, + "z": 1 + }, + "C10": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 95.08, + "y": 57.25, + "z": 1 + }, + "D10": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 95.08, + "y": 48.25, + "z": 1 + }, + "E10": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 95.08, + "y": 39.25, + "z": 1 + }, + "F10": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 95.08, + "y": 30.25, + "z": 1 + }, + "G10": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 95.08, + "y": 21.25, + "z": 1 + }, + "H10": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 95.08, + "y": 12.25, + "z": 1 + }, + "A11": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 104.08, + "y": 75.25, + "z": 1 + }, + "B11": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 104.08, + "y": 66.25, + "z": 1 + }, + "C11": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 104.08, + "y": 57.25, + "z": 1 + }, + "D11": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 104.08, + "y": 48.25, + "z": 1 + }, + "E11": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 104.08, + "y": 39.25, + "z": 1 + }, + "F11": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 104.08, + "y": 30.25, + "z": 1 + }, + "G11": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 104.08, + "y": 21.25, + "z": 1 + }, + "H11": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 104.08, + "y": 12.25, + "z": 1 + }, + "A12": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 113.08, + "y": 75.25, + "z": 1 + }, + "B12": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 113.08, + "y": 66.25, + "z": 1 + }, + "C12": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 113.08, + "y": 57.25, + "z": 1 + }, + "D12": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 113.08, + "y": 48.25, + "z": 1 + }, + "E12": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 113.08, + "y": 39.25, + "z": 1 + }, + "F12": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 113.08, + "y": 30.25, + "z": 1 + }, + "G12": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 113.08, + "y": 21.25, + "z": 1 + }, + "H12": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 113.08, + "y": 12.25, + "z": 1 + } + }, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "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": ["stackingOnly"], + "isTiprack": false, + "tipLength": 42.0, + "tipOverlap": 10.0, + "isMagneticModuleCompatible": false, + "loadName": "evotips_opentrons_96_labware" + }, + "namespace": "opentrons", + "allowedRoles": ["labware"], + "version": 1, + "stackLimit": 5, + "compatibleParentLabware": [ + "nest_96_wellplate_2ml_deep", + "nest_1_reservoir_195ml", + "evotips_flex_96_tiprack_adapter" + ], + "schemaVersion": 3, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "gripHeightFromLabwareBottom": 14.5, + "gripForce": 15, + "stackingOffsetWithLabware": { + "nest_96_wellplate_2ml_deep": { + "x": 0, + "y": 0, + "z": 22.5 + }, + "nest_1_reservoir_195ml": { + "x": 0, + "y": 0, + "z": 22.5 + }, + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 76.78 + } + } +} From 13a1c856f335f9fc97c082713564677f88a9efe2 Mon Sep 17 00:00:00 2001 From: Ryan Howard Date: Tue, 28 Jan 2025 17:14:20 -0500 Subject: [PATCH 035/150] fix(shared-data): Fixup some values for the new pipette (#17371) # Overview Some of the values that were hardcoded in hardware-testing did not make it into the shared data definitions during tuning at the factory. This corrects all of that ## Test Plan and Hands on Testing ## Changelog ## Review requests ## Risk assessment --- .../eight_channel/p1000/default/3_5.json | 2 +- .../ninety_six_channel/p200/default/3_0.json | 38 +++++++++---------- .../single_channel/p1000/default/3_5.json | 2 +- .../single_channel/p1000/default/3_6.json | 2 +- .../single_channel/p1000/default/3_7.json | 2 +- 5 files changed, 23 insertions(+), 23 deletions(-) diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p1000/default/3_5.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p1000/default/3_5.json index 1b734fe1011..09401af422d 100644 --- a/shared-data/pipette/definitions/2/liquid/eight_channel/p1000/default/3_5.json +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p1000/default/3_5.json @@ -15,7 +15,7 @@ "default": 57, "valuesByApiLevel": { "2.14": 57 } }, - "defaultFlowAcceleration": 1200.0, + "defaultFlowAcceleration": 24000.0, "defaultTipLength": 52.0, "defaultReturnTipHeight": 0.71, "aspirate": { diff --git a/shared-data/pipette/definitions/2/liquid/ninety_six_channel/p200/default/3_0.json b/shared-data/pipette/definitions/2/liquid/ninety_six_channel/p200/default/3_0.json index d2814dca3c1..42963f4e7ff 100644 --- a/shared-data/pipette/definitions/2/liquid/ninety_six_channel/p200/default/3_0.json +++ b/shared-data/pipette/definitions/2/liquid/ninety_six_channel/p200/default/3_0.json @@ -2,20 +2,20 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t20": { - "uiMaxFlowRate": 189.1, + "uiMaxFlowRate": 45, "defaultAspirateFlowRate": { - "default": 6, - "valuesByApiLevel": { "2.14": 6 } + "default": 6.5, + "valuesByApiLevel": { "2.14": 6.5 } }, "defaultDispenseFlowRate": { - "default": 6, - "valuesByApiLevel": { "2.14": 6 } + "default": 6.5, + "valuesByApiLevel": { "2.14": 6.5 } }, "defaultBlowOutFlowRate": { "default": 10, "valuesByApiLevel": { "2.14": 10 } }, - "defaultFlowAcceleration": 16000.0, + "defaultFlowAcceleration": 3160.0, "defaultTipLength": 52.0, "defaultReturnTipHeight": 0.6, "aspirate": { @@ -51,20 +51,20 @@ "defaultPushOutVolume": 2 }, "t50": { - "uiMaxFlowRate": 194, + "uiMaxFlowRate": 45, "defaultAspirateFlowRate": { - "default": 6, - "valuesByApiLevel": { "2.14": 6 } + "default": 6.5, + "valuesByApiLevel": { "2.14": 6.5 } }, "defaultDispenseFlowRate": { - "default": 6, - "valuesByApiLevel": { "2.14": 6 } + "default": 6.5, + "valuesByApiLevel": { "2.14": 6.5 } }, "defaultBlowOutFlowRate": { "default": 10, "valuesByApiLevel": { "2.14": 10 } }, - "defaultFlowAcceleration": 16000.0, + "defaultFlowAcceleration": 3160.0, "defaultTipLength": 57.9, "defaultReturnTipHeight": 0.2, "aspirate": { @@ -114,20 +114,20 @@ "defaultPushOutVolume": 7 }, "t200": { - "uiMaxFlowRate": 194, + "uiMaxFlowRate": 45, "defaultAspirateFlowRate": { - "default": 80, - "valuesByApiLevel": { "2.14": 80 } + "default": 15, + "valuesByApiLevel": { "2.14": 15 } }, "defaultDispenseFlowRate": { - "default": 80, - "valuesByApiLevel": { "2.14": 80 } + "default": 15, + "valuesByApiLevel": { "2.14": 15 } }, "defaultBlowOutFlowRate": { "default": 10, "valuesByApiLevel": { "2.14": 10 } }, - "defaultFlowAcceleration": 16000.0, + "defaultFlowAcceleration": 3160.0, "defaultTipLength": 58.35, "defaultReturnTipHeight": 0.2, "aspirate": { @@ -170,7 +170,7 @@ } }, "maxVolume": 200, - "minVolume": 1, + "minVolume": 0.5, "defaultTipracks": [ "opentrons/opentrons_flex_96_tiprack_200ul/1", "opentrons/opentrons_flex_96_tiprack_50ul/1", diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/3_5.json b/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/3_5.json index c70853beff3..9e126f536f5 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/3_5.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/3_5.json @@ -15,7 +15,7 @@ "default": 57, "valuesByApiLevel": { "2.14": 57 } }, - "defaultFlowAcceleration": 1200.0, + "defaultFlowAcceleration": 24000.0, "defaultTipLength": 52.0, "defaultReturnTipHeight": 0.71, "aspirate": { diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/3_6.json b/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/3_6.json index c8c3a02b398..6b902337a7d 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/3_6.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/3_6.json @@ -15,7 +15,7 @@ "default": 57, "valuesByApiLevel": { "2.14": 57 } }, - "defaultFlowAcceleration": 1200.0, + "defaultFlowAcceleration": 24000.0, "defaultTipLength": 52.0, "defaultReturnTipHeight": 0.71, "aspirate": { diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/3_7.json b/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/3_7.json index c8c3a02b398..3822d30c2f4 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/3_7.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/3_7.json @@ -15,7 +15,7 @@ "default": 57, "valuesByApiLevel": { "2.14": 57 } }, - "defaultFlowAcceleration": 1200.0, + "defaultFlowAcceleration": 2400.0, "defaultTipLength": 52.0, "defaultReturnTipHeight": 0.71, "aspirate": { From 5b917271a38581cc2ffe216bd3b906fb0d0caa1e Mon Sep 17 00:00:00 2001 From: Brayan Almonte Date: Wed, 29 Jan 2025 09:00:59 -0500 Subject: [PATCH 036/150] fix(api,shared-data): FlexStacker fixes and improvements to enable ABR/Science. (#17350) - Increased flex stacker z current from 1.5mA to 1.8mA to account for full tipracks - Increased the offset used when moving the z axis for storing tall labware like tipracks - added await get_motion_params call when initializing the move_params in the FlexStacker module. - added lid height if lid is used in the retrieve.py and store.py commands. - exclude lids on top of tipracks in the Flex Stacker when getting the highest z. - add flexStackerModuleV1D4 addressable area to the flex stacker + waste chute fixture - adjust the `stackingOffsetWithLabware` z from 8.193 to 14 for `opentrons_flex_tiprack_lid` - increase the `gripHeightFromLabwareTop` from 8 to 10 for `opentrons_flex_tiprack_lid` - decrease the `gripForce` from 15 to 10 for `opentrons_flex_tiprack_lid` --- .../opentrons/drivers/flex_stacker/driver.py | 12 +++---- .../hardware_control/modules/flex_stacker.py | 8 +++-- .../commands/flex_stacker/retrieve.py | 13 ++++--- .../commands/flex_stacker/store.py | 11 ++++-- .../protocol_engine/state/geometry.py | 1 + .../commands/flex_stacker/test_retrieve.py | 34 +++++++++++++++++-- .../commands/flex_stacker/test_store.py | 34 +++++++++++++++++-- .../opentrons/protocol_engine/conftest.py | 8 +++++ .../deck/definitions/5/ot3_standard.json | 6 +++- .../3/opentrons_flex_tiprack_lid/1.json | 18 +++++----- .../opentrons_shared_data/labware/__init__.py | 6 ++-- 11 files changed, 119 insertions(+), 32 deletions(-) diff --git a/api/src/opentrons/drivers/flex_stacker/driver.py b/api/src/opentrons/drivers/flex_stacker/driver.py index 366ea08b5f5..449233d1dee 100644 --- a/api/src/opentrons/drivers/flex_stacker/driver.py +++ b/api/src/opentrons/drivers/flex_stacker/driver.py @@ -33,10 +33,10 @@ StackerAxis.X: { "home": MoveParams( StackerAxis.X, - max_speed=10.0, - acceleration=100.0, - max_speed_discont=40, - current=1.5, + max_speed=10.0, # mm/s + acceleration=100.0, # mm/s^2 + max_speed_discont=40, # mm/s + current=1.5, # mAmps ), "move": MoveParams( StackerAxis.X, @@ -52,14 +52,14 @@ max_speed=10.0, acceleration=100.0, max_speed_discont=40, - current=1.5, + current=1.8, ), "move": MoveParams( StackerAxis.Z, max_speed=200.0, acceleration=500.0, max_speed_discont=40, - current=1.5, + current=1.8, ), }, StackerAxis.L: { diff --git a/api/src/opentrons/hardware_control/modules/flex_stacker.py b/api/src/opentrons/hardware_control/modules/flex_stacker.py index 295311e05ca..686653a2f24 100644 --- a/api/src/opentrons/hardware_control/modules/flex_stacker.py +++ b/api/src/opentrons/hardware_control/modules/flex_stacker.py @@ -55,6 +55,9 @@ OFFSET_MD = 10.0 OFFSET_LG = 20.0 +# height limit in mm of labware to use OFFSET_MD used when storing labware. +MEDIUM_LABWARE_Z_LIMIT = 20.0 + class FlexStacker(mod_abc.AbstractModule): """Hardware control interface for an attached Flex-Stacker module.""" @@ -344,7 +347,8 @@ async def store_labware(self, labware_height: float) -> bool: await self._prepare_for_action() # Move X then Z axis - distance = MAX_TRAVEL[StackerAxis.Z] - (labware_height / 2) - OFFSET_MD + offset = OFFSET_MD if labware_height < MEDIUM_LABWARE_Z_LIMIT else OFFSET_LG * 2 + distance = MAX_TRAVEL[StackerAxis.Z] - (labware_height / 2) - offset await self._move_and_home_axis(StackerAxis.X, Direction.RETRACT, OFFSET_SM) await self.move_axis(StackerAxis.Z, Direction.EXTENT, distance) @@ -410,7 +414,7 @@ async def get_limit_switch_status(self) -> None: async def get_motion_parameters(self) -> None: """Get the motion parameters used by the axis motors.""" self.move_params = { - axis: self._driver.get_motion_params(axis) for axis in StackerAxis + axis: await self._driver.get_motion_params(axis) for axis in StackerAxis } async def get_platform_sensor_state(self) -> None: diff --git a/api/src/opentrons/protocol_engine/commands/flex_stacker/retrieve.py b/api/src/opentrons/protocol_engine/commands/flex_stacker/retrieve.py index 6b932322c0d..7029b5772c3 100644 --- a/api/src/opentrons/protocol_engine/commands/flex_stacker/retrieve.py +++ b/api/src/opentrons/protocol_engine/commands/flex_stacker/retrieve.py @@ -83,11 +83,16 @@ async def execute(self, params: RetrieveParams) -> SuccessData[RetrieveResult]: # Get the labware dimensions for the labware being retrieved, # which is the first one in the hopper labware id list lw_id = stacker_state.hopper_labware_ids[0] - lw_dim = self._state_view.labware.get_dimensions(labware_id=lw_id) - if stacker_hw is not None: - # Dispense the labware from the Flex Stacker using the labware height - await stacker_hw.dispense_labware(labware_height=lw_dim.z) + labware = self._state_view.labware.get(lw_id) + labware_height = self._state_view.labware.get_dimensions(labware_id=lw_id).z + if labware.lid_id is not None: + lid_def = self._state_view.labware.get_definition(labware.lid_id) + offset = self._state_view.labware.get_labware_overlap_offsets( + lid_def, labware.loadName + ).z + labware_height = labware_height + lid_def.dimensions.zDimension - offset + await stacker_hw.dispense_labware(labware_height=labware_height) # update the state to reflect the labware is now in the flex stacker slot state_update.set_labware_location( diff --git a/api/src/opentrons/protocol_engine/commands/flex_stacker/store.py b/api/src/opentrons/protocol_engine/commands/flex_stacker/store.py index 206c8ee59a9..37f2d9f7616 100644 --- a/api/src/opentrons/protocol_engine/commands/flex_stacker/store.py +++ b/api/src/opentrons/protocol_engine/commands/flex_stacker/store.py @@ -68,12 +68,19 @@ async def execute(self, params: StoreParams) -> SuccessData[StoreResult]: "Cannot store labware if Flex Stacker carriage is empty" ) - lw_dim = self._state_view.labware.get_dimensions(labware_id=lw_id) # TODO: check the type of the labware should match that already in the stack state_update = update_types.StateUpdate() if stacker_hw is not None: - await stacker_hw.store_labware(labware_height=lw_dim.z) + labware = self._state_view.labware.get(lw_id) + labware_height = self._state_view.labware.get_dimensions(labware_id=lw_id).z + if labware.lid_id is not None: + lid_def = self._state_view.labware.get_definition(labware.lid_id) + offset = self._state_view.labware.get_labware_overlap_offsets( + lid_def, labware.loadName + ).z + labware_height = labware_height + lid_def.dimensions.zDimension - offset + await stacker_hw.store_labware(labware_height=labware_height) # update the state to reflect the labware is store in the stack state_update.set_labware_location( diff --git a/api/src/opentrons/protocol_engine/state/geometry.py b/api/src/opentrons/protocol_engine/state/geometry.py index 0344ef321fc..cf6b4521713 100644 --- a/api/src/opentrons/protocol_engine/state/geometry.py +++ b/api/src/opentrons/protocol_engine/state/geometry.py @@ -161,6 +161,7 @@ def get_all_obstacle_highest_z(self) -> float: self._get_highest_z_from_labware_data(lw_data) for lw_data in self._labware.get_all() if lw_data.location != OFF_DECK_LOCATION + and not self._labware.get_labware_by_lid_id(lw_data.id) ), default=0.0, ) diff --git a/api/tests/opentrons/protocol_engine/commands/flex_stacker/test_retrieve.py b/api/tests/opentrons/protocol_engine/commands/flex_stacker/test_retrieve.py index 533f99ce2fd..6f11b2908b7 100644 --- a/api/tests/opentrons/protocol_engine/commands/flex_stacker/test_retrieve.py +++ b/api/tests/opentrons/protocol_engine/commands/flex_stacker/test_retrieve.py @@ -1,9 +1,10 @@ """Test Flex Stacker retrieve command implementation.""" -from decoy import Decoy import pytest +from decoy import Decoy from contextlib import nullcontext as does_not_raise from typing import ContextManager, Any +from opentrons.calibration_storage.helpers import uri_from_details from opentrons.hardware_control.modules import FlexStacker from opentrons.protocol_engine.state.state import StateView @@ -21,8 +22,17 @@ from opentrons.protocol_engine.commands import flex_stacker from opentrons.protocol_engine.commands.command import SuccessData from opentrons.protocol_engine.commands.flex_stacker.retrieve import RetrieveImpl -from opentrons.protocol_engine.types import Dimensions, ModuleLocation +from opentrons.protocol_engine.types import ( + DeckSlotLocation, + Dimensions, + ModuleLocation, + LoadedLabware, + OverlapOffset, +) from opentrons.protocol_engine.errors import CannotPerformModuleAction +from opentrons.types import DeckSlotName + +from opentrons_shared_data.labware.labware_definition import LabwareDefinition @pytest.mark.parametrize( @@ -44,6 +54,7 @@ async def test_retrieve( equipment: EquipmentHandler, in_static_mode: bool, expectation: ContextManager[Any], + tiprack_lid_def: LabwareDefinition, ) -> None: """It should be able to retrieve a labware.""" subject = RetrieveImpl(state_view=state_view, equipment=equipment) @@ -59,11 +70,28 @@ async def test_retrieve( decoy.when( state_view.modules.get_flex_stacker_substate(module_id="flex-stacker-id") ).then_return(fs_module_substate) + decoy.when(state_view.labware.get("labware-id")).then_return( + LoadedLabware( + id="labware-id", + loadName="tiprack", + definitionUri=uri_from_details(namespace="a", load_name="b", version=1), + location=DeckSlotLocation(slotName=DeckSlotName.SLOT_3), + offsetId=None, + lid_id="lid-id", + displayName="Labware", + ) + ) decoy.when(state_view.labware.get_dimensions(labware_id="labware-id")).then_return( Dimensions(x=1, y=1, z=1) ) + decoy.when(state_view.labware.get_definition("lid-id")).then_return(tiprack_lid_def) + + decoy.when( + state_view.labware.get_labware_overlap_offsets(tiprack_lid_def, "tiprack") + ).then_return(OverlapOffset(x=0, y=0, z=14)) + decoy.when( equipment.get_module_hardware_api(FlexStackerId("flex-stacker-id")) ).then_return(fs_hardware) @@ -72,7 +100,7 @@ async def test_retrieve( result = await subject.execute(data) if not in_static_mode: - decoy.verify(await fs_hardware.dispense_labware(labware_height=1), times=1) + decoy.verify(await fs_hardware.dispense_labware(labware_height=4), times=1) assert result == SuccessData( public=flex_stacker.RetrieveResult(labware_id="labware-id"), diff --git a/api/tests/opentrons/protocol_engine/commands/flex_stacker/test_store.py b/api/tests/opentrons/protocol_engine/commands/flex_stacker/test_store.py index f7eaf9b4eb9..1d6ea1b9947 100644 --- a/api/tests/opentrons/protocol_engine/commands/flex_stacker/test_store.py +++ b/api/tests/opentrons/protocol_engine/commands/flex_stacker/test_store.py @@ -1,9 +1,10 @@ """Test Flex Stacker store command implementation.""" -from decoy import Decoy import pytest +from decoy import Decoy from contextlib import nullcontext as does_not_raise from typing import ContextManager, Any +from opentrons.calibration_storage.helpers import uri_from_details from opentrons.hardware_control.modules import FlexStacker from opentrons.protocol_engine.state.update_types import ( @@ -22,8 +23,17 @@ from opentrons.protocol_engine.commands import flex_stacker from opentrons.protocol_engine.commands.command import SuccessData from opentrons.protocol_engine.commands.flex_stacker.store import StoreImpl -from opentrons.protocol_engine.types import Dimensions, OFF_DECK_LOCATION +from opentrons.protocol_engine.types import ( + DeckSlotLocation, + Dimensions, + OFF_DECK_LOCATION, + LoadedLabware, + OverlapOffset, +) from opentrons.protocol_engine.errors import CannotPerformModuleAction +from opentrons.types import DeckSlotName + +from opentrons_shared_data.labware.labware_definition import LabwareDefinition @pytest.mark.parametrize( @@ -45,6 +55,7 @@ async def test_store( equipment: EquipmentHandler, in_static_mode: bool, expectation: ContextManager[Any], + tiprack_lid_def: LabwareDefinition, ) -> None: """It should be able to store a labware.""" subject = StoreImpl(state_view=state_view, equipment=equipment) @@ -64,11 +75,28 @@ async def test_store( decoy.when( state_view.labware.get_id_by_module(module_id="flex-stacker-id") ).then_return("labware-id") + decoy.when(state_view.labware.get("labware-id")).then_return( + LoadedLabware( + id="labware-id", + loadName="tiprack", + definitionUri=uri_from_details(namespace="a", load_name="b", version=1), + location=DeckSlotLocation(slotName=DeckSlotName.SLOT_3), + offsetId=None, + lid_id="lid-id", + displayName="Labware", + ) + ) decoy.when(state_view.labware.get_dimensions(labware_id="labware-id")).then_return( Dimensions(x=1, y=1, z=1) ) + decoy.when(state_view.labware.get_definition("lid-id")).then_return(tiprack_lid_def) + + decoy.when( + state_view.labware.get_labware_overlap_offsets(tiprack_lid_def, "tiprack") + ).then_return(OverlapOffset(x=0, y=0, z=14)) + decoy.when( equipment.get_module_hardware_api(FlexStackerId("flex-stacker-id")) ).then_return(fs_hardware) @@ -77,7 +105,7 @@ async def test_store( result = await subject.execute(data) if not in_static_mode: - decoy.verify(await fs_hardware.store_labware(labware_height=1), times=1) + decoy.verify(await fs_hardware.store_labware(labware_height=4), times=1) assert result == SuccessData( public=flex_stacker.StoreResult(), state_update=StateUpdate( diff --git a/api/tests/opentrons/protocol_engine/conftest.py b/api/tests/opentrons/protocol_engine/conftest.py index acc7d2e8829..c09d082afa2 100644 --- a/api/tests/opentrons/protocol_engine/conftest.py +++ b/api/tests/opentrons/protocol_engine/conftest.py @@ -171,6 +171,14 @@ def magdeck_well_plate_def() -> LabwareDefinition: ) +@pytest.fixture(scope="session") +def tiprack_lid_def() -> LabwareDefinition: + """Get the definition of the opentrons tiprack lid.""" + return LabwareDefinition.model_validate( + load_definition("opentrons_flex_tiprack_lid", 1, schema=3) + ) + + @pytest.fixture(scope="session") def tempdeck_v1_def() -> ModuleDefinition: """Get the definition of a V1 tempdeck.""" diff --git a/shared-data/deck/definitions/5/ot3_standard.json b/shared-data/deck/definitions/5/ot3_standard.json index 9358c5844d0..fda49c38f2d 100644 --- a/shared-data/deck/definitions/5/ot3_standard.json +++ b/shared-data/deck/definitions/5/ot3_standard.json @@ -1023,7 +1023,11 @@ "mayMountTo": ["cutoutD3"], "displayName": "Flex Stacker With Waste Chute Adapter for 96 Channel Pipette or Gripper", "providesAddressableAreas": { - "cutoutD3": ["1ChannelWasteChute", "8ChannelWasteChute", "D4"] + "cutoutD3": [ + "1ChannelWasteChute", + "8ChannelWasteChute", + "flexStackerModuleV1D4" + ] }, "fixtureGroup": {}, "height": 124.5 diff --git a/shared-data/labware/definitions/3/opentrons_flex_tiprack_lid/1.json b/shared-data/labware/definitions/3/opentrons_flex_tiprack_lid/1.json index 9b5197e143d..88e3b604921 100644 --- a/shared-data/labware/definitions/3/opentrons_flex_tiprack_lid/1.json +++ b/shared-data/labware/definitions/3/opentrons_flex_tiprack_lid/1.json @@ -43,37 +43,37 @@ "default": { "x": 0, "y": 0, - "z": 8.193 + "z": 14 }, "opentrons_flex_96_filtertiprack_200ul": { "x": 0, "y": 0, - "z": 8.25 + "z": 14 }, "opentrons_flex_96_filtertiprack_1000ul": { "x": 0, "y": 0, - "z": 8.25 + "z": 14 }, "opentrons_flex_96_tiprack_20ul": { "x": 0, "y": 0, - "z": 8.25 + "z": 14 }, "opentrons_flex_96_tiprack_50ul": { "x": 0, "y": 0, - "z": 8.25 + "z": 14 }, "opentrons_flex_96_tiprack_200ul": { "x": 0, "y": 0, - "z": 8.25 + "z": 14 }, "opentrons_flex_96_tiprack_1000ul": { "x": 0, "y": 0, - "z": 8.25 + "z": 14 } }, "stackLimit": 1, @@ -85,8 +85,8 @@ "opentrons_flex_96_filertiprack_200ul", "opentrons_flex_96_filertiprack_1000ul" ], - "gripForce": 15, - "gripHeightFromLabwareBottom": 8, + "gripForce": 10, + "gripHeightFromLabwareBottom": 10, "gripperOffsets": { "default": { "pickUpOffset": { diff --git a/shared-data/python/opentrons_shared_data/labware/__init__.py b/shared-data/python/opentrons_shared_data/labware/__init__.py index 8ffd7cbdf55..1a9fa1c2800 100644 --- a/shared-data/python/opentrons_shared_data/labware/__init__.py +++ b/shared-data/python/opentrons_shared_data/labware/__init__.py @@ -12,9 +12,11 @@ Schema = NewType("Schema", Dict[str, Any]) -def load_definition(loadname: str, version: int) -> "LabwareDefinition": +def load_definition( + loadname: str, version: int, schema: int = 2 +) -> "LabwareDefinition": return json.loads( - load_shared_data(f"labware/definitions/2/{loadname}/{version}.json") + load_shared_data(f"labware/definitions/{schema}/{loadname}/{version}.json") ) From fd2533dcb6fd493b82059b14a175c3d9dd4337a4 Mon Sep 17 00:00:00 2001 From: Brayan Almonte Date: Wed, 29 Jan 2025 09:18:37 -0500 Subject: [PATCH 037/150] feat(api): Add FlexStacker functionality to enable stallguard + add animation patterns to set_led . (#17349) - added set_motor_stallguard_threshold (M910) command) - added get_motor_stallguard_threshold (M911) command - added get_motor_driver_register (M920) command - added set_motor_driver_register (M921) command - added parse reset reason to the get_device_info command - fixed issue where driver.get_motion_params was not awaited on the FlexStacker module - rename Direction.EXTENT to Direction.EXTEND - validate the serial number before setting it. - add `set_led_state` to the FlexStacker module - added handling for motors stall errors (ERR403) - catch MotorStall exception in flex stacker driver to set MoveResult.STALL_ERROR - fixed an issue with set_led not setting the K arg properly - handle MoveResult.STALL_ERROR and raise FlexStackerStallError in `home_axis` and `move_axis` - set DEFAULT_FS_TIMEOUT to 1 second and added FS_MOVE_TIMEOUT 20s - clear serial input/output buffers if there is an error --- .../asyncio/communication/async_serial.py | 4 + .../drivers/asyncio/communication/errors.py | 7 + .../communication/serial_connection.py | 12 +- .../drivers/flex_stacker/__init__.py | 3 +- .../drivers/flex_stacker/abstract.py | 40 +++- .../opentrons/drivers/flex_stacker/driver.py | 180 +++++++++++++++--- .../drivers/flex_stacker/simulator.py | 61 +++++- .../opentrons/drivers/flex_stacker/types.py | 37 +++- .../hardware_control/modules/errors.py | 9 + .../hardware_control/modules/flex_stacker.py | 66 +++++-- .../drivers/flex_stacker/test_driver.py | 129 +++++++++++-- 11 files changed, 475 insertions(+), 73 deletions(-) diff --git a/api/src/opentrons/drivers/asyncio/communication/async_serial.py b/api/src/opentrons/drivers/asyncio/communication/async_serial.py index 8d2db0ddda7..4d0404b9eb0 100644 --- a/api/src/opentrons/drivers/asyncio/communication/async_serial.py +++ b/api/src/opentrons/drivers/asyncio/communication/async_serial.py @@ -155,6 +155,10 @@ def reset_input_buffer(self) -> None: """Reset the input buffer""" self._serial.reset_input_buffer() + def reset_output_buffer(self) -> None: + """Reset the output buffer""" + self._serial.reset_output_buffer() + @contextlib.asynccontextmanager async def timeout_override( self, timeout_property: TimeoutProperties, timeout: Optional[float] diff --git a/api/src/opentrons/drivers/asyncio/communication/errors.py b/api/src/opentrons/drivers/asyncio/communication/errors.py index 48f66356319..b48353e1ff6 100644 --- a/api/src/opentrons/drivers/asyncio/communication/errors.py +++ b/api/src/opentrons/drivers/asyncio/communication/errors.py @@ -6,6 +6,7 @@ class ErrorCodes(Enum): UNHANDLED_GCODE = "ERR003" + MOTOR_STALL = "ERR403" class SerialException(Exception): @@ -43,3 +44,9 @@ class UnhandledGcode(ErrorResponse): def __init__(self, port: str, response: str, command: str) -> None: self.command = command super().__init__(port, response) + + +class MotorStall(ErrorResponse): + def __init__(self, port: str, response: str, command: str) -> None: + self.command = command + super().__init__(port, response) diff --git a/api/src/opentrons/drivers/asyncio/communication/serial_connection.py b/api/src/opentrons/drivers/asyncio/communication/serial_connection.py index f925cfe8680..c7e3588e25a 100644 --- a/api/src/opentrons/drivers/asyncio/communication/serial_connection.py +++ b/api/src/opentrons/drivers/asyncio/communication/serial_connection.py @@ -6,7 +6,14 @@ from opentrons.drivers.command_builder import CommandBuilder -from .errors import NoResponse, AlarmResponse, ErrorResponse, UnhandledGcode, ErrorCodes +from .errors import ( + MotorStall, + NoResponse, + AlarmResponse, + ErrorResponse, + UnhandledGcode, + ErrorCodes, +) from .async_serial import AsyncSerial log = logging.getLogger(__name__) @@ -254,6 +261,9 @@ def raise_on_error(self, response: str, request: str) -> None: raise UnhandledGcode( port=self._port, response=response, command=request ) + + elif ErrorCodes.MOTOR_STALL.value.lower() in lower: + raise MotorStall(port=self._port, response=response, command=request) else: raise ErrorResponse(port=self._port, response=response) diff --git a/api/src/opentrons/drivers/flex_stacker/__init__.py b/api/src/opentrons/drivers/flex_stacker/__init__.py index 66b4cda546b..1fe2c22b43e 100644 --- a/api/src/opentrons/drivers/flex_stacker/__init__.py +++ b/api/src/opentrons/drivers/flex_stacker/__init__.py @@ -1,5 +1,5 @@ from .abstract import AbstractFlexStackerDriver -from .driver import FlexStackerDriver, STACKER_MOTION_CONFIG +from .driver import FlexStackerDriver, STACKER_MOTION_CONFIG, STALLGUARD_CONFIG from .simulator import SimulatingDriver from . import types as FlexStackerTypes @@ -9,4 +9,5 @@ "SimulatingDriver", "FlexStackerTypes", "STACKER_MOTION_CONFIG", + "STALLGUARD_CONFIG", ] diff --git a/api/src/opentrons/drivers/flex_stacker/abstract.py b/api/src/opentrons/drivers/flex_stacker/abstract.py index 222e6715086..9af5c78859a 100644 --- a/api/src/opentrons/drivers/flex_stacker/abstract.py +++ b/api/src/opentrons/drivers/flex_stacker/abstract.py @@ -1,6 +1,7 @@ -from typing import List, Protocol +from typing import List, Optional, Protocol from .types import ( + LEDPattern, LimitSwitchStatus, MoveResult, StackerAxis, @@ -9,6 +10,7 @@ MoveParams, StackerInfo, LEDColor, + StallGuardParams, ) @@ -51,10 +53,30 @@ async def set_ihold_current(self, axis: StackerAxis, current: float) -> bool: """Set axis hold current in amps.""" ... + async def set_stallguard_threshold( + self, axis: StackerAxis, enable: bool, threshold: int + ) -> bool: + """Enables and sets the stallguard threshold for the given axis motor.""" + ... + + async def set_motor_driver_register( + self, axis: StackerAxis, reg: int, value: int + ) -> bool: + """Set the register of the given motor axis driver to the given value.""" + ... + + async def get_motor_driver_register(self, axis: StackerAxis, reg: int) -> int: + """Gets the register value of the given motor axis driver.""" + ... + async def get_motion_params(self, axis: StackerAxis) -> MoveParams: """Get the motion parameters used by the given axis motor.""" ... + async def get_stallguard_threshold(self, axis: StackerAxis) -> StallGuardParams: + """Get the stallguard parameters by the given axis motor.""" + ... + async def get_limit_switch(self, axis: StackerAxis, direction: Direction) -> bool: """Get limit switch status. @@ -96,16 +118,26 @@ async def move_to_limit_switch( """Move until limit switch is triggered.""" ... - async def home_axis(self, axis: StackerAxis, direction: Direction) -> bool: + async def home_axis(self, axis: StackerAxis, direction: Direction) -> MoveResult: """Home axis.""" ... async def set_led( - self, power: float, color: LEDColor | None = None, external: bool | None = None + self, + power: float, + color: Optional[LEDColor] = None, + external: Optional[bool] = None, + pattern: Optional[LEDPattern] = None, + duration: Optional[int] = None, + reps: Optional[int] = None, ) -> bool: - """Set LED color of status bar.""" + """Set LED Status bar color and pattern.""" ... async def enter_programming_mode(self) -> None: """Reboot into programming mode""" ... + + def reset_serial_buffers(self) -> None: + """Reset the input and output serial buffers.""" + ... diff --git a/api/src/opentrons/drivers/flex_stacker/driver.py b/api/src/opentrons/drivers/flex_stacker/driver.py index 449233d1dee..270cd759f90 100644 --- a/api/src/opentrons/drivers/flex_stacker/driver.py +++ b/api/src/opentrons/drivers/flex_stacker/driver.py @@ -2,12 +2,14 @@ import re from typing import List, Optional +from opentrons.drivers.asyncio.communication.errors import MotorStall from opentrons.drivers.command_builder import CommandBuilder from opentrons.drivers.asyncio.communication import AsyncResponseSerialConnection from .abstract import AbstractFlexStackerDriver from .types import ( GCODE, + LEDPattern, MoveResult, StackerAxis, PlatformStatus, @@ -17,17 +19,30 @@ MoveParams, LimitSwitchStatus, LEDColor, + StallGuardParams, ) FS_BAUDRATE = 115200 -DEFAULT_FS_TIMEOUT = 40 +DEFAULT_FS_TIMEOUT = 1 +FS_MOVE_TIMEOUT = 20 FS_ACK = "OK\n" FS_ERROR_KEYWORD = "err" FS_ASYNC_ERROR_ACK = "async" DEFAULT_COMMAND_RETRIES = 0 GCODE_ROUNDING_PRECISION = 2 +# LED animation range values +MIN_DURATION_MS = 25 # 25ms +MAX_DURATION_MS = 10000 # 10s +MAX_REPS = 10 + +# Stallguard defaults +STALLGUARD_CONFIG = { + StackerAxis.X: StallGuardParams(StackerAxis.X, True, 2), + StackerAxis.Z: StallGuardParams(StackerAxis.Z, True, 2), + StackerAxis.L: StallGuardParams(StackerAxis.L, True, 2), +} STACKER_MOTION_CONFIG = { StackerAxis.X: { @@ -98,6 +113,15 @@ def parse_device_info(cls, response: str) -> StackerInfo: m.group("fw"), HardwareRevision(m.group("hw")), m.group("sn") ) + @classmethod + def parse_reset_reason(cls, response: str) -> int: + """Parse the reset reason""" + _RE = re.compile(rf"^{GCODE.GET_RESET_REASON} R:(?P\d)$") + match = _RE.match(response) + if not match: + raise ValueError(f"Incorrect Response for reset reason: {response}") + return int(match.group("R")) + @classmethod def parse_limit_switch_status(cls, response: str) -> LimitSwitchStatus: """Parse limit switch statuses.""" @@ -123,7 +147,7 @@ def parse_platform_sensor_status(cls, response: str) -> PlatformStatus: @classmethod def parse_door_closed(cls, response: str) -> bool: """Parse door closed.""" - _RE = re.compile(r"^M122 D:(\d)$") + _RE = re.compile(rf"^{GCODE.GET_DOOR_SWITCH} D:(\d)$") match = _RE.match(response) if not match: raise ValueError(f"Incorrect Response for door closed: {response}") @@ -135,7 +159,7 @@ def parse_move_params(cls, response: str) -> MoveParams: field_names = MoveParams.get_fields() pattern = r"\s".join( [ - rf"{f}:(?P<{f}>(\d*\.)?\d+)" if f != "M" else rf"{f}:(?P<{f}>[X,Z,L])" + rf"{f}:(?P<{f}>(\d*\.)?\d+)" if f != "M" else rf"{f}:(?P<{f}>[XZL])" for f in field_names ] ) @@ -150,6 +174,32 @@ def parse_move_params(cls, response: str) -> MoveParams: max_speed_discont=float(m.group("D")), ) + @classmethod + def parse_stallguard_params(cls, response: str) -> StallGuardParams: + """Parse stallguard params.""" + pattern = r"(?P[XZL]):(?P\d) T:(?P\d+)" + _RE = re.compile(f"^{GCODE.GET_STALLGUARD_THRESHOLD} {pattern}$") + m = _RE.match(response) + if not m: + raise ValueError(f"Incorrect Response for stallfguard params: {response}") + return StallGuardParams( + axis=StackerAxis(m.group("M")), + enabled=bool(int(m.group("E"))), + threshold=int(m.group("T")), + ) + + @classmethod + def parse_get_motor_register(cls, response: str) -> int: + """Parse get register value.""" + pattern = r"(?P[XZL]):(?P\d+) V:(?P\d+)" + _RE = re.compile(f"^{GCODE.GET_MOTOR_DRIVER_REGISTER} {pattern}$") + m = _RE.match(response) + if not m: + raise ValueError( + f"Incorrect Response for get motor driver register: {response}" + ) + return int(m.group("V")) + @classmethod def append_move_params( cls, command: CommandBuilder, params: MoveParams | None @@ -209,12 +259,21 @@ async def get_device_info(self) -> StackerInfo: response = await self._connection.send_command( GCODE.DEVICE_INFO.build_command() ) - await self._connection.send_command(GCODE.GET_RESET_REASON.build_command()) - return self.parse_device_info(response) + device_info = self.parse_device_info(response) + reason_resp = await self._connection.send_command( + GCODE.GET_RESET_REASON.build_command() + ) + reason = self.parse_reset_reason(reason_resp) + device_info.rr = reason + return device_info async def set_serial_number(self, sn: str) -> bool: """Set Serial Number.""" - # TODO: validate the serial number format + if not re.match(r"^FST[\w]{1}[\d]{2}[\d]{8}[\d]+$", sn): + raise ValueError( + f"Invalid serial number: ({sn}) expected format: FSTA1020250119001" + ) + resp = await self._connection.send_command( GCODE.SET_SERIAL_NUMBER.build_command().add_element(sn) ) @@ -257,6 +316,46 @@ async def set_ihold_current(self, axis: StackerAxis, current: float) -> bool: raise ValueError(f"Incorrect Response for set ihold current: {resp}") return True + async def set_stallguard_threshold( + self, axis: StackerAxis, enable: bool, threshold: int + ) -> bool: + """Enables and sets the stallguard threshold for the given axis motor.""" + if not -64 < threshold < 63: + raise ValueError( + f"Threshold value ({threshold}) should be between -64 and 63." + ) + + resp = await self._connection.send_command( + GCODE.SET_STALLGUARD.build_command() + .add_int(axis.name, int(enable)) + .add_int("T", threshold) + ) + if not re.match(rf"^{GCODE.SET_STALLGUARD}$", resp): + raise ValueError(f"Incorrect Response for set stallguard threshold: {resp}") + return True + + async def set_motor_driver_register( + self, axis: StackerAxis, reg: int, value: int + ) -> bool: + """Set the register of the given motor axis driver to the given value.""" + resp = await self._connection.send_command( + GCODE.SET_MOTOR_DRIVER_REGISTER.build_command() + .add_int(axis.name, reg) + .add_element(str(value)) + ) + if not re.match(rf"^{GCODE.SET_MOTOR_DRIVER_REGISTER}$", resp): + raise ValueError( + f"Incorrect Response for set motor driver register: {resp}" + ) + return True + + async def get_motor_driver_register(self, axis: StackerAxis, reg: int) -> int: + """Gets the register value of the given motor axis driver.""" + response = await self._connection.send_command( + GCODE.GET_MOTOR_DRIVER_REGISTER.build_command().add_int(axis.name, reg) + ) + return self.parse_get_motor_register(response) + async def get_motion_params(self, axis: StackerAxis) -> MoveParams: """Get the motion parameters used by the given axis motor.""" response = await self._connection.send_command( @@ -264,6 +363,13 @@ async def get_motion_params(self, axis: StackerAxis) -> MoveParams: ) return self.parse_move_params(response) + async def get_stallguard_threshold(self, axis: StackerAxis) -> StallGuardParams: + """Get the stallguard parameters by the given axis motor.""" + response = await self._connection.send_command( + GCODE.GET_STALLGUARD_THRESHOLD.build_command().add_element(axis.name) + ) + return self.parse_stallguard_params(response) + async def get_limit_switch(self, axis: StackerAxis, direction: Direction) -> bool: """Get limit switch status. @@ -314,10 +420,13 @@ async def move_in_mm( ), params, ) - resp = await self._connection.send_command(command) - if not re.match(rf"^{GCODE.MOVE_TO}$", resp): - raise ValueError(f"Incorrect Response for move to: {resp}") - # TODO: handle STALL_ERROR + try: + resp = await self._connection.send_command(command, timeout=FS_MOVE_TIMEOUT) + if not re.match(rf"^{GCODE.MOVE_TO}$", resp): + raise ValueError(f"Incorrect Response for move to: {resp}") + except MotorStall: + self.reset_serial_buffers() + return MoveResult.STALL_ERROR return MoveResult.NO_ERROR async def move_to_limit_switch( @@ -328,29 +437,44 @@ async def move_to_limit_switch( GCODE.MOVE_TO_SWITCH.build_command().add_int(axis.name, direction.value), params, ) - resp = await self._connection.send_command(command) - if not re.match(rf"^{GCODE.MOVE_TO_SWITCH}$", resp): - raise ValueError(f"Incorrect Response for move to switch: {resp}") - # TODO: handle STALL_ERROR + try: + resp = await self._connection.send_command(command, timeout=FS_MOVE_TIMEOUT) + if not re.match(rf"^{GCODE.MOVE_TO_SWITCH}$", resp): + raise ValueError(f"Incorrect Response for move to switch: {resp}") + except MotorStall: + self.reset_serial_buffers() + return MoveResult.STALL_ERROR return MoveResult.NO_ERROR - async def home_axis(self, axis: StackerAxis, direction: Direction) -> bool: + async def home_axis(self, axis: StackerAxis, direction: Direction) -> MoveResult: """Home axis.""" - resp = await self._connection.send_command( - GCODE.HOME_AXIS.build_command().add_int(axis.name, direction.value) - ) + command = GCODE.HOME_AXIS.build_command().add_int(axis.name, direction.value) + try: + resp = await self._connection.send_command(command, timeout=FS_MOVE_TIMEOUT) + except MotorStall: + self.reset_serial_buffers() + return MoveResult.STALL_ERROR if not re.match(rf"^{GCODE.HOME_AXIS}$", resp): raise ValueError(f"Incorrect Response for home axis: {resp}") - return True + return MoveResult.NO_ERROR async def set_led( - self, power: float, color: LEDColor | None = None, external: bool | None = None + self, + power: float, + color: Optional[LEDColor] = None, + external: Optional[bool] = None, + pattern: Optional[LEDPattern] = None, + duration: Optional[int] = None, + reps: Optional[int] = None, ) -> bool: - """Set LED color. + """Set LED Status bar color and pattern. :param power: Power of the LED (0-1.0), 0 is off, 1 is full power :param color: Color of the LED :param external: True if external LED, False if internal LED + :param pattern: Animation pattern of the LED status bar + :param duration: Animation duration in milliseconds (25-10000), 10s max + :param reps: Number of times to repeat the animation (-1 - 10), -1 is forever. """ power = max(0, min(power, 1.0)) command = GCODE.SET_LED.build_command().add_float( @@ -359,7 +483,14 @@ async def set_led( if color is not None: command.add_int("C", color.value) if external is not None: - command.add_int("E", external) + command.add_int("K", int(external)) + if pattern is not None: + command.add_int("A", pattern.value) + if duration is not None: + duration = max(MIN_DURATION_MS, min(duration, MAX_DURATION_MS)) + command.add_int("D", duration) + if reps is not None: + command.add_int("R", max(-1, min(reps, MAX_REPS))) resp = await self._connection.send_command(command) if not re.match(rf"^{GCODE.SET_LED}$", resp): raise ValueError(f"Incorrect Response for set led: {resp}") @@ -370,3 +501,8 @@ async def enter_programming_mode(self) -> None: command = GCODE.ENTER_BOOTLOADER.build_command() await self._connection.send_dfu_command(command) await self._connection.close() + + def reset_serial_buffers(self) -> None: + """Reset the input and output serial buffers.""" + self._connection._serial.reset_input_buffer() + self._connection._serial.reset_output_buffer() diff --git a/api/src/opentrons/drivers/flex_stacker/simulator.py b/api/src/opentrons/drivers/flex_stacker/simulator.py index 1ceedabf146..88195f5ea71 100644 --- a/api/src/opentrons/drivers/flex_stacker/simulator.py +++ b/api/src/opentrons/drivers/flex_stacker/simulator.py @@ -1,10 +1,11 @@ -from typing import List, Optional +from typing import List, Optional, Dict from opentrons.util.async_helpers import ensure_yield from .abstract import AbstractFlexStackerDriver from .types import ( LEDColor, + LEDPattern, MoveResult, StackerAxis, PlatformStatus, @@ -13,6 +14,7 @@ HardwareRevision, MoveParams, LimitSwitchStatus, + StallGuardParams, ) @@ -24,6 +26,13 @@ def __init__(self, serial_number: Optional[str] = None) -> None: self._limit_switch_status = LimitSwitchStatus(False, False, False, False, False) self._platform_sensor_status = PlatformStatus(False, False) self._door_closed = True + self._connected = True + self._stallgard_threshold = { + a: StallGuardParams(a, False, 0) for a in StackerAxis + } + self._motor_registers: Dict[StackerAxis, Dict[int, int]] = { + a: {} for a in StackerAxis + } def set_limit_switch(self, status: LimitSwitchStatus) -> bool: self._limit_switch_status = status @@ -40,17 +49,17 @@ def set_door_closed(self, door_closed: bool) -> bool: @ensure_yield async def connect(self) -> None: """Connect to stacker.""" - pass + self._connected = True @ensure_yield async def disconnect(self) -> None: """Disconnect from stacker.""" - pass + self._connected = False @ensure_yield async def is_connected(self) -> bool: """Check connection to stacker.""" - return True + return self._connected @ensure_yield async def get_device_info(self) -> StackerInfo: @@ -60,6 +69,7 @@ async def get_device_info(self) -> StackerInfo: @ensure_yield async def set_serial_number(self, sn: str) -> bool: """Set Serial Number.""" + self._sn = sn return True async def enable_motors(self, axis: List[StackerAxis]) -> bool: @@ -73,16 +83,39 @@ async def stop_motors(self) -> bool: async def set_run_current(self, axis: StackerAxis, current: float) -> bool: """Set axis peak run current in amps.""" + return True async def set_ihold_current(self, axis: StackerAxis, current: float) -> bool: """Set axis hold current in amps.""" return True + async def set_stallguard_threshold( + self, axis: StackerAxis, enable: bool, threshold: int + ) -> bool: + """Enables and sets the stallguard threshold for the given axis motor.""" + self._stallgard_threshold[axis] = StallGuardParams(axis, enable, threshold) + return True + + async def set_motor_driver_register( + self, axis: StackerAxis, reg: int, value: int + ) -> bool: + """Set the register of the given motor axis driver to the given value.""" + self._motor_registers[axis].update({reg: value}) + return True + + async def get_motor_driver_register(self, axis: StackerAxis, reg: int) -> int: + """Gets the register value of the given motor axis driver.""" + return self._motor_registers[axis].get(reg, 0) + async def get_motion_params(self, axis: StackerAxis) -> MoveParams: """Get the motion parameters used by the given axis motor.""" return MoveParams(axis, 1, 1, 1) + async def get_stallguard_threshold(self, axis: StackerAxis) -> StallGuardParams: + """Get the stallguard parameters by the given axis motor.""" + return self._stallgard_threshold[axis] + @ensure_yield async def get_limit_switch(self, axis: StackerAxis, direction: Direction) -> bool: """Get limit switch status. @@ -101,7 +134,7 @@ async def get_platform_sensor(self, direction: Direction) -> bool: :return: True if platform is present, False otherwise """ - return True + return self._platform_sensor_status.get(direction) async def get_platform_status(self) -> PlatformStatus: """Get platform status.""" @@ -129,16 +162,26 @@ async def move_to_limit_switch( """Move until limit switch is triggered.""" return MoveResult.NO_ERROR - async def home_axis(self, axis: StackerAxis, direction: Direction) -> bool: + async def home_axis(self, axis: StackerAxis, direction: Direction) -> MoveResult: """Home axis.""" - return True + return MoveResult.NO_ERROR async def set_led( - self, power: float, color: LEDColor | None = None, external: bool | None = None + self, + power: float, + color: Optional[LEDColor] = None, + external: Optional[bool] = None, + pattern: Optional[LEDPattern] = None, + duration: Optional[int] = None, + reps: Optional[int] = None, ) -> bool: - """Set LED color.""" + """Set LED Status bar color and pattern.""" return True async def enter_programming_mode(self) -> None: """Reboot into programming mode""" pass + + def reset_serial_buffers(self) -> None: + """Reset the input and output serial buffers.""" + pass diff --git a/api/src/opentrons/drivers/flex_stacker/types.py b/api/src/opentrons/drivers/flex_stacker/types.py index 9f8e8825b93..3a2bff11814 100644 --- a/api/src/opentrons/drivers/flex_stacker/types.py +++ b/api/src/opentrons/drivers/flex_stacker/types.py @@ -18,10 +18,14 @@ class GCODE(str, Enum): GET_MOVE_PARAMS = "M120" GET_PLATFORM_SENSOR = "M121" GET_DOOR_SWITCH = "M122" + GET_STALLGUARD_THRESHOLD = "M911" + GET_MOTOR_DRIVER_REGISTER = "M920" SET_LED = "M200" SET_SERIAL_NUMBER = "M996" SET_RUN_CURRENT = "M906" SET_IHOLD_CURRENT = "M907" + SET_STALLGUARD = "M910" + SET_MOTOR_DRIVER_REGISTER = "M921" ENTER_BOOTLOADER = "dfu" def build_command(self) -> CommandBuilder: @@ -48,6 +52,7 @@ class StackerInfo: fw: str hw: HardwareRevision sn: str + rr: int = 0 def to_dict(self) -> Dict[str, str]: """Build command.""" @@ -55,6 +60,7 @@ def to_dict(self) -> Dict[str, str]: "serial": self.sn, "version": self.fw, "model": self.hw.value, + "reset_reason": str(self.rr), } @@ -77,13 +83,23 @@ class LEDColor(Enum): RED = 1 GREEN = 2 BLUE = 3 + YELLOW = 4 + + +class LEDPattern(Enum): + """Stacker LED Pattern.""" + + STATIC = 0 + FLASH = 1 + PULSE = 2 + CONFIRM = 3 class Direction(Enum): """Direction.""" RETRACT = 0 # negative - EXTENT = 1 # positive + EXTEND = 1 # positive def __str__(self) -> str: """Convert to tag for clear logging.""" @@ -91,7 +107,7 @@ def __str__(self) -> str: def opposite(self) -> "Direction": """Get opposite direction.""" - return Direction.EXTENT if self == Direction.RETRACT else Direction.RETRACT + return Direction.EXTEND if self == Direction.RETRACT else Direction.RETRACT def distance(self, distance: float) -> float: """Get signed distance, where retract direction is negative.""" @@ -116,10 +132,10 @@ def get_fields(cls) -> List[str]: def get(self, axis: StackerAxis, direction: Direction) -> bool: """Get limit switch status.""" if axis == StackerAxis.X: - return self.XE if direction == Direction.EXTENT else self.XR + return self.XE if direction == Direction.EXTEND else self.XR if axis == StackerAxis.Z: - return self.ZE if direction == Direction.EXTENT else self.ZR - if direction == Direction.EXTENT: + return self.ZE if direction == Direction.EXTEND else self.ZR + if direction == Direction.EXTEND: raise ValueError("Latch does not have extent limit switch") return self.LR @@ -138,7 +154,7 @@ def get_fields(cls) -> List[str]: def get(self, direction: Direction) -> bool: """Get platform status.""" - return self.E if direction == Direction.EXTENT else self.R + return self.E if direction == Direction.EXTEND else self.R def to_dict(self) -> Dict[str, bool]: """Dict of the data.""" @@ -164,6 +180,15 @@ def get_fields(cls) -> List[str]: return ["M", "V", "A", "D"] +@dataclass +class StallGuardParams: + """StallGuard Parameters.""" + + axis: StackerAxis + enabled: bool + threshold: int + + class MoveResult(str, Enum): """The result of a move command.""" diff --git a/api/src/opentrons/hardware_control/modules/errors.py b/api/src/opentrons/hardware_control/modules/errors.py index 46601a0aa2a..b79ab4d79ed 100644 --- a/api/src/opentrons/hardware_control/modules/errors.py +++ b/api/src/opentrons/hardware_control/modules/errors.py @@ -1,3 +1,6 @@ +from opentrons.drivers.flex_stacker.types import StackerAxis + + class UpdateError(RuntimeError): pass @@ -5,3 +8,9 @@ class UpdateError(RuntimeError): class AbsorbanceReaderDisconnectedError(RuntimeError): def __init__(self, serial: str): self.serial = serial + + +class FlexStackerStallError(RuntimeError): + def __init__(self, serial: str, axis: StackerAxis): + self.serial = serial + self.axis = axis diff --git a/api/src/opentrons/hardware_control/modules/flex_stacker.py b/api/src/opentrons/hardware_control/modules/flex_stacker.py index 686653a2f24..136ac1d18bc 100644 --- a/api/src/opentrons/hardware_control/modules/flex_stacker.py +++ b/api/src/opentrons/hardware_control/modules/flex_stacker.py @@ -6,6 +6,8 @@ from opentrons.drivers.flex_stacker.types import ( Direction, + LEDColor, + LEDPattern, MoveParams, MoveResult, StackerAxis, @@ -13,11 +15,13 @@ from opentrons.drivers.rpi_drivers.types import USBPort from opentrons.drivers.flex_stacker.driver import ( STACKER_MOTION_CONFIG, + STALLGUARD_CONFIG, FlexStackerDriver, ) from opentrons.drivers.flex_stacker.abstract import AbstractFlexStackerDriver from opentrons.drivers.flex_stacker.simulator import SimulatingDriver from opentrons.hardware_control.execution_manager import ExecutionManager +from opentrons.hardware_control.modules.errors import FlexStackerStallError from opentrons.hardware_control.poller import Reader, Poller from opentrons.hardware_control.modules import mod_abc, update from opentrons.hardware_control.modules.types import ( @@ -116,6 +120,13 @@ async def build( disconnected_callback=disconnected_callback, ) + # Enable stallguard + for axis in StackerAxis: + config = STALLGUARD_CONFIG[axis] + await driver.set_stallguard_threshold( + axis, config.enabled, config.threshold + ) + try: await poller.start() except Exception: @@ -147,6 +158,7 @@ def __init__( self._reader = reader self._poller = poller self._stacker_status = FlexStackerStatus.IDLE + self._stall_detected = False async def cleanup(self) -> None: """Stop the poller task""" @@ -229,6 +241,25 @@ def bootloader(self) -> UploadFunction: async def deactivate(self, must_be_running: bool = True) -> None: await self._driver.stop_motors() + async def reset_stall_detected(self) -> None: + """Sets the statusbar to normal.""" + if self._stall_detected: + await self.set_led_state(0.5, LEDColor.GREEN, LEDPattern.STATIC) + self._stall_detected = False + + async def set_led_state( + self, + power: float, + color: Optional[LEDColor] = None, + pattern: Optional[LEDPattern] = None, + duration: Optional[int] = None, + reps: Optional[int] = None, + ) -> bool: + """Sets the statusbar state.""" + return await self._driver.set_led( + power, color=color, pattern=pattern, duration=duration, reps=reps + ) + async def move_axis( self, axis: StackerAxis, @@ -239,15 +270,18 @@ async def move_axis( current: Optional[float] = None, ) -> bool: """Move the axis in a direction by the given distance in mm.""" + await self.reset_stall_detected() motion_params = STACKER_MOTION_CONFIG[axis]["move"] await self._driver.set_run_current(axis, current or motion_params.current or 0) if any([speed, acceleration]): motion_params.max_speed = speed or motion_params.max_speed motion_params.acceleration = acceleration or motion_params.acceleration distance = direction.distance(distance) - success = await self._driver.move_in_mm(axis, distance, params=motion_params) - # TODO: This can return a stall, handle that here - return success == MoveResult.NO_ERROR + res = await self._driver.move_in_mm(axis, distance, params=motion_params) + if res == MoveResult.STALL_ERROR: + self._stall_detected = True + raise FlexStackerStallError(self.device_info["serial"], axis) + return res == MoveResult.NO_ERROR async def home_axis( self, @@ -257,6 +291,7 @@ async def home_axis( acceleration: Optional[float] = None, current: Optional[float] = None, ) -> bool: + await self.reset_stall_detected() motion_params = STACKER_MOTION_CONFIG[axis]["home"] await self._driver.set_run_current(axis, current or motion_params.current or 0) # Set the max hold current for the Z axis @@ -268,7 +303,9 @@ async def home_axis( success = await self._driver.move_to_limit_switch( axis=axis, direction=direction, params=motion_params ) - # TODO: This can return a stall, handle that here + if success == MoveResult.STALL_ERROR: + self._stall_detected = True + raise FlexStackerStallError(self.device_info["serial"], axis) return success == MoveResult.NO_ERROR async def close_latch( @@ -313,7 +350,7 @@ async def open_latch( # to open the latch. success = await self.move_axis( StackerAxis.L, - Direction.EXTENT, + Direction.EXTEND, distance=distance, speed=speed, acceleration=accel, @@ -329,7 +366,7 @@ async def dispense_labware(self, labware_height: float) -> bool: # Move platform along the X then Z axis await self._move_and_home_axis(StackerAxis.X, Direction.RETRACT, OFFSET_SM) - await self._move_and_home_axis(StackerAxis.Z, Direction.EXTENT, OFFSET_SM) + await self._move_and_home_axis(StackerAxis.Z, Direction.EXTEND, OFFSET_SM) # Transfer await self.open_latch() @@ -339,7 +376,7 @@ async def dispense_labware(self, labware_height: float) -> bool: # Move platform along the Z then X axis offset = labware_height / 2 + OFFSET_MD await self._move_and_home_axis(StackerAxis.Z, Direction.RETRACT, offset) - await self._move_and_home_axis(StackerAxis.X, Direction.EXTENT, OFFSET_SM) + await self._move_and_home_axis(StackerAxis.X, Direction.EXTEND, OFFSET_SM) return True async def store_labware(self, labware_height: float) -> bool: @@ -350,17 +387,17 @@ async def store_labware(self, labware_height: float) -> bool: offset = OFFSET_MD if labware_height < MEDIUM_LABWARE_Z_LIMIT else OFFSET_LG * 2 distance = MAX_TRAVEL[StackerAxis.Z] - (labware_height / 2) - offset await self._move_and_home_axis(StackerAxis.X, Direction.RETRACT, OFFSET_SM) - await self.move_axis(StackerAxis.Z, Direction.EXTENT, distance) + await self.move_axis(StackerAxis.Z, Direction.EXTEND, distance) # Transfer await self.open_latch() - await self.move_axis(StackerAxis.Z, Direction.EXTENT, (labware_height / 2)) - await self.home_axis(StackerAxis.Z, Direction.EXTENT) + await self.move_axis(StackerAxis.Z, Direction.EXTEND, (labware_height / 2)) + await self.home_axis(StackerAxis.Z, Direction.EXTEND) await self.close_latch() # Move Z then X axis await self._move_and_home_axis(StackerAxis.Z, Direction.RETRACT, OFFSET_LG) - await self._move_and_home_axis(StackerAxis.X, Direction.EXTENT, OFFSET_SM) + await self._move_and_home_axis(StackerAxis.X, Direction.EXTEND, OFFSET_SM) return True async def _move_and_home_axis( @@ -373,7 +410,7 @@ async def _move_and_home_axis( async def _prepare_for_action(self) -> bool: """Helper to prepare axis for dispensing or storing labware.""" # TODO: check if we need to home first - await self.home_axis(StackerAxis.X, Direction.EXTENT) + await self.home_axis(StackerAxis.X, Direction.EXTEND) await self.home_axis(StackerAxis.Z, Direction.RETRACT) await self.close_latch() return True @@ -406,9 +443,7 @@ async def get_limit_switch_status(self) -> None: """Get the limit switch status.""" status = await self._driver.get_limit_switches_status() self.limit_switch_status = { - StackerAxis.X: StackerAxisState.from_status(status, StackerAxis.X), - StackerAxis.Z: StackerAxisState.from_status(status, StackerAxis.Z), - StackerAxis.L: StackerAxisState.from_status(status, StackerAxis.L), + axis: StackerAxisState.from_status(status, axis) for axis in StackerAxis } async def get_motion_parameters(self) -> None: @@ -427,6 +462,7 @@ async def get_door_closed(self) -> None: self.hopper_door_closed = await self._driver.get_hopper_door_closed() def on_error(self, exception: Exception) -> None: + self._driver.reset_serial_buffers() self._set_error(exception) def _set_error(self, exception: Optional[Exception]) -> None: diff --git a/api/tests/opentrons/drivers/flex_stacker/test_driver.py b/api/tests/opentrons/drivers/flex_stacker/test_driver.py index 1de13c569cb..1c77e381e9b 100644 --- a/api/tests/opentrons/drivers/flex_stacker/test_driver.py +++ b/api/tests/opentrons/drivers/flex_stacker/test_driver.py @@ -3,7 +3,7 @@ from opentrons.drivers.asyncio.communication.serial_connection import ( AsyncResponseSerialConnection, ) -from opentrons.drivers.flex_stacker.driver import FlexStackerDriver +from opentrons.drivers.flex_stacker.driver import FS_MOVE_TIMEOUT, FlexStackerDriver from opentrons.drivers.flex_stacker import types @@ -22,14 +22,16 @@ async def test_get_device_info( subject: FlexStackerDriver, connection: AsyncMock ) -> None: """It should send a get device info command""" - connection.send_command.return_value = ( - "M115 FW:0.0.1 HW:Opentrons-flex-stacker-a1 SerialNo:STCA120230605001" - ) + connection.send_command.side_effect = [ + "M115 FW:0.0.1 HW:Opentrons-flex-stacker-a1 SerialNo:STCA120230605001", + "M114 R:0", + ] response = await subject.get_device_info() assert response == types.StackerInfo( fw="0.0.1", hw=types.HardwareRevision.EVT, sn="STCA120230605001", + rr=0, ) device_info = types.GCODE.DEVICE_INFO.build_command() @@ -39,16 +41,19 @@ async def test_get_device_info( connection.reset_mock() # Test invalid response - connection.send_command.return_value = "M115 FW:0.0.1 SerialNo:STCA120230605001" + connection.send_command.side_effect = [ + "M115 FW:0.0.1 SerialNo:STCA120230605001", + "M114 R:0", + ] # This should raise ValueError with pytest.raises(ValueError): response = await subject.get_device_info() device_info = types.GCODE.DEVICE_INFO.build_command() - reset_reason = types.GCODE.GET_RESET_REASON.build_command() connection.send_command.assert_any_call(device_info) - connection.send_command.assert_called_with(reset_reason) + # M115 response is invalid, so we dont send M114. + connection.send_command.assert_called_once() async def test_stop_motors(subject: FlexStackerDriver, connection: AsyncMock) -> None: @@ -93,7 +98,7 @@ async def test_set_serial_number( """It should send a set serial number command""" connection.send_command.return_value = "M996" - serial_number = "Something" + serial_number = "FSTA1020250119001" response = await subject.set_serial_number(serial_number) assert response @@ -114,6 +119,13 @@ async def test_set_serial_number( connection.send_command.assert_any_call(set_serial_number) connection.reset_mock() + # Test invalid serial number + with pytest.raises(ValueError): + response = await subject.set_serial_number("invalid") + + connection.send_command.assert_not_called() + connection.reset_mock() + async def test_enable_motors(subject: FlexStackerDriver, connection: AsyncMock) -> None: """It should send a enable motors command""" @@ -147,7 +159,7 @@ async def test_get_limit_switch( """It should send a get limit switch command and return the boolean of one.""" connection.send_command.return_value = "M119 XE:1 XR:0 ZE:0 ZR:1 LR:1" response = await subject.get_limit_switch( - types.StackerAxis.X, types.Direction.EXTENT + types.StackerAxis.X, types.Direction.EXTEND ) assert response @@ -188,7 +200,7 @@ async def test_get_platform_sensor( ) -> None: """It should send a get platform sensor command return status of specified sensor.""" connection.send_command.return_value = "M121 E:1 R:1" - response = await subject.get_platform_sensor(types.Direction.EXTENT) + response = await subject.get_platform_sensor(types.Direction.EXTEND) assert response platform_sensor = types.GCODE.GET_PLATFORM_SENSOR.build_command() @@ -259,7 +271,7 @@ async def test_move_in_mm(subject: FlexStackerDriver, connection: AsyncMock) -> assert response move_to = types.GCODE.MOVE_TO.build_command().add_float("X", 10) - connection.send_command.assert_any_call(move_to) + connection.send_command.assert_any_call(move_to, timeout=FS_MOVE_TIMEOUT) connection.reset_mock() @@ -269,14 +281,14 @@ async def test_move_to_switch( """It should send a move to switch command""" connection.send_command.return_value = "G5" axis = types.StackerAxis.X - direction = types.Direction.EXTENT + direction = types.Direction.EXTEND response = await subject.move_to_limit_switch(axis, direction) assert response move_to = types.GCODE.MOVE_TO_SWITCH.build_command().add_int( axis.name, direction.value ) - connection.send_command.assert_any_call(move_to) + connection.send_command.assert_any_call(move_to, timeout=FS_MOVE_TIMEOUT) connection.reset_mock() @@ -284,12 +296,12 @@ async def test_home_axis(subject: FlexStackerDriver, connection: AsyncMock) -> N """It should send a home axis command""" connection.send_command.return_value = "G28" axis = types.StackerAxis.X - direction = types.Direction.EXTENT + direction = types.Direction.EXTEND response = await subject.home_axis(axis, direction) assert response move_to = types.GCODE.HOME_AXIS.build_command().add_int(axis.name, direction.value) - connection.send_command.assert_any_call(move_to) + connection.send_command.assert_any_call(move_to, timeout=FS_MOVE_TIMEOUT) connection.reset_mock() @@ -302,3 +314,90 @@ async def test_set_led(subject: FlexStackerDriver, connection: AsyncMock) -> Non set_led = types.GCODE.SET_LED.build_command().add_float("P", 1).add_int("C", 1) connection.send_command.assert_any_call(set_led) connection.reset_mock() + + # test setting only external leds + response = await subject.set_led(1, types.LEDColor.RED, external=True) + assert response + + set_led = ( + types.GCODE.SET_LED.build_command() + .add_float("P", 1) + .add_int("C", 1) + .add_int("K", 1) + ) + connection.send_command.assert_any_call(set_led) + connection.reset_mock() + + +async def test_get_stallguard_threshold( + subject: FlexStackerDriver, connection: AsyncMock +) -> None: + """It should get the stallguard threshold.""" + connection.send_command.return_value = "M911 Z:1 T:2" + response = await subject.get_stallguard_threshold(types.StackerAxis.Z) + assert response == types.StallGuardParams(types.StackerAxis.Z, True, 2) + + get_theshold = types.GCODE.GET_STALLGUARD_THRESHOLD.build_command().add_element( + types.StackerAxis.Z.name + ) + connection.send_command.assert_any_call(get_theshold) + connection.reset_mock() + + +async def test_set_stallguard_threshold( + subject: FlexStackerDriver, connection: AsyncMock +) -> None: + """It should set the stallguard threshold.""" + axis = types.StackerAxis.Z + enable = True + threshold = 2 + connection.send_command.return_value = "M910" + response = await subject.set_stallguard_threshold(axis, enable, threshold) + assert response + + set_threshold = ( + types.GCODE.SET_STALLGUARD.build_command() + .add_int(axis.name, int(enable)) + .add_int("T", threshold) + ) + connection.send_command.assert_any_call(set_threshold) + connection.reset_mock() + + # test invalid threshold + with pytest.raises(ValueError): + response = await subject.set_stallguard_threshold(axis, enable, 1000) + + connection.send_command.assert_not_called() + connection.reset_mock() + + +async def test_get_motor_driver_register( + subject: FlexStackerDriver, connection: AsyncMock +) -> None: + """It should get the motor driver register.""" + connection.send_command.return_value = "M920 Z:1 V:2" + response = await subject.get_motor_driver_register(types.StackerAxis.Z, 1) + assert response == 2 + + get_register = types.GCODE.GET_MOTOR_DRIVER_REGISTER.build_command().add_int( + types.StackerAxis.Z.name, 1 + ) + connection.send_command.assert_any_call(get_register) + connection.reset_mock() + + +async def test_set_motor_driver_register( + subject: FlexStackerDriver, connection: AsyncMock +) -> None: + """It should set the motor driver register.""" + connection.send_command.return_value = "M921" + response = await subject.set_motor_driver_register(types.StackerAxis.Z, 1, 2) + assert response + + set_register = ( + types.GCODE.SET_MOTOR_DRIVER_REGISTER.build_command() + .add_int(types.StackerAxis.Z.name, 1) + .add_element(str(2)) + ) + connection.send_command.assert_any_call(set_register) + connection.reset_mock() From 266148833070577775cc8ce8437feb9188a5d125 Mon Sep 17 00:00:00 2001 From: Ryan Howard Date: Wed, 29 Jan 2025 10:01:47 -0500 Subject: [PATCH 038/150] fix(api): Use the latest information when estimating liquid height (#17374) # Overview There was a bug in the estimation code under the following scenario Well volume is set with Load Liquid Well is then probed Well is operated on and the probed volume and loaded volume are updated based on the operation Future well operations are based on the load liquid and not the probe because it happened to be first in the "is_valid" check Now the well volume after an operation is based on which happened LAST load_liquid or liquid probe. ## Test Plan and Hands on Testing ## Changelog ## Review requests ## Risk assessment --- .../protocol_engine/state/geometry.py | 12 +- .../opentrons/protocol_engine/state/wells.py | 17 ++ .../state/test_geometry_view.py | 166 +++++++++++++++++- 3 files changed, 187 insertions(+), 8 deletions(-) diff --git a/api/src/opentrons/protocol_engine/state/geometry.py b/api/src/opentrons/protocol_engine/state/geometry.py index cf6b4521713..9a817564c67 100644 --- a/api/src/opentrons/protocol_engine/state/geometry.py +++ b/api/src/opentrons/protocol_engine/state/geometry.py @@ -1448,17 +1448,25 @@ def get_meniscus_height( well_name: str, ) -> float: """Returns stored meniscus height in specified well.""" + last_updated = self._wells.get_last_liquid_update(labware_id, well_name) + if last_updated is None: + raise errors.LiquidHeightUnknownError( + "Must LiquidProbe or LoadLiquid before specifying WellOrigin.MENISCUS." + ) + well_liquid = self._wells.get_well_liquid_info( labware_id=labware_id, well_name=well_name ) if ( well_liquid.probed_height is not None and well_liquid.probed_height.height is not None + and well_liquid.probed_height.last_probed == last_updated ): return well_liquid.probed_height.height elif ( well_liquid.loaded_volume is not None and well_liquid.loaded_volume.volume is not None + and well_liquid.loaded_volume.last_loaded == last_updated ): return self.get_well_height_at_volume( labware_id=labware_id, @@ -1468,6 +1476,7 @@ def get_meniscus_height( elif ( well_liquid.probed_volume is not None and well_liquid.probed_volume.volume is not None + and well_liquid.probed_volume.last_probed == last_updated ): return self.get_well_height_at_volume( labware_id=labware_id, @@ -1475,8 +1484,9 @@ def get_meniscus_height( volume=well_liquid.probed_volume.volume, ) else: + # This should not happen if there was an update but who knows raise errors.LiquidHeightUnknownError( - "Must LiquidProbe or LoadLiquid before specifying WellOrigin.MENISCUS." + f"Unable to find liquid height despite an update at {last_updated}." ) def get_well_handling_height( diff --git a/api/src/opentrons/protocol_engine/state/wells.py b/api/src/opentrons/protocol_engine/state/wells.py index fdcb8322094..727ef20da59 100644 --- a/api/src/opentrons/protocol_engine/state/wells.py +++ b/api/src/opentrons/protocol_engine/state/wells.py @@ -2,6 +2,7 @@ from dataclasses import dataclass from typing import Dict, List, Union, Iterator, Optional, Tuple, overload, TypeVar +from datetime import datetime from opentrons.protocol_engine.types import ( ProbedHeightInfo, @@ -177,6 +178,22 @@ def get_well_liquid_info(self, labware_id: str, well_name: str) -> WellLiquidInf probed_volume=probed_volume_info, ) + def get_last_liquid_update( + self, labware_id: str, well_name: str + ) -> Optional[datetime]: + """Return the timestamp of the last load or probe done on the well.""" + info = self.get_well_liquid_info(labware_id, well_name) + update_times: List[datetime] = [] + if info.loaded_volume is not None and info.loaded_volume.volume is not None: + update_times.append(info.loaded_volume.last_loaded) + if info.probed_height is not None and info.probed_height.height is not None: + update_times.append(info.probed_height.last_probed) + if info.probed_volume is not None and info.probed_volume.volume is not None: + update_times.append(info.probed_volume.last_probed) + if len(update_times) > 0: + return max(update_times) + return None + def get_all(self) -> List[WellInfoSummary]: """Get all well liquid info summaries.""" diff --git a/api/tests/opentrons/protocol_engine/state/test_geometry_view.py b/api/tests/opentrons/protocol_engine/state/test_geometry_view.py index bf82c17c6bc..f5f86fc8c4c 100644 --- a/api/tests/opentrons/protocol_engine/state/test_geometry_view.py +++ b/api/tests/opentrons/protocol_engine/state/test_geometry_view.py @@ -62,6 +62,7 @@ TipGeometry, ModuleDefinition, ProbedHeightInfo, + ProbedVolumeInfo, LoadedVolumeInfo, WellLiquidInfo, ) @@ -1577,10 +1578,14 @@ def test_get_well_position_with_meniscus_offset( decoy.when(mock_labware_view.get_well_definition("labware-id", "B2")).then_return( well_def ) + probe_time = datetime.now() + decoy.when(mock_well_view.get_last_liquid_update("labware-id", "B2")).then_return( + probe_time + ) decoy.when(mock_well_view.get_well_liquid_info("labware-id", "B2")).then_return( WellLiquidInfo( probed_volume=None, - probed_height=ProbedHeightInfo(height=70.5, last_probed=datetime.now()), + probed_height=ProbedHeightInfo(height=70.5, last_probed=probe_time), loaded_volume=None, ) ) @@ -1639,10 +1644,14 @@ def test_get_well_position_with_volume_offset_raises_error( decoy.when(mock_labware_view.get_well_definition("labware-id", "B2")).then_return( well_def ) + probe_time = datetime.now() + decoy.when(mock_well_view.get_last_liquid_update("labware-id", "B2")).then_return( + probe_time + ) decoy.when(mock_well_view.get_well_liquid_info("labware-id", "B2")).then_return( WellLiquidInfo( loaded_volume=None, - probed_height=ProbedHeightInfo(height=45.0, last_probed=datetime.now()), + probed_height=ProbedHeightInfo(height=45.0, last_probed=probe_time), probed_volume=None, ) ) @@ -1698,13 +1707,17 @@ def test_get_well_position_with_meniscus_and_literal_volume_offset( decoy.when( mock_addressable_area_view.get_addressable_area_position(DeckSlotName.SLOT_4.id) ).then_return(slot_pos) + probe_time = datetime.now() + decoy.when(mock_well_view.get_last_liquid_update("labware-id", "B2")).then_return( + probe_time + ) decoy.when(mock_labware_view.get_well_definition("labware-id", "B2")).then_return( well_def ) decoy.when(mock_well_view.get_well_liquid_info("labware-id", "B2")).then_return( WellLiquidInfo( loaded_volume=None, - probed_height=ProbedHeightInfo(height=45.0, last_probed=datetime.now()), + probed_height=ProbedHeightInfo(height=45.0, last_probed=probe_time), probed_volume=None, ) ) @@ -1771,10 +1784,14 @@ def test_get_well_position_with_meniscus_and_float_volume_offset( decoy.when(mock_labware_view.get_well_definition("labware-id", "B2")).then_return( well_def ) + probe_time = datetime.now() + decoy.when(mock_well_view.get_last_liquid_update("labware-id", "B2")).then_return( + probe_time + ) decoy.when(mock_well_view.get_well_liquid_info("labware-id", "B2")).then_return( WellLiquidInfo( loaded_volume=None, - probed_height=ProbedHeightInfo(height=45.0, last_probed=datetime.now()), + probed_height=ProbedHeightInfo(height=45.0, last_probed=probe_time), probed_volume=None, ) ) @@ -1840,10 +1857,14 @@ def test_get_well_position_raises_validation_error( decoy.when(mock_labware_view.get_well_definition("labware-id", "B2")).then_return( well_def ) + probe_time = datetime.now() + decoy.when(mock_well_view.get_last_liquid_update("labware-id", "B2")).then_return( + probe_time + ) decoy.when(mock_well_view.get_well_liquid_info("labware-id", "B2")).then_return( WellLiquidInfo( loaded_volume=None, - probed_height=ProbedHeightInfo(height=40.0, last_probed=datetime.now()), + probed_height=ProbedHeightInfo(height=40.0, last_probed=probe_time), probed_volume=None, ) ) @@ -1905,10 +1926,14 @@ def test_get_meniscus_height( decoy.when(mock_labware_view.get_well_definition("labware-id", "B2")).then_return( well_def ) + probe_time = datetime.now() + decoy.when(mock_well_view.get_last_liquid_update("labware-id", "B2")).then_return( + probe_time + ) decoy.when(mock_well_view.get_well_liquid_info("labware-id", "B2")).then_return( WellLiquidInfo( loaded_volume=LoadedVolumeInfo( - volume=2000.0, last_loaded=datetime.now(), operations_since_load=0 + volume=2000.0, last_loaded=probe_time, operations_since_load=0 ), probed_height=None, probed_volume=None, @@ -3349,10 +3374,14 @@ def test_validate_dispense_volume_into_well_meniscus( decoy.when(mock_labware_view.get_well_geometry("labware-id", "A1")).then_return( inner_well_def ) + probe_time = datetime.now() + decoy.when(mock_well_view.get_last_liquid_update("labware-id", "A1")).then_return( + probe_time + ) decoy.when(mock_well_view.get_well_liquid_info("labware-id", "A1")).then_return( WellLiquidInfo( loaded_volume=None, - probed_height=ProbedHeightInfo(height=40.0, last_probed=datetime.now()), + probed_height=ProbedHeightInfo(height=40.0, last_probed=probe_time), probed_volume=None, ) ) @@ -3369,6 +3398,129 @@ def test_validate_dispense_volume_into_well_meniscus( ) +def test_get_latest_volume_information( + decoy: Decoy, + mock_labware_view: LabwareView, + mock_well_view: WellView, + subject: GeometryView, +) -> None: + """It should raise an InvalidDispenseVolumeError if too much volume is specified.""" + # Setup + labware_def = _load_labware_definition_data() + assert labware_def.wells is not None + well_def = labware_def.wells["A1"] + assert labware_def.innerLabwareGeometry is not None + inner_well_def = labware_def.innerLabwareGeometry["welldefinition1111"] + + load_time = datetime.min + probe_time = datetime.now() + + decoy.when(mock_labware_view.get_well_definition("labware-id", "A1")).then_return( + well_def + ) + decoy.when(mock_labware_view.get_well_geometry("labware-id", "A1")).then_return( + inner_well_def + ) + ten_ul_height = subject.get_well_height_at_volume( + labware_id="labware-id", well_name="A1", volume=10.0 + ) + twenty_ul_height = subject.get_well_height_at_volume( + labware_id="labware-id", well_name="A1", volume=20.0 + ) + + # Make sure Get height with no information raises an error + decoy.when(mock_well_view.get_last_liquid_update("labware-id", "A1")).then_return( + None + ) + decoy.when(mock_well_view.get_well_liquid_info("labware-id", "A1")).then_return( + WellLiquidInfo( + loaded_volume=None, + probed_height=None, + probed_volume=None, + ) + ) + decoy.when(mock_well_view.get_last_liquid_update("labware-id", "A1")).then_return( + None + ) + + with pytest.raises(errors.LiquidHeightUnknownError): + subject.get_meniscus_height(labware_id="labware-id", well_name="A1") + # Make sure get height with a valid load returns the correct height + decoy.when(mock_well_view.get_well_liquid_info("labware-id", "A1")).then_return( + WellLiquidInfo( + loaded_volume=LoadedVolumeInfo( + volume=10.0, last_loaded=load_time, operations_since_load=0 + ), + probed_height=None, + probed_volume=None, + ) + ) + + decoy.when(mock_well_view.get_last_liquid_update("labware-id", "A1")).then_return( + load_time + ) + assert ( + subject.get_meniscus_height(labware_id="labware-id", well_name="A1") + == ten_ul_height + ) + + # Make sure that if there is a probe after a load that we get the correct height + decoy.when(mock_well_view.get_well_liquid_info("labware-id", "A1")).then_return( + WellLiquidInfo( + loaded_volume=LoadedVolumeInfo( + volume=10.0, last_loaded=load_time, operations_since_load=0 + ), + probed_height=ProbedHeightInfo(height=40.0, last_probed=probe_time), + probed_volume=None, + ) + ) + decoy.when(mock_well_view.get_last_liquid_update("labware-id", "A1")).then_return( + probe_time + ) + + assert subject.get_meniscus_height(labware_id="labware-id", well_name="A1") == 40.0 + + # Simulate a pipetting action and make sure we get the height based on the most current one + decoy.when(mock_well_view.get_well_liquid_info("labware-id", "A1")).then_return( + WellLiquidInfo( + loaded_volume=LoadedVolumeInfo( + volume=10.0, last_loaded=load_time, operations_since_load=1 + ), + probed_height=None, + probed_volume=ProbedVolumeInfo( + volume=20.0, last_probed=probe_time, operations_since_probe=1 + ), + ) + ) + decoy.when(mock_well_view.get_last_liquid_update("labware-id", "A1")).then_return( + probe_time + ) + assert ( + subject.get_meniscus_height(labware_id="labware-id", well_name="A1") + == twenty_ul_height + ) + + # Simulate a calling load_liquid after a probe and make sure we get the height based on the load_liquid + decoy.when(mock_well_view.get_well_liquid_info("labware-id", "A1")).then_return( + WellLiquidInfo( + loaded_volume=LoadedVolumeInfo( + volume=10.0, last_loaded=datetime.max, operations_since_load=0 + ), + probed_height=ProbedHeightInfo(height=40.0, last_probed=probe_time), + probed_volume=ProbedVolumeInfo( + volume=20.0, last_probed=probe_time, operations_since_probe=0 + ), + ) + ) + decoy.when(mock_well_view.get_last_liquid_update("labware-id", "A1")).then_return( + datetime.max + ) + assert ( + subject.get_meniscus_height(labware_id="labware-id", well_name="A1") + == ten_ul_height + ) + + @pytest.mark.parametrize( [ "labware_id", From 16bd893b30dbaf1ffb3d46fc258f1f0966b94867 Mon Sep 17 00:00:00 2001 From: Jethary Alcid <66035149+jerader@users.noreply.github.com> Date: Wed, 29 Jan 2025 12:50:46 -0500 Subject: [PATCH 039/150] feat(protocol-designer): timeline scrubber to the overview page (#17301) Some skunkwork that adds the timeline scrubber to PD's overview behind a feature flag. --- .../ProtocolDetails/ProtocolTimeline.tsx | 6 +- .../ProtocolTimelineScrubber/index.tsx | 47 +++-- .../ProtocolTimelineScrubber/utils.ts | 8 +- .../assets/localization/en/feature_flags.json | 4 + .../src/assets/localization/en/index.ts | 2 + .../en/protocol_command_text.json | 100 +++++++++ .../src/feature-flags/reducers.ts | 2 + .../src/feature-flags/selectors.ts | 4 + protocol-designer/src/feature-flags/types.ts | 2 + .../src/file-data/selectors/fileCreator.ts | 183 +--------------- .../src/file-data/selectors/utils.ts | 195 ++++++++++++++++++ .../ProtocolOverview/ScrubberContainer.tsx | 172 +++++++++++++++ .../src/pages/ProtocolOverview/index.tsx | 5 +- .../utils/createTimelineFromRunCommands.ts | 6 +- step-generation/src/utils/index.ts | 2 + 15 files changed, 529 insertions(+), 209 deletions(-) create mode 100644 protocol-designer/src/assets/localization/en/protocol_command_text.json create mode 100644 protocol-designer/src/file-data/selectors/utils.ts create mode 100644 protocol-designer/src/pages/ProtocolOverview/ScrubberContainer.tsx diff --git a/app/src/pages/Desktop/Protocols/ProtocolDetails/ProtocolTimeline.tsx b/app/src/pages/Desktop/Protocols/ProtocolDetails/ProtocolTimeline.tsx index cb316e5e734..9651dcbc477 100644 --- a/app/src/pages/Desktop/Protocols/ProtocolDetails/ProtocolTimeline.tsx +++ b/app/src/pages/Desktop/Protocols/ProtocolDetails/ProtocolTimeline.tsx @@ -27,11 +27,7 @@ export function ProtocolTimeline(): JSX.Element { return storedProtocol != null && storedProtocol.mostRecentAnalysis != null ? ( - + ) : ( diff --git a/components/src/organisms/ProtocolTimelineScrubber/index.tsx b/components/src/organisms/ProtocolTimelineScrubber/index.tsx index ffcd328dd48..845103786c1 100644 --- a/components/src/organisms/ProtocolTimelineScrubber/index.tsx +++ b/components/src/organisms/ProtocolTimelineScrubber/index.tsx @@ -3,7 +3,10 @@ import map from 'lodash/map' import reduce from 'lodash/reduce' import ViewportList from 'react-viewport-list' -import { getResultingTimelineFrameFromRunCommands } from '@opentrons/step-generation' +import { + constructInvariantContextFromRunCommands, + getResultingTimelineFrameFromRunCommands, +} from '@opentrons/step-generation' import { FLEX_ROBOT_TYPE, THERMOCYCLER_MODULE_TYPE, @@ -36,11 +39,10 @@ import type { CompletedProtocolAnalysis, LabwareLocation, ProtocolAnalysisOutput, - RobotType, - RunTimeCommand, } from '@opentrons/shared-data' import type { ModuleTemporalProperties } from '@opentrons/step-generation' import type { LabwareOnDeck, Module } from '../..' + export * from './types' export * from './utils' @@ -48,9 +50,8 @@ const SEC_PER_FRAME = 1000 export const COMMAND_WIDTH_PX = 240 interface ProtocolTimelineScrubberProps { - commands: RunTimeCommand[] analysis: CompletedProtocolAnalysis | ProtocolAnalysisOutput - robotType?: RobotType + height?: string } export const DECK_LAYER_BLOCKLIST = [ @@ -62,23 +63,24 @@ export const DECK_LAYER_BLOCKLIST = [ 'removableDeckOutline', 'screwHoles', ] -export const VIEWBOX_MIN_X = -84 -export const VIEWBOX_MIN_Y = -10 -export const VIEWBOX_WIDTH = 600 -export const VIEWBOX_HEIGHT = 460 export function ProtocolTimelineScrubber( props: ProtocolTimelineScrubberProps ): JSX.Element { - const { commands, analysis, robotType = FLEX_ROBOT_TYPE } = props + const { analysis, height } = props + const { commands, robotType, liquids } = analysis const wrapperRef = useRef(null) const commandListRef = useRef(null) const [currentCommandIndex, setCurrentCommandIndex] = useState(0) const [isPlaying, setIsPlaying] = useState(true) const currentCommandsSlice = commands.slice(0, currentCommandIndex + 1) + const invariantContextFromRunCommands = constructInvariantContextFromRunCommands( + commands + ) const { frame, invariantContext } = getResultingTimelineFrameFromRunCommands( - currentCommandsSlice + currentCommandsSlice, + invariantContextFromRunCommands ) const handlePlayPause = (): void => { setIsPlaying(!isPlaying) @@ -120,31 +122,28 @@ export function ProtocolTimelineScrubber( const allWellContentsForActiveItem = getAllWellContentsForActiveItem( invariantContext.labwareEntities, - frame + robotState ) - const liquidDisplayColors = analysis.liquids.map( - liquid => liquid.displayColor ?? COLORS.blue50 + const liquidDisplayColors = liquids.map( + ({ displayColor }) => displayColor ?? COLORS.blue50 ) const isValidRobotSideAnalysis = analysis != null const allRunDefs = useMemo( - () => - analysis != null - ? getLabwareDefinitionsFromCommands(analysis.commands) - : [], + () => getLabwareDefinitionsFromCommands(commands), [isValidRobotSideAnalysis] ) return ( - + { const labwareInModuleId = @@ -263,14 +262,14 @@ export function ProtocolTimelineScrubber( mount="left" pipetteId={leftPipetteId} pipetteEntity={leftPipetteEntity} - timelineFrame={frame.robotState} + timelineFrame={robotState} analysis={analysis} /> @@ -293,7 +292,7 @@ export function ProtocolTimelineScrubber( currentCommandIndex={currentCommandIndex} setCurrentCommandIndex={setCurrentCommandIndex} analysis={analysis} - robotType={robotType} + robotType={robotType ?? FLEX_ROBOT_TYPE} allRunDefs={allRunDefs} /> )} diff --git a/components/src/organisms/ProtocolTimelineScrubber/utils.ts b/components/src/organisms/ProtocolTimelineScrubber/utils.ts index 531cdf86976..44b48e30bc4 100644 --- a/components/src/organisms/ProtocolTimelineScrubber/utils.ts +++ b/components/src/organisms/ProtocolTimelineScrubber/utils.ts @@ -13,8 +13,8 @@ import type { import type { LabwareEntities, LocationLiquidState, - RunCommandTimelineFrame, SingleLabwareLiquidState, + TimelineFrame, } from '@opentrons/step-generation' import type { CommandTextData } from './types' @@ -127,11 +127,11 @@ export const wellFillFromWellContents = ( export function getAllWellContentsForActiveItem( labwareEntities: LabwareEntities, - timelineFrame: RunCommandTimelineFrame + robotState: TimelineFrame ): WellContentsByLabware | null { - if (timelineFrame == null) return null + if (robotState == null) return null - const liquidState = timelineFrame.robotState.liquidState.labware + const liquidState = robotState.liquidState.labware const wellContentsByLabwareId = mapValues( liquidState, (labwareLiquids: SingleLabwareLiquidState, labwareId: string) => { diff --git a/protocol-designer/src/assets/localization/en/feature_flags.json b/protocol-designer/src/assets/localization/en/feature_flags.json index 851f8deb5a9..d2077d224ea 100644 --- a/protocol-designer/src/assets/localization/en/feature_flags.json +++ b/protocol-designer/src/assets/localization/en/feature_flags.json @@ -31,5 +31,9 @@ "OT_PD_ENABLE_LIQUID_CLASSES": { "title": "Enable liquid classes", "description": "Enable liquid classes support" + }, + "OT_PD_ENABLE_TIMELINE_SCRUBBER": { + "title": "Enable timeline scrubber", + "description": "See the protocol timeline visualization in overview" } } diff --git a/protocol-designer/src/assets/localization/en/index.ts b/protocol-designer/src/assets/localization/en/index.ts index 68ed9877a8e..7cb72b02f54 100644 --- a/protocol-designer/src/assets/localization/en/index.ts +++ b/protocol-designer/src/assets/localization/en/index.ts @@ -11,6 +11,7 @@ import liquids from './liquids.json' import modal from './modal.json' import modules from './modules.json' import nav from './nav.json' +import protocol_command_text from './protocol_command_text.json' import protocol_overview from './protocol_overview.json' import protocol_steps from './protocol_steps.json' import shared from './shared.json' @@ -32,6 +33,7 @@ export const en = { modal, modules, nav, + protocol_command_text, protocol_overview, protocol_steps, shared, diff --git a/protocol-designer/src/assets/localization/en/protocol_command_text.json b/protocol-designer/src/assets/localization/en/protocol_command_text.json new file mode 100644 index 00000000000..8037b8f2778 --- /dev/null +++ b/protocol-designer/src/assets/localization/en/protocol_command_text.json @@ -0,0 +1,100 @@ +{ + "absorbance_reader_close_lid": "Closing Absorbance Reader lid", + "absorbance_reader_initialize": "Initializing Absorbance Reader to perform {{mode}} measurement at {{wavelengths}}", + "absorbance_reader_open_lid": "Opening Absorbance Reader lid", + "absorbance_reader_read": "Reading plate in Absorbance Reader", + "adapter_in_mod_in_slot": "{{adapter}} on {{module}} in Slot {{slot}}", + "adapter_in_slot": "{{adapter}} in Slot {{slot}}", + "air_gap_in_place": "Air gapping {{volume}} µL", + "all_nozzles": "all nozzles", + "aspirate": "Aspirating {{volume}} µL from well {{well_name}} of {{labware}} in {{labware_location}} at {{flow_rate}} µL/sec", + "aspirate_in_place": "Aspirating {{volume}} µL in place at {{flow_rate}} µL/sec ", + "blowout": "Blowing out at well {{well_name}} of {{labware}} in {{labware_location}} at {{flow_rate}} µL/sec", + "blowout_in_place": "Blowing out in place at {{flow_rate}} µL/sec", + "closing_tc_lid": "Closing Thermocycler lid", + "column_layout": "column layout", + "comment": "Comment", + "configure_for_volume": "Configure {{pipette}} to aspirate {{volume}} µL", + "configure_nozzle_layout": "Configure {{pipette}} to use {{layout}}", + "confirm_and_resume": "Confirm and resume", + "deactivate_hs_shake": "Deactivating shaker", + "deactivate_temperature_module": "Deactivating Temperature Module", + "deactivating_hs_heater": "Deactivating heater", + "deactivating_tc_block": "Deactivating Thermocycler block", + "deactivating_tc_lid": "Deactivating Thermocycler lid", + "degrees_c": "{{temp}}°C", + "detect_liquid_presence": "Detecting liquid presence in well {{well_name}} of {{labware}} in {{labware_location}}", + "disengaging_magnetic_module": "Disengaging Magnetic Module", + "dispense": "Dispensing {{volume}} µL into well {{well_name}} of {{labware}} in {{labware_location}} at {{flow_rate}} µL/sec", + "dispense_in_place": "Dispensing {{volume}} µL in place at {{flow_rate}} µL/sec", + "dispense_push_out": "Dispensing {{volume}} µL into well {{well_name}} of {{labware}} in {{labware_location}} at {{flow_rate}} µL/sec and pushing out {{push_out_volume}} µL", + "drop_tip": "Dropping tip in {{well_name}} of {{labware}}", + "drop_tip_in_place": "Dropping tip in place", + "dropping_tip_in_trash": "Dropping tip in {{trash}}", + "engaging_magnetic_module": "Engaging Magnetic Module", + "fixed_trash": "Fixed Trash", + "home_gantry": "Homing all gantry, pipette, and plunger axes", + "in_location": "in {{location}}", + "latching_hs_latch": "Latching labware on Heater-Shaker", + "left": "Left", + "load_labware_to_display_location": "Load {{labware}} {{display_location}}", + "load_liquids_info_protocol_setup": "Load {{liquid}} into {{labware}}", + "load_module_protocol_setup": "Load {{module}} in Slot {{slot_name}}", + "load_pipette_protocol_setup": "Load {{pipette_name}} in {{mount_name}} Mount", + "module_in_slot": "{{module}} in Slot {{slot_name}}", + "module_in_slot_plural": "{{module}}", + "move_labware": "Move Labware", + "move_labware_manually": "Manually move {{labware}} from {{old_location}} to {{new_location}}", + "move_labware_on": "Move labware on {{robot_name}}", + "move_labware_using_gripper": "Moving {{labware}} using gripper from {{old_location}} to {{new_location}}", + "move_relative": "Moving {{distance}} mm along {{axis}} axis", + "move_to_addressable_area": "Moving to {{addressable_area}}", + "move_to_addressable_area_drop_tip": "Moving to {{addressable_area}}", + "move_to_coordinates": "Moving to (X: {{x}}, Y: {{y}}, Z: {{z}})", + "move_to_slot": "Moving to Slot {{slot_name}}", + "move_to_well": "Moving to well {{well_name}} of {{labware}} in {{labware_location}}", + "multiple": "multiple", + "notes": "notes", + "off_deck": "off deck", + "offdeck": "offdeck", + "on_location": "on {{location}}", + "opening_tc_lid": "Opening Thermocycler lid", + "pause": "Pause", + "pause_on": "Pause on {{robot_name}}", + "partial_layout": "partial layout", + "pickup_tip": "Picking up tip(s) from {{well_range}} of {{labware}} in {{labware_location}}", + "prepare_to_aspirate": "Preparing {{pipette}} to aspirate", + "reloading_labware": "Reloading {{labware}}", + "return_tip": "Returning tip to {{well_name}} of {{labware}} in {{labware_location}}", + "right": "Right", + "row_layout": "row layout", + "save_position": "Saving position", + "set_and_await_hs_shake": "Setting Heater-Shaker to shake at {{rpm}} rpm and waiting until reached", + "setting_hs_temp": "Setting Target Temperature of Heater-Shaker to {{temp}}", + "setting_temperature_module_temp": "Setting Temperature Module to {{temp}} (rounded to nearest integer)", + "setting_thermocycler_block_temp": "Setting Thermocycler block temperature to {{temp}} with hold time of {{hold_time_seconds}} seconds after target reached", + "setting_thermocycler_lid_temp": "Setting Thermocycler lid temperature to {{temp}}", + "single": "single", + "single_nozzle_layout": "single nozzle layout", + "slot": "Slot {{slot_name}}", + "target_temperature": "target temperature", + "tc_awaiting_for_duration": "Waiting for Thermocycler profile to complete", + "tc_run_profile_steps": "Temperature: {{celsius}}°C, hold time: {{duration}}", + "tc_starting_extended_profile": "Running thermocycler profile with {{elementCount}} total steps and cycles:", + "tc_starting_extended_profile_cycle": "{{repetitions}} repetitions of the following steps:", + "tc_starting_profile": "Running thermocycler profile with {{stepCount}} steps:", + "touch_tip": "Touching tip", + "trash_bin": "Trash Bin", + "trash_bin_in_slot": "Trash Bin in {{slot_name}}", + "turning_rail_lights_off": "Turning rail lights off", + "turning_rail_lights_on": "Turning rail lights on", + "unlatching_hs_latch": "Unlatching labware on Heater-Shaker", + "wait_for_duration": "Pausing for {{seconds}} seconds. {{message}}", + "wait_for_resume": "Pausing protocol", + "waiting_for_hs_to_reach": "Waiting for Heater-Shaker to reach target temperature", + "waiting_for_tc_block_to_reach": "Waiting for Thermocycler block to reach target temperature and holding for specified time", + "waiting_for_tc_lid_to_reach": "Waiting for Thermocycler lid to reach target temperature", + "waiting_to_reach_temp_module": "Waiting for Temperature Module to reach {{temp}}", + "waste_chute": "Waste Chute", + "with_reference_of": "with reference of {{wavelength}} nm" +} diff --git a/protocol-designer/src/feature-flags/reducers.ts b/protocol-designer/src/feature-flags/reducers.ts index efec2f863dd..8760d08c3ea 100644 --- a/protocol-designer/src/feature-flags/reducers.ts +++ b/protocol-designer/src/feature-flags/reducers.ts @@ -30,6 +30,8 @@ const initialFlags: Flags = { OT_PD_ENABLE_REACT_SCAN: process.env.OT_PD_ENABLE_REACT_SCAN === '1' || false, OT_PD_ENABLE_LIQUID_CLASSES: process.env.OT_PD_ENABLE_LIQUID_CLASSES === '1' || false, + OT_PD_ENABLE_TIMELINE_SCRUBBER: + process.env.OT_PD_ENABLE_TIMELINE_SCRUBBER === '1' || false, } // @ts-expect-error(sa, 2021-6-10): cannot use string literals as action type // TODO IMMEDIATELY: refactor this to the old fashioned way if we cannot have type safety: https://github.com/redux-utilities/redux-actions/issues/282#issuecomment-595163081 diff --git a/protocol-designer/src/feature-flags/selectors.ts b/protocol-designer/src/feature-flags/selectors.ts index d673ad6bf09..9cc722d5388 100644 --- a/protocol-designer/src/feature-flags/selectors.ts +++ b/protocol-designer/src/feature-flags/selectors.ts @@ -45,3 +45,7 @@ export const getEnableLiquidClasses: Selector = createSelector( getFeatureFlagData, flags => flags.OT_PD_ENABLE_LIQUID_CLASSES ?? false ) +export const getEnableTimelineScrubber: Selector = createSelector( + getFeatureFlagData, + flags => flags.OT_PD_ENABLE_TIMELINE_SCRUBBER ?? false +) diff --git a/protocol-designer/src/feature-flags/types.ts b/protocol-designer/src/feature-flags/types.ts index 53ea6615c8b..20dcbaa8d5e 100644 --- a/protocol-designer/src/feature-flags/types.ts +++ b/protocol-designer/src/feature-flags/types.ts @@ -37,6 +37,7 @@ export type FlagTypes = | 'OT_PD_ENABLE_HOT_KEYS_DISPLAY' | 'OT_PD_ENABLE_REACT_SCAN' | 'OT_PD_ENABLE_LIQUID_CLASSES' + | 'OT_PD_ENABLE_TIMELINE_SCRUBBER' // flags that are not in this list only show in prerelease mode export const userFacingFlags: FlagTypes[] = [ 'OT_PD_DISABLE_MODULE_RESTRICTIONS', @@ -50,5 +51,6 @@ export const allFlags: FlagTypes[] = [ 'OT_PD_ENABLE_RETURN_TIP', 'OT_PD_ENABLE_REACT_SCAN', 'OT_PD_ENABLE_LIQUID_CLASSES', + 'OT_PD_ENABLE_TIMELINE_SCRUBBER', ] export type Flags = Partial> diff --git a/protocol-designer/src/file-data/selectors/fileCreator.ts b/protocol-designer/src/file-data/selectors/fileCreator.ts index cea1d6022be..8ae0e1b560a 100644 --- a/protocol-designer/src/file-data/selectors/fileCreator.ts +++ b/protocol-designer/src/file-data/selectors/fileCreator.ts @@ -2,7 +2,6 @@ import { createSelector } from 'reselect' import flatMap from 'lodash/flatMap' import isEmpty from 'lodash/isEmpty' import mapValues from 'lodash/mapValues' -import map from 'lodash/map' import reduce from 'lodash/reduce' import uniq from 'lodash/uniq' import { @@ -10,18 +9,14 @@ import { OT2_STANDARD_DECKID, OT2_STANDARD_MODEL, FLEX_STANDARD_DECKID, - SPAN7_8_10_11_SLOT, } from '@opentrons/shared-data' -import { COLUMN_4_SLOTS } from '@opentrons/step-generation' import { selectors as dismissSelectors } from '../../dismiss' import { selectors as labwareDefSelectors } from '../../labware-defs' -import { uuid } from '../../utils' import { selectors as ingredSelectors } from '../../labware-ingred/selectors' import { selectors as stepFormSelectors } from '../../step-forms' import { selectors as uiLabwareSelectors } from '../../ui/labware' import { swatchColors } from '../../organisms/DefineLiquidsModal/swatchColors' -import { getLoadLiquidCommands } from '../../load-file/migration/utils/getLoadLiquidCommands' import { DEFAULT_MM_TOUCH_TIP_OFFSET_FROM_TOP, DEFAULT_MM_BLOWOUT_OFFSET_FROM_TOP, @@ -30,27 +25,21 @@ import { import { getStepGroups } from '../../step-forms/selectors' import { getFileMetadata, getRobotType } from './fileFields' import { getInitialRobotState, getRobotStateTimeline } from './commands' +import { getLoadCommands } from './utils' import type { PipetteEntity, LabwareEntities, PipetteEntities, - RobotState, } from '@opentrons/step-generation' import type { - LabwareLocation, - AddressableAreaName, CommandAnnotationV1Mixin, CommandV8Mixin, CreateCommand, LabwareV2Mixin, LiquidV1Mixin, - LoadLabwareCreateCommand, - LoadModuleCreateCommand, - LoadPipetteCreateCommand, OT2RobotMixin, OT3RobotMixin, - PipetteName, ProtocolBase, ProtocolFile, } from '@opentrons/shared-data' @@ -132,6 +121,16 @@ export const createFile: Selector = createSelector( ) => { const { author, description, created } = fileMetadata + const loadCommands = getLoadCommands( + initialRobotState, + pipetteEntities, + moduleEntities, + labwareEntities, + labwareNicknamesById, + ingredients, + ingredLocations + ) + const name = fileMetadata.protocolName || 'untitled' const lastModified = fileMetadata.lastModified // TODO: Ian 2018-07-10 allow user to save steps in JSON file, even if those @@ -167,39 +166,6 @@ export const createFile: Selector = createSelector( }, } - interface Pipettes { - [pipetteId: string]: { name: PipetteName } - } - - const pipettes: Pipettes = mapValues( - initialRobotState.pipettes, - ( - pipette: typeof initialRobotState.pipettes[keyof typeof initialRobotState.pipettes], - pipetteId: string - ) => ({ - name: pipetteEntities[pipetteId].name, - }) - ) - - const loadPipetteCommands = map( - initialRobotState.pipettes, - ( - pipette: typeof initialRobotState.pipettes[keyof typeof initialRobotState.pipettes], - pipetteId: string - ): LoadPipetteCreateCommand => { - const loadPipetteCommand = { - key: uuid(), - commandType: 'loadPipette' as const, - params: { - pipetteName: pipettes[pipetteId].name, - mount: pipette.mount, - pipetteId: pipetteId, - }, - } - return loadPipetteCommand - } - ) - const liquids: ProtocolFile['liquids'] = reduce( ingredients, (acc, liquidData, liquidId) => { @@ -214,139 +180,12 @@ export const createFile: Selector = createSelector( }, {} ) - // initiate "adapter" commands first so we can map through them to get the - // labware that goes on top of it's location - const loadAdapterCommands = reduce< - RobotState['labware'], - LoadLabwareCreateCommand[] - >( - initialRobotState.labware, - ( - acc, - labware: typeof initialRobotState.labware[keyof typeof initialRobotState.labware], - labwareId: string - ): LoadLabwareCreateCommand[] => { - const { def } = labwareEntities[labwareId] - const isAdapter = def.allowedRoles?.includes('adapter') - if (!isAdapter) return acc - const isOnTopOfModule = labware.slot in initialRobotState.modules - const namespace = def.namespace - const loadName = def.parameters.loadName - const version = def.version - const loadAdapterCommands = { - key: uuid(), - commandType: 'loadLabware' as const, - params: { - displayName: def.metadata.displayName, - labwareId, - loadName, - namespace: namespace, - version: version, - location: isOnTopOfModule - ? { moduleId: labware.slot } - : { slotName: labware.slot }, - }, - } - - return [...acc, loadAdapterCommands] - }, - [] - ) - - const loadLabwareCommands = reduce< - RobotState['labware'], - LoadLabwareCreateCommand[] - >( - initialRobotState.labware, - ( - acc, - labware: typeof initialRobotState.labware[keyof typeof initialRobotState.labware], - labwareId: string - ): LoadLabwareCreateCommand[] => { - const { def } = labwareEntities[labwareId] - const isAdapter = def.allowedRoles?.includes('adapter') - if (isAdapter || def.metadata.displayCategory === 'trash') return acc - const isOnTopOfModule = labware.slot in initialRobotState.modules - const isOnAdapter = - loadAdapterCommands.find( - command => command.params.labwareId === labware.slot - ) != null - const namespace = def.namespace - const loadName = def.parameters.loadName - const version = def.version - const isAddressableAreaName = COLUMN_4_SLOTS.includes(labware.slot) - - let location: LabwareLocation = { slotName: labware.slot } - if (isOnTopOfModule) { - location = { moduleId: labware.slot } - } else if (isOnAdapter) { - location = { labwareId: labware.slot } - } else if (isAddressableAreaName) { - // TODO(bh, 2024-01-02): check slots against addressable areas via the deck definition - location = { - addressableAreaName: labware.slot as AddressableAreaName, - } - } else if (labware.slot === 'offDeck') { - location = 'offDeck' - } - - const loadLabwareCommands = { - key: uuid(), - commandType: 'loadLabware' as const, - params: { - displayName: - labwareNicknamesById[labwareId] ?? def.metadata.displayName, - labwareId: labwareId, - loadName, - namespace: namespace, - version: version, - location, - }, - } - - return [...acc, loadLabwareCommands] - }, - [] - ) - - const loadLiquidCommands = getLoadLiquidCommands( - ingredients, - ingredLocations - ) - const loadModuleCommands = map( - initialRobotState.modules, - ( - module: typeof initialRobotState.modules[keyof typeof initialRobotState.modules], - moduleId: string - ): LoadModuleCreateCommand => { - const model = moduleEntities[moduleId].model - const loadModuleCommand = { - key: uuid(), - commandType: 'loadModule' as const, - params: { - model: model, - location: { - slotName: module.slot === SPAN7_8_10_11_SLOT ? '7' : module.slot, - }, - moduleId: moduleId, - }, - } - return loadModuleCommand - } - ) const labwareDefinitions = getLabwareDefinitionsInUse( labwareEntities, pipetteEntities, labwareDefsByURI ) - const loadCommands: CreateCommand[] = [ - ...loadPipetteCommands, - ...loadModuleCommands, - ...loadAdapterCommands, - ...loadLabwareCommands, - ...loadLiquidCommands, - ] const nonLoadCommands: CreateCommand[] = flatMap( robotStateTimeline.timeline, diff --git a/protocol-designer/src/file-data/selectors/utils.ts b/protocol-designer/src/file-data/selectors/utils.ts new file mode 100644 index 00000000000..57a8ba89947 --- /dev/null +++ b/protocol-designer/src/file-data/selectors/utils.ts @@ -0,0 +1,195 @@ +import mapValues from 'lodash/mapValues' +import map from 'lodash/map' +import reduce from 'lodash/reduce' +import { getLoadLiquidCommands } from '../../load-file/migration/utils/getLoadLiquidCommands' +import { COLUMN_4_SLOTS, uuid } from '@opentrons/step-generation' + +import type { + AddressableAreaName, + CreateCommand, + LabwareLocation, + LoadLabwareCreateCommand, + LoadModuleCreateCommand, + LoadPipetteCreateCommand, + PipetteName, +} from '@opentrons/shared-data' +import type { + LabwareEntities, + LabwareLiquidState, + PipetteEntities, + RobotState, + ModuleEntities, + TimelineFrame, +} from '@opentrons/step-generation' +import type { LiquidGroupsById } from '../../labware-ingred/types' + +interface Pipettes { + [pipetteId: string]: { name: PipetteName } +} + +export const getLoadCommands = ( + initialRobotState: TimelineFrame, + pipetteEntities: PipetteEntities, + moduleEntities: ModuleEntities, + labwareEntities: LabwareEntities, + labwareNicknamesById: Record, + ingredients: LiquidGroupsById, + ingredLocations: LabwareLiquidState +): CreateCommand[] => { + const pipettes: Pipettes = mapValues( + initialRobotState.pipettes, + ( + pipette: typeof initialRobotState.pipettes[keyof typeof initialRobotState.pipettes], + pipetteId: string + ) => ({ + name: pipetteEntities[pipetteId].name, + }) + ) + + const loadPipetteCommands = map( + initialRobotState.pipettes, + ( + pipette: typeof initialRobotState.pipettes[keyof typeof initialRobotState.pipettes], + pipetteId: string + ): LoadPipetteCreateCommand => { + const loadPipetteCommand = { + key: uuid(), + commandType: 'loadPipette' as const, + params: { + pipetteName: pipettes[pipetteId].name, + mount: pipette.mount, + pipetteId: pipetteId, + }, + } + return loadPipetteCommand + } + ) + + // initiate "adapter" commands first so we can map through them to get the + // labware that goes on top of it's location + const loadAdapterCommands = reduce< + RobotState['labware'], + LoadLabwareCreateCommand[] + >( + initialRobotState.labware, + ( + acc, + labware: typeof initialRobotState.labware[keyof typeof initialRobotState.labware], + labwareId: string + ): LoadLabwareCreateCommand[] => { + const { def } = labwareEntities[labwareId] + const isAdapter = def.allowedRoles?.includes('adapter') + if (!isAdapter) { + return acc + } + const isOnTopOfModule = labware.slot in initialRobotState.modules + const { namespace, parameters, version, metadata } = def + const loadName = parameters.loadName + const loadAdapterCommands = { + key: uuid(), + commandType: 'loadLabware' as const, + params: { + displayName: metadata.displayName, + labwareId, + loadName, + namespace, + version, + location: isOnTopOfModule + ? { moduleId: labware.slot } + : { slotName: labware.slot }, + }, + } + + return [...acc, loadAdapterCommands] + }, + [] + ) + + const loadLabwareCommands = reduce< + RobotState['labware'], + LoadLabwareCreateCommand[] + >( + initialRobotState.labware, + ( + acc, + labware: typeof initialRobotState.labware[keyof typeof initialRobotState.labware], + labwareId: string + ): LoadLabwareCreateCommand[] => { + const { def } = labwareEntities[labwareId] + const isAdapter = def.allowedRoles?.includes('adapter') + if (isAdapter || def.metadata.displayCategory === 'trash') return acc + const isOnTopOfModule = labware.slot in initialRobotState.modules + const isOnAdapter = + loadAdapterCommands.find( + command => command.params.labwareId === labware.slot + ) != null + const { namespace, parameters, version } = def + const loadName = parameters.loadName + + const isAddressableAreaName = COLUMN_4_SLOTS.includes(labware.slot) + + let location: LabwareLocation = { slotName: labware.slot } + if (isOnTopOfModule) { + location = { moduleId: labware.slot } + } else if (isOnAdapter) { + location = { labwareId: labware.slot } + } else if (isAddressableAreaName) { + // TODO(bh, 2024-01-02): check slots against addressable areas via the deck definition + location = { + addressableAreaName: labware.slot as AddressableAreaName, + } + } else if (labware.slot === 'offDeck') { + location = 'offDeck' + } + + const loadLabwareCommands = { + key: uuid(), + commandType: 'loadLabware' as const, + params: { + displayName: + labwareNicknamesById[labwareId] ?? def.metadata.displayName, + labwareId: labwareId, + loadName, + namespace: namespace, + version: version, + location, + }, + } + + return [...acc, loadLabwareCommands] + }, + [] + ) + + const loadLiquidCommands = getLoadLiquidCommands(ingredients, ingredLocations) + + const loadModuleCommands = map( + initialRobotState.modules, + ( + module: typeof initialRobotState.modules[keyof typeof initialRobotState.modules], + moduleId: string + ): LoadModuleCreateCommand => { + const model = moduleEntities[moduleId].model + const loadModuleCommand = { + key: uuid(), + commandType: 'loadModule' as const, + params: { + model: model, + location: { + slotName: module.slot, + }, + moduleId: moduleId, + }, + } + return loadModuleCommand + } + ) + + return [ + ...loadPipetteCommands, + ...loadModuleCommands, + ...loadAdapterCommands, + ...loadLabwareCommands, + ...loadLiquidCommands, + ] +} diff --git a/protocol-designer/src/pages/ProtocolOverview/ScrubberContainer.tsx b/protocol-designer/src/pages/ProtocolOverview/ScrubberContainer.tsx new file mode 100644 index 00000000000..52151876a61 --- /dev/null +++ b/protocol-designer/src/pages/ProtocolOverview/ScrubberContainer.tsx @@ -0,0 +1,172 @@ +import { useSelector } from 'react-redux' +import flatMap from 'lodash/flatMap' +import { ProtocolTimelineScrubber } from '@opentrons/components' +import { OT2_ROBOT_TYPE } from '@opentrons/shared-data' +import { + getInitialRobotState, + getRobotStateTimeline, + getRobotType, +} from '../../file-data/selectors' +import { uuid } from '../../utils' +import { + getInitialDeckSetup, + getInvariantContext, +} from '../../step-forms/selectors' +import { getLabwareNicknamesById } from '../../ui/labware/selectors' +import { selectors as ingredSelectors } from '../../labware-ingred/selectors' +import { getLoadCommands } from '../../file-data/selectors/utils' +import type { + AddressableAreaName, + CompletedProtocolAnalysis, + LabwareLocation, + Liquid, + LoadModuleRunTimeCommand, + LoadedLabware, + LoadedModule, + LoadedPipette, + RunTimeCommand, +} from '@opentrons/shared-data' + +export function ScrubberContainer(): JSX.Element | null { + const robotType = useSelector(getRobotType) + const labwareNickNames = useSelector(getLabwareNicknamesById) + const robotStateTimeline = useSelector(getRobotStateTimeline) + const initialRobotState = useSelector(getInitialRobotState) + const ingredients = useSelector(ingredSelectors.getLiquidGroupsById) + const ingredientLocations = useSelector(ingredSelectors.getLiquidsByLabwareId) + const invariantContext = useSelector(getInvariantContext) + const initialDeckSetup = useSelector(getInitialDeckSetup) + + if (robotType === OT2_ROBOT_TYPE) { + return null + } + + const { pipetteEntities, labwareEntities, moduleEntities } = invariantContext + const { + pipettes, + modules, + labware, + additionalEquipmentOnDeck, + } = initialDeckSetup + + const loadCommands = getLoadCommands( + initialRobotState, + pipetteEntities, + moduleEntities, + labwareEntities, + labwareNickNames, + ingredients, + ingredientLocations + ) + const nonLoadCommands = flatMap( + robotStateTimeline.timeline, + timelineFrame => timelineFrame.commands + ) + const runTimeCommands: RunTimeCommand[] = [ + ...loadCommands, + ...nonLoadCommands, + ].map(command => { + let result + if (command.commandType === 'loadModule') { + const loadModuleResult: LoadModuleRunTimeCommand['result'] = { + moduleId: command.params.moduleId ?? '', + } + result = loadModuleResult + } else if (command.commandType === 'loadLabware') { + result = { + labwareId: command.params.labwareId, + definition: labwareEntities[command.params.labwareId ?? '']?.def, + } + } else if (command.commandType === 'loadPipette') { + result = { + pipetteId: command.params.pipetteId, + } + } + // @ts-expect-error: TS angry because not all commands have a result but + // results are added to only commands that need them for the scrubber + const runTimeCommand: RunTimeCommand = { + ...command, + id: uuid(), + status: 'succeeded', + createdAt: '', + startedAt: '', + completedAt: '', + result, + } + return runTimeCommand + }) + + const loadPipettes: LoadedPipette[] = Object.values(pipettes).map( + pipette => ({ + id: pipette.id, + pipetteName: pipette.name, + mount: pipette.mount, + }) + ) + const loadModules: LoadedModule[] = Object.values(modules).map(module => ({ + id: module.id, + model: module.model, + serialNumber: '1', // TODO: why? seems like we don't need it for command text though + location: { + slotName: module.slot, + }, + })) + + const loadLabware: LoadedLabware[] = Object.values(labware).map(lw => { + let location: LabwareLocation = { slotName: lw.slot } + if (lw.slot in modules) { + location = { moduleId: lw.slot } + } else if ( + labware[lw.slot] != null && + labware[lw.slot].def.allowedRoles?.includes('adapter') + ) { + location = { labwareId: lw.slot } + } else if (lw.slot === 'offDeck') { + location = 'offDeck' + } else if ( + Object.values(additionalEquipmentOnDeck).find( + ae => ae.location === lw.slot + ) + ) { + const inWasteChute = Object.values(additionalEquipmentOnDeck).find( + ae => ae.location === lw.slot && ae.name === 'wasteChute' + ) + location = { + addressableAreaName: inWasteChute + ? 'gripperWasteChute' + : (lw.slot as AddressableAreaName), + } + } + + return { + id: lw.id, + loadName: lw.def.parameters.loadName, + definitionUri: lw.labwareDefURI, + location, + displayName: labwareNickNames[lw.id], + } + }) + + const liquids: Liquid[] = Object.entries(ingredients).map( + ([liquidId, liquidData]) => ({ + id: liquidId, + displayName: liquidData.name ?? 'undefined liquid name', + description: liquidData.description ?? '', + displayColor: liquidData.displayColor, + }) + ) + + const analysis: CompletedProtocolAnalysis = { + id: uuid(), + result: 'ok', + pipettes: loadPipettes, + labware: loadLabware, + modules: loadModules, + liquids, + commands: runTimeCommands, + errors: [], + robotType, + } + + return +} diff --git a/protocol-designer/src/pages/ProtocolOverview/index.tsx b/protocol-designer/src/pages/ProtocolOverview/index.tsx index e51b47ce799..48b302be234 100644 --- a/protocol-designer/src/pages/ProtocolOverview/index.tsx +++ b/protocol-designer/src/pages/ProtocolOverview/index.tsx @@ -28,6 +28,7 @@ import { import { selectors as fileSelectors } from '../../file-data' import { selectors as stepFormSelectors } from '../../step-forms' import { actions as loadFileActions } from '../../load-file' +import { getEnableTimelineScrubber } from '../../feature-flags/selectors' import { selectors as labwareIngredSelectors } from '../../labware-ingred/selectors' import { MaterialsListModal } from '../../organisms/MaterialsListModal' import { LINE_CLAMP_TEXT_STYLE, COLUMN_STYLE } from '../../atoms' @@ -47,7 +48,7 @@ import { getUnusedStagingAreas, getUnusedTrash, } from './utils' - +import { ScrubberContainer } from './ScrubberContainer' import type { CreateCommand } from '@opentrons/shared-data' import type { ThunkDispatch } from '../../types' @@ -80,6 +81,7 @@ export function ProtocolOverview(): JSX.Element { showEditInstrumentsModal, setShowEditInstrumentsModal, ] = useState(false) + const enableTimelineScrubber = useSelector(getEnableTimelineScrubber) const [showEditMetadataModal, setShowEditMetadataModal] = useState( false ) @@ -322,6 +324,7 @@ export function ProtocolOverview(): JSX.Element { css={COLUMN_STYLE} gridGap={SPACING.spacing12} > + {enableTimelineScrubber ? : null} ( (acc, command) => { if (command.commandType === 'loadPipette' && command.result != null) { @@ -84,6 +83,7 @@ export function getResultingTimelineFrameFromRunCommands( }, {} ) + const initialRobotState = makeInitialRobotState({ invariantContext, labwareLocations, diff --git a/step-generation/src/utils/index.ts b/step-generation/src/utils/index.ts index 88c2ffcc603..a4cee60e039 100644 --- a/step-generation/src/utils/index.ts +++ b/step-generation/src/utils/index.ts @@ -25,4 +25,6 @@ export * from './misc' export * from './movableTrashCommandsUtil' export * from './safePipetteMovements' export * from './wasteChuteCommandsUtil' +export * from './createTimelineFromRunCommands' +export * from './constructInvariantContextFromRunCommands' export const uuid: () => string = uuidv4 From 5303a3b6b3187565e5a437990dd063405cbf9689 Mon Sep 17 00:00:00 2001 From: Seth Foster Date: Wed, 29 Jan 2025 13:11:45 -0500 Subject: [PATCH 040/150] refactor(api): Express labware offset locations as sequences (#17363) This is a pattern that we're going to adopt for symbolic geometry locations in HTTP API contexts - expressing them as a sequence of heterogenous unions that represent kinds of places things can be. We'll do this for locations of labware instances in a followup, but for now we're doing it for offset locations. Offset locations were previously objects that had a slot name; an optional module model, for a location on a module; and an optional labware URI, for a location on a labware (possibly an adapter, possibly on a model). This can't represent labware stacks, and it's locked to slot names. These are more or less fine for now still, but it would be nice to support stacks in the general case, and it will be awkward for clients to use the object-with-optional-attributes model alongside the sequence-of-locations instance model. Plus, while this won't need a database schema change for the offsets stored in runs, it _will_ for the offsets api - so let's make this change now while that schema and API haven't yet shipped. ## Testing - [x] do the offsets still apply, on - [x] a slot - [x] a module - [x] an adapter on a model Since the HTTP API still is the same and everything is tested internally, it is sufficient to do normal LPC testing - everything should still work. ## Reviews - [ ] look appropriate? Missing anything? --- api-client/src/maintenance_runs/types.ts | 4 +- api-client/src/runs/createLabwareOffset.ts | 6 +- api-client/src/runs/createRun.ts | 4 +- api-client/src/runs/types.ts | 30 +- .../protocol_api/core/engine/labware.py | 2 +- .../core/legacy/labware_offset_provider.py | 10 +- api/src/opentrons/protocol_engine/__init__.py | 6 +- .../protocol_engine/actions/actions.py | 4 +- .../protocol_engine/errors/__init__.py | 2 + .../protocol_engine/errors/exceptions.py | 13 + .../protocol_engine/execution/equipment.py | 73 +- .../labware_offset_standardization.py | 172 +++++ .../protocol_engine/protocol_engine.py | 18 +- .../resources/deck_configuration_provider.py | 96 ++- .../protocol_engine/slot_standardization.py | 19 - .../state/addressable_areas.py | 59 +- .../protocol_engine/state/geometry.py | 120 ++- .../protocol_engine/state/labware.py | 34 +- .../protocol_engine/state/modules.py | 7 +- .../protocol_engine/types/__init__.py | 18 +- .../protocol_engine/types/labware.py | 42 +- .../types/labware_offset_location.py | 49 +- .../protocol_engine/types/location.py | 43 +- .../protocol_runner/run_orchestrator.py | 5 +- .../core/engine/test_labware_core.py | 11 +- .../legacy/test_labware_offset_provider.py | 22 +- .../execution/test_equipment_handler.py | 326 +++++++- .../test_labware_movement_handler.py | 4 +- .../test_deck_configuration_provider.py | 14 +- .../state/test_addressable_area_view_old.py | 1 - .../state/test_geometry_view.py | 45 +- .../state/test_labware_store_old.py | 46 +- .../state/test_labware_view_old.py | 78 +- .../test_labware_offset_standardization.py | 725 ++++++++++++++++++ .../protocol_engine/test_protocol_engine.py | 132 +++- .../test_slot_standardization.py | 38 - .../PythonLabwareOffsetSnippet/index.tsx | 4 +- .../useCreateRunFromProtocol.ts | 4 +- .../hooks/useLPCCommands/commands/modules.ts | 4 +- .../useLPCCommands/useApplyLPCOffsets.ts | 6 +- .../useLPCCommands/useBuildOffsetsToApply.ts | 4 +- .../steps/ResultsSummary/OffsetTable.tsx | 4 +- .../steps/ResultsSummary/TableComponent.tsx | 4 +- .../LabwarePositionCheck/types/steps.ts | 4 +- .../hooks/getLabwareLocationCombos.ts | 12 +- .../LabwarePositionCheckComponent.tsx | 6 +- .../ResultsSummary.tsx | 8 +- .../LegacyLabwarePositionCheck/types.ts | 21 +- .../utils/getDisplayLocation.ts | 4 +- .../ProtocolSetupParameters.tsx | 7 +- app/src/organisms/TerseOffsetTable/index.tsx | 4 +- .../protocol-runs/selectors/lpc/labware.ts | 7 +- app/src/redux/protocol-runs/types/lpc.ts | 6 +- .../analysis/getLabwareOffsetLocation.ts | 4 +- .../useCreateLabwareOffsetsMutation.test.tsx | 7 +- .../runs/useCreateLabwareOffsetMutation.ts | 4 +- .../robot_server/labware_offsets/router.py | 9 +- .../robot_server/labware_offsets/store.py | 4 +- .../maintenance_run_data_manager.py | 6 +- .../maintenance_run_models.py | 4 +- .../maintenance_run_orchestrator_store.py | 10 +- .../maintenance_runs/router/labware_router.py | 9 +- .../runs/router/labware_router.py | 8 +- .../robot_server/runs/run_data_manager.py | 5 +- robot-server/robot_server/runs/run_models.py | 4 +- .../runs/run_orchestrator_store.py | 9 +- .../runs/test_protocol_run.tavern.yaml | 6 + .../tests/labware_offsets/test_store.py | 10 +- .../router/test_base_router.py | 9 +- .../router/test_labware_router.py | 7 +- .../maintenance_runs/test_engine_store.py | 12 +- .../maintenance_runs/test_run_data_manager.py | 4 +- .../tests/runs/router/test_base_router.py | 9 +- .../tests/runs/router/test_labware_router.py | 10 +- .../tests/runs/test_run_orchestrator_store.py | 12 +- .../opentrons_shared_data/deck/__init__.py | 5 + 76 files changed, 2080 insertions(+), 474 deletions(-) create mode 100644 api/src/opentrons/protocol_engine/labware_offset_standardization.py create mode 100644 api/tests/opentrons/protocol_engine/test_labware_offset_standardization.py diff --git a/api-client/src/maintenance_runs/types.ts b/api-client/src/maintenance_runs/types.ts index 6696e3ba072..e17c834cd16 100644 --- a/api-client/src/maintenance_runs/types.ts +++ b/api-client/src/maintenance_runs/types.ts @@ -6,7 +6,7 @@ import type { } from '@opentrons/shared-data' import type { RunCommandSummary, - LabwareOffsetCreateData, + LegacyLabwareOffsetCreateData, RunStatus, RunAction, } from '../runs' @@ -42,7 +42,7 @@ export interface MaintenanceRunError { } export interface CreateMaintenanceRunData { - labwareOffsets?: LabwareOffsetCreateData[] + labwareOffsets?: LegacyLabwareOffsetCreateData[] } export interface LabwareDefinitionSummary { diff --git a/api-client/src/runs/createLabwareOffset.ts b/api-client/src/runs/createLabwareOffset.ts index 29da8b61922..0b91566cf46 100644 --- a/api-client/src/runs/createLabwareOffset.ts +++ b/api-client/src/runs/createLabwareOffset.ts @@ -2,14 +2,14 @@ import { POST, request } from '../request' import type { ResponsePromise } from '../request' import type { HostConfig } from '../types' -import type { LabwareOffsetCreateData, Run } from './types' +import type { LegacyLabwareOffsetCreateData, Run } from './types' export function createLabwareOffset( config: HostConfig, runId: string, - data: LabwareOffsetCreateData + data: LegacyLabwareOffsetCreateData ): ResponsePromise { - return request( + return request( POST, `/runs/${runId}/labware_offsets`, { data }, diff --git a/api-client/src/runs/createRun.ts b/api-client/src/runs/createRun.ts index 6e8cd4b7525..e825e55e665 100644 --- a/api-client/src/runs/createRun.ts +++ b/api-client/src/runs/createRun.ts @@ -4,14 +4,14 @@ import type { ResponsePromise } from '../request' import type { HostConfig } from '../types' import type { Run, - LabwareOffsetCreateData, + LegacyLabwareOffsetCreateData, RunTimeParameterValuesCreateData, RunTimeParameterFilesCreateData, } from './types' export interface CreateRunData { protocolId?: string - labwareOffsets?: LabwareOffsetCreateData[] + labwareOffsets?: LegacyLabwareOffsetCreateData[] runTimeParameterValues?: RunTimeParameterValuesCreateData runTimeParameterFiles?: RunTimeParameterFilesCreateData } diff --git a/api-client/src/runs/types.ts b/api-client/src/runs/types.ts index ea24c040ebc..1de9b97717f 100644 --- a/api-client/src/runs/types.ts +++ b/api-client/src/runs/types.ts @@ -85,7 +85,8 @@ export interface LabwareOffset { id: string createdAt: string definitionUri: string - location: LabwareOffsetLocation + location: LegacyLabwareOffsetLocation + locationSequence?: LabwareOffsetLocationSequence vector: VectorOffset } @@ -156,14 +157,35 @@ export interface CreateRunActionData { actionType: RunActionType } -export interface LabwareOffsetLocation { +export interface OnAddressableAreaLabwareOffsetLocationSequenceComponent { + kind: 'onAddressableArea' + labware: string +} + +export interface OnModuleOffsetLocationSequenceComponent { + kind: 'onModule' + moduleModel: ModuleModel +} + +export interface OnLabwareOffsetLocationSequenceComponent { + kind: 'onLabware' + labwareUri: string +} + +export type LabwareOffsetLocationSequenceComponent = + | OnAddressableAreaLabwareOffsetLocationSequenceComponent + | OnModuleOffsetLocationSequenceComponent + | OnLabwareOffsetLocationSequenceComponent +export type LabwareOffsetLocationSequence = LabwareOffsetLocationSequenceComponent[] + +export interface LegacyLabwareOffsetLocation { slotName: string moduleModel?: ModuleModel definitionUri?: string } -export interface LabwareOffsetCreateData { +export interface LegacyLabwareOffsetCreateData { definitionUri: string - location: LabwareOffsetLocation + location: LegacyLabwareOffsetLocation vector: VectorOffset } diff --git a/api/src/opentrons/protocol_api/core/engine/labware.py b/api/src/opentrons/protocol_api/core/engine/labware.py index d462401927f..6a9ea743355 100644 --- a/api/src/opentrons/protocol_api/core/engine/labware.py +++ b/api/src/opentrons/protocol_api/core/engine/labware.py @@ -122,7 +122,7 @@ def set_calibration(self, delta: Point) -> None: request = LabwareOffsetCreate.model_construct( definitionUri=self.get_uri(), - location=offset_location, + locationSequence=offset_location, vector=LabwareOffsetVector(x=delta.x, y=delta.y, z=delta.z), ) self._engine_client.add_labware_offset(request) diff --git a/api/src/opentrons/protocol_api/core/legacy/labware_offset_provider.py b/api/src/opentrons/protocol_api/core/legacy/labware_offset_provider.py index b808cc95add..e0a4b4f6bd2 100644 --- a/api/src/opentrons/protocol_api/core/legacy/labware_offset_provider.py +++ b/api/src/opentrons/protocol_api/core/legacy/labware_offset_provider.py @@ -3,7 +3,11 @@ from typing import Optional from opentrons.hardware_control.modules import ModuleModel as HardwareModuleModel -from opentrons.protocol_engine import ProtocolEngine, LabwareOffsetLocation, ModuleModel +from opentrons.protocol_engine import ( + ProtocolEngine, + LegacyLabwareOffsetLocation, + ModuleModel, +) from opentrons.types import DeckSlotName, Point from ..labware import LabwareLoadParams @@ -81,9 +85,9 @@ def find( See the parent class for param details. """ - offset = self._labware_view.find_applicable_labware_offset( + offset = self._labware_view.find_applicable_labware_offset_by_legacy_location( definition_uri=load_params.as_uri(), - location=LabwareOffsetLocation( + location=LegacyLabwareOffsetLocation( slotName=deck_slot, moduleModel=( None diff --git a/api/src/opentrons/protocol_engine/__init__.py b/api/src/opentrons/protocol_engine/__init__.py index 4b5b2a1f3c3..5e90c7235bf 100644 --- a/api/src/opentrons/protocol_engine/__init__.py +++ b/api/src/opentrons/protocol_engine/__init__.py @@ -26,9 +26,10 @@ from .types import ( LabwareOffset, + LegacyLabwareOffsetCreate, LabwareOffsetCreate, LabwareOffsetVector, - LabwareOffsetLocation, + LegacyLabwareOffsetLocation, LabwareMovementStrategy, AddressableOffsetVector, DeckPoint, @@ -96,7 +97,8 @@ "LabwareOffset", "LabwareOffsetCreate", "LabwareOffsetVector", - "LabwareOffsetLocation", + "LegacyLabwareOffsetCreate", + "LegacyLabwareOffsetLocation", "LabwareMovementStrategy", "AddressableOffsetVector", "DeckSlotLocation", diff --git a/api/src/opentrons/protocol_engine/actions/actions.py b/api/src/opentrons/protocol_engine/actions/actions.py index 0ec505d68e6..680994ce70c 100644 --- a/api/src/opentrons/protocol_engine/actions/actions.py +++ b/api/src/opentrons/protocol_engine/actions/actions.py @@ -23,7 +23,7 @@ from ..notes.notes import CommandNote from ..state.update_types import StateUpdate from ..types import ( - LabwareOffsetCreate, + LabwareOffsetCreateInternal, ModuleDefinition, Liquid, DeckConfigurationType, @@ -206,7 +206,7 @@ class AddLabwareOffsetAction: labware_offset_id: str created_at: datetime - request: LabwareOffsetCreate + request: LabwareOffsetCreateInternal @dataclasses.dataclass(frozen=True) diff --git a/api/src/opentrons/protocol_engine/errors/__init__.py b/api/src/opentrons/protocol_engine/errors/__init__.py index 2b0fb6a6060..85d89e8e2fb 100644 --- a/api/src/opentrons/protocol_engine/errors/__init__.py +++ b/api/src/opentrons/protocol_engine/errors/__init__.py @@ -82,6 +82,7 @@ InvalidLiquidError, LiquidClassDoesNotExistError, LiquidClassRedefinitionError, + OffsetLocationInvalidError, ) from .error_occurrence import ErrorOccurrence, ProtocolCommandFailedError @@ -160,6 +161,7 @@ "LocationIsLidDockSlotError", "InvalidAxisForRobotType", "NotSupportedOnRobotType", + "OffsetLocationInvalidError", # error occurrence models "ErrorOccurrence", "CommandNotAllowedError", diff --git a/api/src/opentrons/protocol_engine/errors/exceptions.py b/api/src/opentrons/protocol_engine/errors/exceptions.py index c3fddf99a61..3aa7c0562ab 100644 --- a/api/src/opentrons/protocol_engine/errors/exceptions.py +++ b/api/src/opentrons/protocol_engine/errors/exceptions.py @@ -433,6 +433,19 @@ def __init__( super().__init__(ErrorCodes.GENERAL_ERROR, message, details, wrapping) +class OffsetLocationInvalidError(ProtocolEngineError): + """Raised when encountering an invalid labware offset location sequence.""" + + def __init__( + self, + message: Optional[str] = None, + details: Optional[Dict[str, Any]] = None, + wrapping: Optional[Sequence[EnumeratedError]] = None, + ) -> None: + """Build an OffsetLocationSequenceDoesNotTerminateAtAnAddressableAreaError.""" + super().__init__(ErrorCodes.GENERAL_ERROR, message, details, wrapping) + + class SlotDoesNotExistError(ProtocolEngineError): """Raised when referencing a deck slot that does not exist.""" diff --git a/api/src/opentrons/protocol_engine/execution/equipment.py b/api/src/opentrons/protocol_engine/execution/equipment.py index b16e26cd6ae..4a487247e08 100644 --- a/api/src/opentrons/protocol_engine/execution/equipment.py +++ b/api/src/opentrons/protocol_engine/execution/equipment.py @@ -1,4 +1,5 @@ """Equipment command side-effect logic.""" + from dataclasses import dataclass from typing import Optional, overload, Union, List @@ -42,10 +43,7 @@ from ..types import ( LabwareLocation, DeckSlotLocation, - ModuleLocation, - OnLabwareLocation, LabwareOffset, - LabwareOffsetLocation, ModuleModel, ModuleDefinition, AddressableAreaLocation, @@ -633,8 +631,9 @@ def find_applicable_labware_offset_id( or None if no labware offset will apply. """ labware_offset_location = ( - self._get_labware_offset_location_from_labware_location(labware_location) + self._state_store.geometry.get_projected_offset_location(labware_location) ) + if labware_offset_location is None: # No offset for off-deck location. # Returning None instead of raising an exception allows loading a labware @@ -647,72 +646,6 @@ def find_applicable_labware_offset_id( ) return self._get_id_from_offset(offset) - def _get_labware_offset_location_from_labware_location( - self, labware_location: LabwareLocation - ) -> Optional[LabwareOffsetLocation]: - if isinstance(labware_location, DeckSlotLocation): - return LabwareOffsetLocation(slotName=labware_location.slotName) - elif isinstance(labware_location, ModuleLocation): - module_id = labware_location.moduleId - # Allow ModuleNotLoadedError to propagate. - # Note also that we match based on the module's requested model, not its - # actual model, to implement robot-server's documented HTTP API semantics. - module_model = self._state_store.modules.get_requested_model( - module_id=module_id - ) - - # If `module_model is None`, it probably means that this module was added by - # `ProtocolEngine.use_attached_modules()`, instead of an explicit - # `loadModule` command. - # - # This assert should never raise in practice because: - # 1. `ProtocolEngine.use_attached_modules()` is only used by - # robot-server's "stateless command" endpoints, under `/commands`. - # 2. Those endpoints don't support loading labware, so this code will - # never run. - # - # Nevertheless, if it does happen somehow, we do NOT want to pass the - # `None` value along to `LabwareView.find_applicable_labware_offset()`. - # `None` means something different there, which will cause us to return - # wrong results. - assert module_model is not None, ( - "Can't find offsets for labware" - " that are loaded on modules" - " that were loaded with ProtocolEngine.use_attached_modules()." - ) - - module_location = self._state_store.modules.get_location( - module_id=module_id - ) - slot_name = module_location.slotName - return LabwareOffsetLocation(slotName=slot_name, moduleModel=module_model) - elif isinstance(labware_location, OnLabwareLocation): - parent_labware_id = labware_location.labwareId - parent_labware_uri = self._state_store.labware.get_definition_uri( - parent_labware_id - ) - - base_location = self._state_store.labware.get_parent_location( - parent_labware_id - ) - base_labware_offset_location = ( - self._get_labware_offset_location_from_labware_location(base_location) - ) - if base_labware_offset_location is None: - # No offset for labware sitting on labware off-deck - return None - - # If labware is being stacked on itself, all labware in the stack will share a labware offset due to - # them sharing the same definitionUri in `LabwareOffsetLocation`. This will not be true for the - # bottom-most labware, which will have a `DeckSlotLocation` and have its definitionUri field empty. - return LabwareOffsetLocation( - slotName=base_labware_offset_location.slotName, - moduleModel=base_labware_offset_location.moduleModel, - definitionUri=parent_labware_uri, - ) - else: # Off deck - return None - @staticmethod def _get_id_from_offset(labware_offset: Optional[LabwareOffset]) -> Optional[str]: return None if labware_offset is None else labware_offset.id diff --git a/api/src/opentrons/protocol_engine/labware_offset_standardization.py b/api/src/opentrons/protocol_engine/labware_offset_standardization.py new file mode 100644 index 00000000000..836d40cb700 --- /dev/null +++ b/api/src/opentrons/protocol_engine/labware_offset_standardization.py @@ -0,0 +1,172 @@ +"""Convert labware offset creation requests and stored elements between legacy and new.""" + +from opentrons_shared_data.robot.types import RobotType +from opentrons_shared_data.deck.types import DeckDefinitionV5 +from .errors import ( + OffsetLocationInvalidError, + FixtureDoesNotExistError, +) +from .types import ( + LabwareOffsetCreate, + LegacyLabwareOffsetCreate, + LabwareOffsetCreateInternal, + LegacyLabwareOffsetLocation, + LabwareOffsetLocationSequence, + OnLabwareOffsetLocationSequenceComponent, + OnAddressableAreaOffsetLocationSequenceComponent, + OnModuleOffsetLocationSequenceComponent, + ModuleModel, +) +from .resources import deck_configuration_provider + + +def standardize_labware_offset_create( + request: LabwareOffsetCreate | LegacyLabwareOffsetCreate, + robot_type: RobotType, + deck_definition: DeckDefinitionV5, +) -> LabwareOffsetCreateInternal: + """Turn a union of old and new labware offset create requests into a new one.""" + location_sequence, legacy_location = _locations_for_create( + request, robot_type, deck_definition + ) + return LabwareOffsetCreateInternal( + definitionUri=request.definitionUri, + locationSequence=location_sequence, + legacyLocation=legacy_location, + vector=request.vector, + ) + + +def _legacy_offset_location_to_offset_location_sequence( + location: LegacyLabwareOffsetLocation, deck_definition: DeckDefinitionV5 +) -> LabwareOffsetLocationSequence: + sequence: LabwareOffsetLocationSequence = [] + if location.definitionUri: + sequence.append( + OnLabwareOffsetLocationSequenceComponent(labwareUri=location.definitionUri) + ) + if location.moduleModel: + sequence.append( + OnModuleOffsetLocationSequenceComponent(moduleModel=location.moduleModel) + ) + cutout_id = deck_configuration_provider.get_cutout_id_by_deck_slot_name( + location.slotName + ) + possible_cutout_fixture_id = location.moduleModel.value + try: + addressable_area = deck_configuration_provider.get_labware_hosting_addressable_area_name_for_cutout_and_cutout_fixture( + cutout_id, possible_cutout_fixture_id, deck_definition + ) + sequence.append( + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName=addressable_area + ) + ) + except FixtureDoesNotExistError: + # this is an OT-2 (or this module isn't supported in the deck definition) and we should use a + # slot addressable area name + sequence.append( + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName=location.slotName.value + ) + ) + + else: + # Slight hack: we should have a more formal association here. However, since the slot + # name is already standardized, and since the addressable areas for slots are just the + # name of the slots, we can rely on this. + sequence.append( + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName=location.slotName.value + ) + ) + return sequence + + +def _offset_location_sequence_head_to_labware_and_module( + location_sequence: LabwareOffsetLocationSequence, +) -> tuple[ModuleModel | None, str | None]: + labware_uri: str | None = None + module_model: ModuleModel | None = None + for location in location_sequence: + if isinstance(location, OnAddressableAreaOffsetLocationSequenceComponent): + raise OffsetLocationInvalidError( + "Addressable areas may only be the final element of an offset location." + ) + elif isinstance(location, OnLabwareOffsetLocationSequenceComponent): + if labware_uri is not None: + # We only take the first location + continue + if module_model is not None: + # Labware can't be underneath modules + raise OffsetLocationInvalidError( + "Labware must not be underneath a module." + ) + labware_uri = location.labwareUri + elif isinstance(location, OnModuleOffsetLocationSequenceComponent): + if module_model is not None: + # Bad, somebody put more than one module in here + raise OffsetLocationInvalidError( + "Only one module location may exist in an offset location." + ) + module_model = location.moduleModel + else: + raise OffsetLocationInvalidError( + f"Invalid location component in offset location: {repr(location)}" + ) + return module_model, labware_uri + + +def _offset_location_sequence_to_legacy_offset_location( + location_sequence: LabwareOffsetLocationSequence, deck_definition: DeckDefinitionV5 +) -> LegacyLabwareOffsetLocation: + if len(location_sequence) == 0: + raise OffsetLocationInvalidError( + "Offset locations must contain at least one component." + ) + last_element = location_sequence[-1] + if not isinstance(last_element, OnAddressableAreaOffsetLocationSequenceComponent): + raise OffsetLocationInvalidError( + "Offset locations must end with an addressable area." + ) + module_model, labware_uri = _offset_location_sequence_head_to_labware_and_module( + location_sequence[:-1] + ) + ( + cutout_id, + cutout_fixtures, + ) = deck_configuration_provider.get_potential_cutout_fixtures( + last_element.addressableAreaName, deck_definition + ) + slot_name = deck_configuration_provider.get_deck_slot_for_cutout_id(cutout_id) + return LegacyLabwareOffsetLocation( + slotName=slot_name, moduleModel=module_model, definitionUri=labware_uri + ) + + +def _locations_for_create( + request: LabwareOffsetCreate | LegacyLabwareOffsetCreate, + robot_type: RobotType, + deck_definition: DeckDefinitionV5, +) -> tuple[LabwareOffsetLocationSequence, LegacyLabwareOffsetLocation]: + if isinstance(request, LabwareOffsetCreate): + return ( + request.locationSequence, + _offset_location_sequence_to_legacy_offset_location( + request.locationSequence, deck_definition + ), + ) + else: + normalized = request.location.model_copy( + update={ + "slotName": request.location.slotName.to_equivalent_for_robot_type( + robot_type + ) + } + ) + return ( + _legacy_offset_location_to_offset_location_sequence( + normalized, deck_definition + ), + normalized, + ) diff --git a/api/src/opentrons/protocol_engine/protocol_engine.py b/api/src/opentrons/protocol_engine/protocol_engine.py index d1636d18001..04579efc590 100644 --- a/api/src/opentrons/protocol_engine/protocol_engine.py +++ b/api/src/opentrons/protocol_engine/protocol_engine.py @@ -1,4 +1,5 @@ """ProtocolEngine class definition.""" + from contextlib import AsyncExitStack from logging import getLogger from typing import Dict, Optional, Union, AsyncGenerator, Callable @@ -20,11 +21,12 @@ from .errors import ProtocolCommandFailedError, ErrorOccurrence, CommandNotAllowedError from .errors.exceptions import EStopActivatedError from .error_recovery_policy import ErrorRecoveryPolicy -from . import commands, slot_standardization +from . import commands, slot_standardization, labware_offset_standardization from .resources import ModelUtils, ModuleDataProvider, FileProvider from .types import ( LabwareOffset, LabwareOffsetCreate, + LegacyLabwareOffsetCreate, LabwareUri, ModuleModel, Liquid, @@ -517,15 +519,21 @@ async def finish( ) ) - def add_labware_offset(self, request: LabwareOffsetCreate) -> LabwareOffset: + def add_labware_offset( + self, request: LabwareOffsetCreate | LegacyLabwareOffsetCreate + ) -> LabwareOffset: """Add a new labware offset and return it. The added offset will apply to subsequent `LoadLabwareCommand`s. To retrieve offsets later, see `.state_view.labware`. """ - request = slot_standardization.standardize_labware_offset( - request, self.state_view.config.robot_type + internal_request = ( + labware_offset_standardization.standardize_labware_offset_create( + request, + self.state_view.config.robot_type, + self.state_view.addressable_areas.deck_definition, + ) ) labware_offset_id = self._model_utils.generate_id() @@ -534,7 +542,7 @@ def add_labware_offset(self, request: LabwareOffsetCreate) -> LabwareOffset: AddLabwareOffsetAction( labware_offset_id=labware_offset_id, created_at=created_at, - request=request, + request=internal_request, ) ) return self.state_view.labware.get_labware_offset( diff --git a/api/src/opentrons/protocol_engine/resources/deck_configuration_provider.py b/api/src/opentrons/protocol_engine/resources/deck_configuration_provider.py index 739d56ded00..6ec09136387 100644 --- a/api/src/opentrons/protocol_engine/resources/deck_configuration_provider.py +++ b/api/src/opentrons/protocol_engine/resources/deck_configuration_provider.py @@ -1,7 +1,11 @@ """Deck configuration resource provider.""" + from typing import List, Set, Tuple -from opentrons_shared_data.deck.types import DeckDefinitionV5, CutoutFixture +from opentrons_shared_data.deck.types import ( + DeckDefinitionV5, + CutoutFixture, +) from opentrons.types import DeckSlotName @@ -17,6 +21,7 @@ CutoutDoesNotExistError, FixtureDoesNotExistError, AddressableAreaDoesNotExistError, + SlotDoesNotExistError, ) @@ -98,12 +103,15 @@ def get_potential_cutout_fixtures( def get_addressable_area_from_name( addressable_area_name: str, cutout_position: DeckPoint, - base_slot: DeckSlotName, deck_definition: DeckDefinitionV5, ) -> AddressableArea: """Given a name and a cutout position, get an addressable area on the deck.""" for addressable_area in deck_definition["locations"]["addressableAreas"]: if addressable_area["id"] == addressable_area_name: + cutout_id, _ = get_potential_cutout_fixtures( + addressable_area_name, deck_definition + ) + base_slot = get_deck_slot_for_cutout_id(cutout_id) area_offset = addressable_area["offsetFromCutoutFixture"] position = AddressableOffsetVector( x=area_offset[0] + cutout_position.x, @@ -130,3 +138,87 @@ def get_addressable_area_from_name( raise AddressableAreaDoesNotExistError( f"Could not find addressable area with name {addressable_area_name}" ) + + +def get_deck_slot_for_cutout_id(cutout_id: str) -> DeckSlotName: + """Get the corresponding deck slot for an addressable area.""" + try: + return CUTOUT_TO_DECK_SLOT_MAP[cutout_id] + except KeyError: + raise CutoutDoesNotExistError(f"Could not find data for cutout {cutout_id}") + + +def get_cutout_id_by_deck_slot_name(slot_name: DeckSlotName) -> str: + """Get the Cutout ID of a given Deck Slot by Deck Slot Name.""" + try: + return DECK_SLOT_TO_CUTOUT_MAP[slot_name] + except KeyError: + raise SlotDoesNotExistError(f"Could not find data for slot {slot_name.value}") + + +def get_labware_hosting_addressable_area_name_for_cutout_and_cutout_fixture( + cutout_id: str, cutout_fixture_id: str, deck_definition: DeckDefinitionV5 +) -> str: + """Get the first addressable area that can contain labware for a cutout and fixture. + + This probably isn't relevant outside of labware offset locations, where (for now) nothing + provides more than one labware-containing addressable area. + """ + for cutoutFixture in deck_definition["cutoutFixtures"]: + if cutoutFixture["id"] != cutout_fixture_id: + continue + provided_aas = cutoutFixture["providesAddressableAreas"].get(cutout_id, None) + if provided_aas is None: + raise CutoutDoesNotExistError( + f"{cutout_fixture_id} does not go in {cutout_id}" + ) + for aa_id in provided_aas: + for addressable_area in deck_definition["locations"]["addressableAreas"]: + if addressable_area["id"] != aa_id: + continue + # TODO: In deck def v6 this will be easier, but as of right now there isn't really + # a way to tell from an addressable area whether it takes labware so let's take the + # first one + return aa_id + raise AddressableAreaDoesNotExistError( + f"Could not find an addressable area that allows labware from cutout fixture {cutout_fixture_id} in cutout {cutout_id}" + ) + + raise FixtureDoesNotExistError(f"Could not find entry for {cutout_fixture_id}") + + +# This is a temporary shim while Protocol Engine's conflict-checking code +# can only take deck slots as input. +# Long-term solution: Check for conflicts based on bounding boxes, not slot adjacencies. +# Shorter-term: Change the conflict-checking code to take cutouts instead of deck slots. +CUTOUT_TO_DECK_SLOT_MAP: dict[str, DeckSlotName] = { + # OT-2 + "cutout1": DeckSlotName.SLOT_1, + "cutout2": DeckSlotName.SLOT_2, + "cutout3": DeckSlotName.SLOT_3, + "cutout4": DeckSlotName.SLOT_4, + "cutout5": DeckSlotName.SLOT_5, + "cutout6": DeckSlotName.SLOT_6, + "cutout7": DeckSlotName.SLOT_7, + "cutout8": DeckSlotName.SLOT_8, + "cutout9": DeckSlotName.SLOT_9, + "cutout10": DeckSlotName.SLOT_10, + "cutout11": DeckSlotName.SLOT_11, + "cutout12": DeckSlotName.FIXED_TRASH, + # Flex + "cutoutA1": DeckSlotName.SLOT_A1, + "cutoutA2": DeckSlotName.SLOT_A2, + "cutoutA3": DeckSlotName.SLOT_A3, + "cutoutB1": DeckSlotName.SLOT_B1, + "cutoutB2": DeckSlotName.SLOT_B2, + "cutoutB3": DeckSlotName.SLOT_B3, + "cutoutC1": DeckSlotName.SLOT_C1, + "cutoutC2": DeckSlotName.SLOT_C2, + "cutoutC3": DeckSlotName.SLOT_C3, + "cutoutD1": DeckSlotName.SLOT_D1, + "cutoutD2": DeckSlotName.SLOT_D2, + "cutoutD3": DeckSlotName.SLOT_D3, +} +DECK_SLOT_TO_CUTOUT_MAP = { + deck_slot: cutout for cutout, deck_slot in CUTOUT_TO_DECK_SLOT_MAP.items() +} diff --git a/api/src/opentrons/protocol_engine/slot_standardization.py b/api/src/opentrons/protocol_engine/slot_standardization.py index 5943febc820..935bb54da3f 100644 --- a/api/src/opentrons/protocol_engine/slot_standardization.py +++ b/api/src/opentrons/protocol_engine/slot_standardization.py @@ -14,7 +14,6 @@ deck slot. """ - from typing import Any, Callable, Dict, Type from opentrons_shared_data.robot.types import RobotType @@ -26,29 +25,11 @@ DeckSlotLocation, LabwareLocation, AddressableAreaLocation, - LabwareOffsetCreate, ModuleLocation, OnLabwareLocation, ) -def standardize_labware_offset( - original: LabwareOffsetCreate, robot_type: RobotType -) -> LabwareOffsetCreate: - """Convert the deck slot in the given `LabwareOffsetCreate` to match the given robot type.""" - return original.model_copy( - update={ - "location": original.location.model_copy( - update={ - "slotName": original.location.slotName.to_equivalent_for_robot_type( - robot_type - ) - } - ) - } - ) - - def standardize_command( original: commands.CommandCreate, robot_type: RobotType ) -> commands.CommandCreate: diff --git a/api/src/opentrons/protocol_engine/state/addressable_areas.py b/api/src/opentrons/protocol_engine/state/addressable_areas.py index 16898ccb4ed..c227fa72285 100644 --- a/api/src/opentrons/protocol_engine/state/addressable_areas.py +++ b/api/src/opentrons/protocol_engine/state/addressable_areas.py @@ -1,4 +1,5 @@ """Basic addressable area data state and store.""" + from dataclasses import dataclass from functools import cached_property from typing import Dict, List, Optional, Set @@ -112,43 +113,6 @@ def _get_conflicting_addressable_areas_error_string( return ", ".join(display_names) -# This is a temporary shim while Protocol Engine's conflict-checking code -# can only take deck slots as input. -# Long-term solution: Check for conflicts based on bounding boxes, not slot adjacencies. -# Shorter-term: Change the conflict-checking code to take cutouts instead of deck slots. -CUTOUT_TO_DECK_SLOT_MAP: Dict[str, DeckSlotName] = { - # OT-2 - "cutout1": DeckSlotName.SLOT_1, - "cutout2": DeckSlotName.SLOT_2, - "cutout3": DeckSlotName.SLOT_3, - "cutout4": DeckSlotName.SLOT_4, - "cutout5": DeckSlotName.SLOT_5, - "cutout6": DeckSlotName.SLOT_6, - "cutout7": DeckSlotName.SLOT_7, - "cutout8": DeckSlotName.SLOT_8, - "cutout9": DeckSlotName.SLOT_9, - "cutout10": DeckSlotName.SLOT_10, - "cutout11": DeckSlotName.SLOT_11, - "cutout12": DeckSlotName.FIXED_TRASH, - # Flex - "cutoutA1": DeckSlotName.SLOT_A1, - "cutoutA2": DeckSlotName.SLOT_A2, - "cutoutA3": DeckSlotName.SLOT_A3, - "cutoutB1": DeckSlotName.SLOT_B1, - "cutoutB2": DeckSlotName.SLOT_B2, - "cutoutB3": DeckSlotName.SLOT_B3, - "cutoutC1": DeckSlotName.SLOT_C1, - "cutoutC2": DeckSlotName.SLOT_C2, - "cutoutC3": DeckSlotName.SLOT_C3, - "cutoutD1": DeckSlotName.SLOT_D1, - "cutoutD2": DeckSlotName.SLOT_D2, - "cutoutD3": DeckSlotName.SLOT_D3, -} -DECK_SLOT_TO_CUTOUT_MAP = { - deck_slot: cutout for cutout, deck_slot in CUTOUT_TO_DECK_SLOT_MAP.items() -} - - class AddressableAreaStore(HasState[AddressableAreaState], HandlesActions): """Addressable area state container.""" @@ -221,13 +185,11 @@ def _get_addressable_areas_from_deck_configuration( cutout_position = deck_configuration_provider.get_cutout_position( cutout_id, deck_definition ) - base_slot = CUTOUT_TO_DECK_SLOT_MAP[cutout_id] for addressable_area_name in provided_addressable_areas: addressable_areas.append( deck_configuration_provider.get_addressable_area_from_name( addressable_area_name=addressable_area_name, cutout_position=cutout_position, - base_slot=base_slot, deck_definition=deck_definition, ) ) @@ -242,12 +204,10 @@ def _add_addressable_area(self, addressable_area_name: str) -> None: cutout_position = deck_configuration_provider.get_cutout_position( cutout_id, self._state.deck_definition ) - base_slot = CUTOUT_TO_DECK_SLOT_MAP[cutout_id] addressable_area = ( deck_configuration_provider.get_addressable_area_from_name( addressable_area_name=addressable_area_name, cutout_position=cutout_position, - base_slot=base_slot, deck_definition=self._state.deck_definition, ) ) @@ -300,6 +260,11 @@ def __init__(self, state: AddressableAreaState) -> None: """ self._state = state + @cached_property + def deck_definition(self) -> DeckDefinitionV5: + """The full deck definition.""" + return self._state.deck_definition + @cached_property def deck_extents(self) -> Point: """The maximum space on the deck.""" @@ -426,11 +391,9 @@ def _get_addressable_area_from_deck_data( cutout_position = deck_configuration_provider.get_cutout_position( cutout_id, self._state.deck_definition ) - base_slot = CUTOUT_TO_DECK_SLOT_MAP[cutout_id] return deck_configuration_provider.get_addressable_area_from_name( addressable_area_name=addressable_area_name, cutout_position=cutout_position, - base_slot=base_slot, deck_definition=self._state.deck_definition, ) @@ -526,7 +489,7 @@ def get_addressable_area_center(self, addressable_area_name: str) -> Point: def get_cutout_id_by_deck_slot_name(self, slot_name: DeckSlotName) -> str: """Get the Cutout ID of a given Deck Slot by Deck Slot Name.""" - return DECK_SLOT_TO_CUTOUT_MAP[slot_name] + return deck_configuration_provider.get_cutout_id_by_deck_slot_name(slot_name) def get_fixture_by_deck_slot_name( self, slot_name: DeckSlotName @@ -534,7 +497,9 @@ def get_fixture_by_deck_slot_name( """Get the Cutout Fixture currently loaded where a specific Deck Slot would be.""" deck_config = self._state.deck_configuration if deck_config: - slot_cutout_id = DECK_SLOT_TO_CUTOUT_MAP[slot_name] + slot_cutout_id = ( + deck_configuration_provider.get_cutout_id_by_deck_slot_name(slot_name) + ) slot_cutout_fixture = None # This will only ever be one under current assumptions for ( @@ -571,7 +536,9 @@ def get_fixture_serial_from_deck_configuration_by_deck_slot( """Get the serial number provided by the deck configuration for a Fixture at a given location.""" deck_config = self._state.deck_configuration if deck_config: - slot_cutout_id = DECK_SLOT_TO_CUTOUT_MAP[slot_name] + slot_cutout_id = ( + deck_configuration_provider.get_cutout_id_by_deck_slot_name(slot_name) + ) # This will only ever be one under current assumptions for ( cutout_id, diff --git a/api/src/opentrons/protocol_engine/state/geometry.py b/api/src/opentrons/protocol_engine/state/geometry.py index 9a817564c67..adebf800082 100644 --- a/api/src/opentrons/protocol_engine/state/geometry.py +++ b/api/src/opentrons/protocol_engine/state/geometry.py @@ -51,7 +51,10 @@ AddressableAreaLocation, AddressableOffsetVector, StagingSlotLocation, - LabwareOffsetLocation, + LabwareOffsetLocationSequence, + OnModuleOffsetLocationSequenceComponent, + OnAddressableAreaOffsetLocationSequenceComponent, + OnLabwareOffsetLocationSequenceComponent, ModuleModel, ) from .config import Config @@ -1361,50 +1364,91 @@ def _labware_gripper_offsets( labware_id=labware_id, slot_name=None ) - def get_offset_location(self, labware_id: str) -> Optional[LabwareOffsetLocation]: - """Provide the LabwareOffsetLocation specifying the current position of the labware. + def get_offset_location( + self, labware_id: str + ) -> Optional[LabwareOffsetLocationSequence]: + """Provide the LegacyLabwareOffsetLocation specifying the current position of the labware. - If the labware is in a location that cannot be specified by a LabwareOffsetLocation + If the labware is in a location that cannot be specified by a LabwareOffsetLocationSequence (for instance, OFF_DECK) then return None. """ parent_location = self._labware.get_location(labware_id) - - if isinstance(parent_location, DeckSlotLocation): - return LabwareOffsetLocation( - slotName=parent_location.slotName, moduleModel=None, definitionUri=None - ) - elif isinstance(parent_location, ModuleLocation): - module_model = self._modules.get_requested_model(parent_location.moduleId) - module_location = self._modules.get_location(parent_location.moduleId) - return LabwareOffsetLocation( - slotName=module_location.slotName, - moduleModel=module_model, - definitionUri=None, - ) - elif isinstance(parent_location, OnLabwareLocation): - non_labware_parent_location = self._labware.get_parent_location(labware_id) - - parent_uri = self._labware.get_definition_uri(parent_location.labwareId) - if isinstance(non_labware_parent_location, DeckSlotLocation): - return LabwareOffsetLocation( - slotName=non_labware_parent_location.slotName, - moduleModel=None, - definitionUri=parent_uri, - ) - elif isinstance(non_labware_parent_location, ModuleLocation): - module_model = self._modules.get_requested_model( - non_labware_parent_location.moduleId + return self.get_projected_offset_location(parent_location) + + def get_projected_offset_location( + self, labware_location: LabwareLocation + ) -> Optional[LabwareOffsetLocationSequence]: + """Get the offset location that a labware loaded into this location would match.""" + return self._recurse_labware_offset_location(labware_location, []) + + def _recurse_labware_offset_location( + self, labware_location: LabwareLocation, building: LabwareOffsetLocationSequence + ) -> LabwareOffsetLocationSequence | None: + if isinstance(labware_location, DeckSlotLocation): + return building + [ + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName=labware_location.slotName.value ) - module_location = self._modules.get_location( - non_labware_parent_location.moduleId - ) - return LabwareOffsetLocation( - slotName=module_location.slotName, - moduleModel=module_model, - definitionUri=parent_uri, + ] + + elif isinstance(labware_location, ModuleLocation): + module_id = labware_location.moduleId + # Allow ModuleNotLoadedError to propagate. + # Note also that we match based on the module's requested model, not its + # actual model, to implement robot-server's documented HTTP API semantics. + module_model = self._modules.get_requested_model(module_id=module_id) + + # If `module_model is None`, it probably means that this module was added by + # `ProtocolEngine.use_attached_modules()`, instead of an explicit + # `loadModule` command. + # + # This assert should never raise in practice because: + # 1. `ProtocolEngine.use_attached_modules()` is only used by + # robot-server's "stateless command" endpoints, under `/commands`. + # 2. Those endpoints don't support loading labware, so this code will + # never run. + # + # Nevertheless, if it does happen somehow, we do NOT want to pass the + # `None` value along to `LabwareView.find_applicable_labware_offset()`. + # `None` means something different there, which will cause us to return + # wrong results. + assert module_model is not None, ( + "Can't find offsets for labware" + " that are loaded on modules" + " that were loaded with ProtocolEngine.use_attached_modules()." + ) + + module_location = self._modules.get_location(module_id=module_id) + if self._modules.get_deck_supports_module_fixtures(): + module_aa = self._modules.ensure_and_convert_module_fixture_location( + module_location.slotName, module_model ) + else: + module_aa = module_location.slotName.value + return building + [ + OnModuleOffsetLocationSequenceComponent(moduleModel=module_model), + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName=module_aa + ), + ] + + elif isinstance(labware_location, OnLabwareLocation): + parent_labware_id = labware_location.labwareId + parent_labware_uri = self._labware.get_definition_uri(parent_labware_id) + + base_location = self._labware.get_parent_location(parent_labware_id) + return self._recurse_labware_offset_location( + base_location, + building + + [ + OnLabwareOffsetLocationSequenceComponent( + labwareUri=parent_labware_uri + ) + ], + ) - return None + else: # Off deck + return None def get_well_offset_adjustment( self, diff --git a/api/src/opentrons/protocol_engine/state/labware.py b/api/src/opentrons/protocol_engine/state/labware.py index c4a2afcd62f..6063a46e6b8 100644 --- a/api/src/opentrons/protocol_engine/state/labware.py +++ b/api/src/opentrons/protocol_engine/state/labware.py @@ -1,4 +1,5 @@ """Basic labware data state and store.""" + from __future__ import annotations from dataclasses import dataclass @@ -41,7 +42,8 @@ Dimensions, LabwareOffset, LabwareOffsetVector, - LabwareOffsetLocation, + LabwareOffsetLocationSequence, + LegacyLabwareOffsetLocation, LabwareLocation, LoadedLabware, ModuleLocation, @@ -167,7 +169,8 @@ def handle_action(self, action: Action) -> None: id=action.labware_offset_id, createdAt=action.created_at, definitionUri=action.request.definitionUri, - location=action.request.location, + location=action.request.legacyLocation, + locationSequence=action.request.locationSequence, vector=action.request.vector, ) self._add_labware_offset(labware_offset) @@ -825,15 +828,32 @@ def get_labware_offsets(self) -> List[LabwareOffset]: """Get all labware offsets, in the order they were added.""" return list(self._state.labware_offsets_by_id.values()) - # TODO: Make this slightly more ergonomic for the caller by - # only returning the optional str ID, at the cost of baking redundant lookups - # into the API? def find_applicable_labware_offset( + self, definition_uri: str, location: LabwareOffsetLocationSequence + ) -> Optional[LabwareOffset]: + """Find a labware offset that applies to the given definition and location sequence. + + Returns the *most recently* added matching offset, so later ones can override earlier ones. + Returns ``None`` if no loaded offset matches the location. + + An offset matches a labware instance if the sequence of locations formed by following the + .location elements of the labware instance until you reach an addressable area has the same + definition URIs as the sequence of definition URIs stored by the offset. + """ + for candidate in reversed(list(self._state.labware_offsets_by_id.values())): + if ( + candidate.definitionUri == definition_uri + and candidate.locationSequence == location + ): + return candidate + return None + + def find_applicable_labware_offset_by_legacy_location( self, definition_uri: str, - location: LabwareOffsetLocation, + location: LegacyLabwareOffsetLocation, ) -> Optional[LabwareOffset]: - """Find a labware offset that applies to the given definition and location. + """Find a labware offset that applies to the given definition and legacy location. Returns the *most recently* added matching offset, so later offsets can override earlier ones. diff --git a/api/src/opentrons/protocol_engine/state/modules.py b/api/src/opentrons/protocol_engine/state/modules.py index 2717f2a6984..8fdfd44ee4f 100644 --- a/api/src/opentrons/protocol_engine/state/modules.py +++ b/api/src/opentrons/protocol_engine/state/modules.py @@ -1296,6 +1296,11 @@ def convert_absorbance_reader_data_points( "Only readings of 96 Well labware are supported for conversion to map of values by well." ) + def get_deck_supports_module_fixtures(self) -> bool: + """Check if the loaded deck supports modules as fixtures.""" + deck_type = self._state.deck_type + return deck_type not in [DeckType.OT2_STANDARD, DeckType.OT2_SHORT_TRASH] + def ensure_and_convert_module_fixture_location( self, deck_slot: DeckSlotName, @@ -1307,7 +1312,7 @@ def ensure_and_convert_module_fixture_location( """ deck_type = self._state.deck_type - if deck_type == DeckType.OT2_STANDARD or deck_type == DeckType.OT2_SHORT_TRASH: + if not self.get_deck_supports_module_fixtures(): raise ValueError( f"Invalid Deck Type: {deck_type.name} - Does not support modules as fixtures." ) diff --git a/api/src/opentrons/protocol_engine/types/__init__.py b/api/src/opentrons/protocol_engine/types/__init__.py index 9bf512a7a29..fbaef870f3e 100644 --- a/api/src/opentrons/protocol_engine/types/__init__.py +++ b/api/src/opentrons/protocol_engine/types/__init__.py @@ -83,10 +83,18 @@ OverlapOffset, LabwareOffset, LabwareOffsetCreate, + LegacyLabwareOffsetCreate, + LabwareOffsetCreateInternal, LoadedLabware, ) from .liquid import HexColor, EmptyLiquidId, LiquidId, Liquid, FluidKind, AspiratedFluid -from .labware_offset_location import LabwareOffsetLocation +from .labware_offset_location import ( + LegacyLabwareOffsetLocation, + LabwareOffsetLocationSequence, + OnLabwareOffsetLocationSequenceComponent, + OnModuleOffsetLocationSequenceComponent, + OnAddressableAreaOffsetLocationSequenceComponent, +) from .labware_offset_vector import LabwareOffsetVector from .well_position import ( WellOrigin, @@ -194,13 +202,19 @@ "NonStackedLocation", "DeckPoint", # Labware offset location - "LabwareOffsetLocation", + "LegacyLabwareOffsetLocation", + "LabwareOffsetLocationSequence", + "OnLabwareOffsetLocationSequenceComponent", + "OnModuleOffsetLocationSequenceComponent", + "OnAddressableAreaOffsetLocationSequenceComponent", # Labware offset vector "LabwareOffsetVector", # Labware "OverlapOffset", "LabwareOffset", "LabwareOffsetCreate", + "LegacyLabwareOffsetCreate", + "LabwareOffsetCreateInternal", "LoadedLabware", "LabwareOffsetVector", # Liquids diff --git a/api/src/opentrons/protocol_engine/types/labware.py b/api/src/opentrons/protocol_engine/types/labware.py index b0dd5d52d31..bb8a4656d58 100644 --- a/api/src/opentrons/protocol_engine/types/labware.py +++ b/api/src/opentrons/protocol_engine/types/labware.py @@ -3,12 +3,16 @@ from __future__ import annotations from typing import Optional +from dataclasses import dataclass from datetime import datetime from pydantic import BaseModel, Field from .location import LabwareLocation -from .labware_offset_location import LabwareOffsetLocation +from .labware_offset_location import ( + LegacyLabwareOffsetLocation, + LabwareOffsetLocationSequence, +) from .labware_offset_vector import LabwareOffsetVector from .util import Vec3f @@ -28,9 +32,13 @@ class LabwareOffset(BaseModel): id: str = Field(..., description="Unique labware offset record identifier.") createdAt: datetime = Field(..., description="When this labware offset was added.") definitionUri: str = Field(..., description="The URI for the labware's definition.") - location: LabwareOffsetLocation = Field( + location: LegacyLabwareOffsetLocation = Field( ..., - description="Where the labware is located on the robot.", + description="Where the labware is located on the robot. Deprecated and present only for backwards compatibility; cannot represent certain locations. Use locationSequence instead.", + ) + locationSequence: Optional[LabwareOffsetLocationSequence] = Field( + default=None, + description="Where the labware is located on the robot. Can represent all locations, but may not be present for older runs.", ) vector: LabwareOffsetVector = Field( ..., @@ -38,11 +46,11 @@ class LabwareOffset(BaseModel): ) -class LabwareOffsetCreate(BaseModel): - """Create request data for a labware offset.""" +class LegacyLabwareOffsetCreate(BaseModel): + """Create request data for a labware offset with a legacy location field.""" definitionUri: str = Field(..., description="The URI for the labware's definition.") - location: LabwareOffsetLocation = Field( + location: LegacyLabwareOffsetLocation = Field( ..., description="Where the labware is located on the robot.", ) @@ -52,6 +60,28 @@ class LabwareOffsetCreate(BaseModel): ) +class LabwareOffsetCreate(BaseModel): + """Create request data for a labware offset with a modern location sequence.""" + + definitionUri: str = Field(..., description="The URI for the labware's definition.") + locationSequence: LabwareOffsetLocationSequence = Field( + ..., description="Where the labware is located on the robot." + ) + vector: LabwareOffsetVector = Field( + ..., description="The offset applied to matching labware." + ) + + +@dataclass(frozen=True) +class LabwareOffsetCreateInternal: + """An internal-only labware offset creator that captures both old and new location arguments.""" + + definitionUri: str + locationSequence: LabwareOffsetLocationSequence + legacyLocation: LegacyLabwareOffsetLocation + vector: LabwareOffsetVector + + class LoadedLabware(BaseModel): """A labware that has been loaded.""" diff --git a/api/src/opentrons/protocol_engine/types/labware_offset_location.py b/api/src/opentrons/protocol_engine/types/labware_offset_location.py index cf7496be2e0..2b992a4da01 100644 --- a/api/src/opentrons/protocol_engine/types/labware_offset_location.py +++ b/api/src/opentrons/protocol_engine/types/labware_offset_location.py @@ -3,7 +3,7 @@ This is its own module to fix circular imports. """ -from typing import Optional +from typing import Optional, Literal from pydantic import BaseModel, Field @@ -12,7 +12,52 @@ from .module import ModuleModel -class LabwareOffsetLocation(BaseModel): +class OnLabwareOffsetLocationSequenceComponent(BaseModel): + """Offset location sequence component for a labware on another labware.""" + + kind: Literal["onLabware"] = "onLabware" + labwareUri: str = Field( + ..., + description="The definition URI of a labware that a labware can be loaded onto.", + ) + + +class OnModuleOffsetLocationSequenceComponent(BaseModel): + """Offset location sequence component for a labware on a module.""" + + kind: Literal["onModule"] = "onModule" + moduleModel: ModuleModel = Field( + ..., description="The model of a module that a lwbare can be loaded on to." + ) + + +class OnAddressableAreaOffsetLocationSequenceComponent(BaseModel): + """Offset location sequence component for a labware on an addressable area.""" + + kind: Literal["onAddressableArea"] = "onAddressableArea" + addressableAreaName: str = Field( + ..., + description=( + 'The ID of an addressable area that a labware or module can be loaded onto, such as (on the OT-2) "2" ' + 'or (on the Flex) "C1". ' + "\n\n" + "On the Flex, this field must be correct for the kind of entity it hosts. For instance, if the prior entity " + "in the location sequence is an `OnModuleOffsetLocationSequenceComponent(moduleModel=temperatureModuleV2)`, " + "this entity must be temperatureModuleV2NN where NN is the slot name in which the module resides. " + ), + ) + + +LabwareOffsetLocationSequenceComponents = ( + OnLabwareOffsetLocationSequenceComponent + | OnModuleOffsetLocationSequenceComponent + | OnAddressableAreaOffsetLocationSequenceComponent +) + +LabwareOffsetLocationSequence = list[LabwareOffsetLocationSequenceComponents] + + +class LegacyLabwareOffsetLocation(BaseModel): """Parameters describing when a given offset may apply to a given labware load.""" slotName: DeckSlotName = Field( diff --git a/api/src/opentrons/protocol_engine/types/location.py b/api/src/opentrons/protocol_engine/types/location.py index 5397b17cfeb..cc174f4bdea 100644 --- a/api/src/opentrons/protocol_engine/types/location.py +++ b/api/src/opentrons/protocol_engine/types/location.py @@ -13,7 +13,7 @@ class DeckSlotLocation(BaseModel): slotName: DeckSlotName = Field( ..., description=( - # This description should be kept in sync with LabwareOffsetLocation.slotName. + # This description should be kept in sync with LegacyLabwareOffsetLocation.slotName. "A slot on the robot's deck." "\n\n" 'The plain numbers like `"5"` are for the OT-2,' @@ -33,7 +33,7 @@ class StagingSlotLocation(BaseModel): slotName: StagingSlotName = Field( ..., description=( - # This description should be kept in sync with LabwareOffsetLocation.slotName. + # This description should be kept in sync with LegacyLabwareOffsetLocation.slotName. "A slot on the robot's staging area." "\n\n" "These apply only to the Flex. The OT-2 has no staging slots." @@ -77,6 +77,45 @@ class OnLabwareLocation(BaseModel): OFF_DECK_LOCATION: _OffDeckLocationType = "offDeck" SYSTEM_LOCATION: _SystemLocationType = "systemLocation" + +class OnLabwareLocationSequenceComponent(BaseModel): + """Labware on another labware.""" + + kind: Literal["onLabware"] = "onLabware" + labwareId: str + lidId: str | None + + +class OnModuleLocationSequenceComponent(BaseModel): + """Labware on a module.""" + + kind: Literal["onModule"] = "onModule" + moduleId: str + + +class OnAddressableAreaLocationSequenceComponent(BaseModel): + """Labware on an addressable area.""" + + kind: Literal["onAddressableArea"] = "onAddressableArea" + addressableAreaName: str + slotName: str | None + + +class NotOnDeckLocationSequenceComponent(BaseModel): + """Labware on a system location.""" + + kind: Literal["notOnDeck"] = "notOnDeck" + logicalLocationName: _OffDeckLocationType | _SystemLocationType + + +LabwareLocationSequence = list[ + OnLabwareLocationSequenceComponent + | OnModuleLocationSequenceComponent + | OnAddressableAreaLocationSequenceComponent + | NotOnDeckLocationSequenceComponent +] +"""Labware location specifier.""" + LabwareLocation = Union[ DeckSlotLocation, ModuleLocation, diff --git a/api/src/opentrons/protocol_runner/run_orchestrator.py b/api/src/opentrons/protocol_runner/run_orchestrator.py index 28266a9c485..b45d8b9db94 100644 --- a/api/src/opentrons/protocol_runner/run_orchestrator.py +++ b/api/src/opentrons/protocol_runner/run_orchestrator.py @@ -32,6 +32,7 @@ PostRunHardwareState, EngineStatus, LabwareOffsetCreate, + LegacyLabwareOffsetCreate, LabwareOffset, DeckConfigurationType, RunTimeParameter, @@ -346,7 +347,9 @@ def run_has_stopped(self) -> bool: """Get whether the run has stopped.""" return self._protocol_engine.state_view.commands.get_is_stopped() - def add_labware_offset(self, request: LabwareOffsetCreate) -> LabwareOffset: + def add_labware_offset( + self, request: LabwareOffsetCreate | LegacyLabwareOffsetCreate + ) -> LabwareOffset: """Add a new labware offset to state.""" return self._protocol_engine.add_labware_offset(request) diff --git a/api/tests/opentrons/protocol_api/core/engine/test_labware_core.py b/api/tests/opentrons/protocol_api/core/engine/test_labware_core.py index beca8fe99d1..06c2445d79e 100644 --- a/api/tests/opentrons/protocol_api/core/engine/test_labware_core.py +++ b/api/tests/opentrons/protocol_api/core/engine/test_labware_core.py @@ -23,8 +23,9 @@ from opentrons.protocol_engine.errors import LabwareNotOnDeckError from opentrons.protocol_engine.types import ( LabwareOffsetCreate, - LabwareOffsetLocation, + LabwareOffsetLocationSequence, LabwareOffsetVector, + OnAddressableAreaOffsetLocationSequenceComponent, ) from opentrons.protocol_api._liquid import Liquid from opentrons.protocol_api.core.labware import LabwareLoadParams @@ -106,16 +107,18 @@ def test_set_calibration_succeeds_in_ok_location( decoy.when( mock_engine_client.state.labware.get_display_name("cool-labware") ).then_return("what a cool labware") - location = LabwareOffsetLocation(slotName=DeckSlotName.SLOT_C2) + location = [ + OnAddressableAreaOffsetLocationSequenceComponent(addressableAreaName="C2") + ] decoy.when( mock_engine_client.state.geometry.get_offset_location("cool-labware") - ).then_return(location) + ).then_return(cast(LabwareOffsetLocationSequence, location)) subject.set_calibration(Point(1, 2, 3)) decoy.verify( mock_engine_client.add_labware_offset( LabwareOffsetCreate( definitionUri="hello/world/42", - location=location, + locationSequence=cast(LabwareOffsetLocationSequence, location), vector=LabwareOffsetVector(x=1, y=2, z=3), ) ), diff --git a/api/tests/opentrons/protocol_api/core/legacy/test_labware_offset_provider.py b/api/tests/opentrons/protocol_api/core/legacy/test_labware_offset_provider.py index 1cf0bb360fb..a31abe5b06b 100644 --- a/api/tests/opentrons/protocol_api/core/legacy/test_labware_offset_provider.py +++ b/api/tests/opentrons/protocol_api/core/legacy/test_labware_offset_provider.py @@ -12,7 +12,7 @@ ProtocolEngine, LabwareOffset, LabwareOffsetVector, - LabwareOffsetLocation, + LegacyLabwareOffsetLocation, ModuleModel, ) from opentrons.protocol_engine.state.labware import LabwareView @@ -47,9 +47,9 @@ def test_find_something( ) -> None: """It should pass along simplified labware offset info from Protocol Engine.""" decoy.when( - labware_view.find_applicable_labware_offset( + labware_view.find_applicable_labware_offset_by_legacy_location( definition_uri="some_namespace/some_load_name/123", - location=LabwareOffsetLocation( + location=LegacyLabwareOffsetLocation( slotName=DeckSlotName.SLOT_1, moduleModel=ModuleModel.TEMPERATURE_MODULE_V1, ), @@ -61,7 +61,7 @@ def test_find_something( vector=LabwareOffsetVector(x=1, y=2, z=3), # Shouldn't matter; subject should throw these away: definitionUri="result_definition_uri_should_not_matter", - location=LabwareOffsetLocation(slotName=DeckSlotName.SLOT_11), + location=LegacyLabwareOffsetLocation(slotName=DeckSlotName.SLOT_11), createdAt=datetime(year=2021, month=1, day=1), ) ) @@ -82,12 +82,14 @@ def test_find_nothing( subject: LabwareOffsetProvider, labware_view: LabwareView, decoy: Decoy ) -> None: """It should return a zero offset when Protocol Engine has no offset to provide.""" - decoy_call_rehearsal = labware_view.find_applicable_labware_offset( - definition_uri="some_namespace/some_load_name/123", - location=LabwareOffsetLocation( - slotName=DeckSlotName.SLOT_1, - moduleModel=ModuleModel.TEMPERATURE_MODULE_V1, - ), + decoy_call_rehearsal = ( + labware_view.find_applicable_labware_offset_by_legacy_location( + definition_uri="some_namespace/some_load_name/123", + location=LegacyLabwareOffsetLocation( + slotName=DeckSlotName.SLOT_1, + moduleModel=ModuleModel.TEMPERATURE_MODULE_V1, + ), + ) ) decoy.when(decoy_call_rehearsal).then_return(None) diff --git a/api/tests/opentrons/protocol_engine/execution/test_equipment_handler.py b/api/tests/opentrons/protocol_engine/execution/test_equipment_handler.py index 5d3edc307bd..29c1eaa6d35 100644 --- a/api/tests/opentrons/protocol_engine/execution/test_equipment_handler.py +++ b/api/tests/opentrons/protocol_engine/execution/test_equipment_handler.py @@ -33,7 +33,10 @@ LoadedPipette, LabwareOffset, LabwareOffsetVector, - LabwareOffsetLocation, + LegacyLabwareOffsetLocation, + OnAddressableAreaOffsetLocationSequenceComponent, + OnModuleOffsetLocationSequenceComponent, + OnLabwareOffsetLocationSequenceComponent, ModuleModel, ModuleDefinition, OFF_DECK_LOCATION, @@ -231,18 +234,34 @@ async def test_load_labware( version=1, ) ).then_return(minimal_labware_def) + decoy.when( + state_store.geometry.get_projected_offset_location( + DeckSlotLocation(slotName=DeckSlotName.SLOT_3) + ) + ).then_return( + [OnAddressableAreaOffsetLocationSequenceComponent(addressableAreaName="3")] + ) decoy.when( state_store.labware.find_applicable_labware_offset( definition_uri="opentrons-test/load-name/1", - location=LabwareOffsetLocation(slotName=DeckSlotName.SLOT_3), + location=[ + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="3" + ) + ], ) ).then_return( LabwareOffset( id="labware-offset-id", createdAt=datetime(year=2021, month=1, day=2), definitionUri="opentrons-test/load-name/1", - location=LabwareOffsetLocation(slotName=DeckSlotName.SLOT_3), + location=LegacyLabwareOffsetLocation(slotName=DeckSlotName.SLOT_3), + locationSequence=[ + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="3" + ) + ], vector=LabwareOffsetVector(x=1, y=2, z=3), ) ) @@ -312,11 +331,21 @@ async def test_load_labware_uses_provided_id( version=1, ) ).then_return(minimal_labware_def) - + decoy.when( + state_store.geometry.get_projected_offset_location( + DeckSlotLocation(slotName=DeckSlotName.SLOT_3) + ) + ).then_return( + [OnAddressableAreaOffsetLocationSequenceComponent(addressableAreaName="3")] + ) decoy.when( state_store.labware.find_applicable_labware_offset( definition_uri="opentrons-test/load-name/1", - location=LabwareOffsetLocation(slotName=DeckSlotName.SLOT_3), + location=[ + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="3" + ) + ], ) ).then_return(None) @@ -354,10 +383,22 @@ async def test_load_labware_uses_loaded_labware_def( minimal_labware_def ) + decoy.when( + state_store.geometry.get_projected_offset_location( + DeckSlotLocation(slotName=DeckSlotName.SLOT_3) + ) + ).then_return( + [OnAddressableAreaOffsetLocationSequenceComponent(addressableAreaName="3")] + ) + decoy.when( state_store.labware.find_applicable_labware_offset( definition_uri="opentrons-test/load-name/1", - location=LabwareOffsetLocation(slotName=DeckSlotName.SLOT_3), + location=[ + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="3" + ) + ], ) ).then_return(None) @@ -406,23 +447,48 @@ async def test_load_labware_on_module( DeckSlotLocation(slotName=DeckSlotName.SLOT_3) ) + decoy.when( + state_store.geometry.get_projected_offset_location( + ModuleLocation(moduleId="module-id") + ) + ).then_return( + [ + OnModuleOffsetLocationSequenceComponent( + moduleModel=ModuleModel.THERMOCYCLER_MODULE_V1 + ), + OnAddressableAreaOffsetLocationSequenceComponent(addressableAreaName="1"), + ] + ) + decoy.when( state_store.labware.find_applicable_labware_offset( definition_uri="opentrons-test/load-name/1", - location=LabwareOffsetLocation( - slotName=DeckSlotName.SLOT_3, - moduleModel=ModuleModel.THERMOCYCLER_MODULE_V1, - ), + location=[ + OnModuleOffsetLocationSequenceComponent( + moduleModel=ModuleModel.THERMOCYCLER_MODULE_V1 + ), + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="1" + ), + ], ) ).then_return( LabwareOffset( id="labware-offset-id", createdAt=datetime(year=2021, month=1, day=2), definitionUri="opentrons-test/load-name/1", - location=LabwareOffsetLocation( + location=LegacyLabwareOffsetLocation( slotName=DeckSlotName.SLOT_3, moduleModel=ModuleModel.THERMOCYCLER_MODULE_V1, ), + locationSequence=[ + OnModuleOffsetLocationSequenceComponent( + moduleModel=ModuleModel.THERMOCYCLER_MODULE_V1 + ), + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="1" + ), + ], vector=LabwareOffsetVector(x=1, y=2, z=3), ) ) @@ -448,23 +514,38 @@ def test_find_offset_id_of_labware_on_deck_slot( subject: EquipmentHandler, ) -> None: """It should find the offset by resolving the provided location.""" + decoy.when( + state_store.geometry.get_projected_offset_location( + DeckSlotLocation(slotName=DeckSlotName.SLOT_3) + ) + ).then_return( + [ + OnAddressableAreaOffsetLocationSequenceComponent(addressableAreaName="3"), + ] + ) decoy.when( state_store.labware.find_applicable_labware_offset( definition_uri="opentrons-test/load-name/1", - location=LabwareOffsetLocation( - slotName=DeckSlotName.SLOT_3, - moduleModel=None, - ), + location=[ + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="3" + ) + ], ) ).then_return( LabwareOffset( id="labware-offset-id", createdAt=datetime(year=2021, month=1, day=2), definitionUri="opentrons-test/load-name/1", - location=LabwareOffsetLocation( + location=LegacyLabwareOffsetLocation( slotName=DeckSlotName.SLOT_3, moduleModel=None, ), + locationSequence=[ + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="3" + ) + ], vector=LabwareOffsetVector(x=1, y=2, z=3), ) ) @@ -490,23 +571,48 @@ def test_find_offset_id_of_labware_on_module( DeckSlotLocation(slotName=DeckSlotName.SLOT_3) ) + decoy.when( + state_store.geometry.get_projected_offset_location( + ModuleLocation(moduleId="input-module-id") + ) + ).then_return( + [ + OnModuleOffsetLocationSequenceComponent( + moduleModel=ModuleModel.THERMOCYCLER_MODULE_V1 + ), + OnAddressableAreaOffsetLocationSequenceComponent(addressableAreaName="3"), + ] + ) + decoy.when( state_store.labware.find_applicable_labware_offset( definition_uri="opentrons-test/load-name/1", - location=LabwareOffsetLocation( - slotName=DeckSlotName.SLOT_3, - moduleModel=ModuleModel.THERMOCYCLER_MODULE_V1, - ), + location=[ + OnModuleOffsetLocationSequenceComponent( + moduleModel=ModuleModel.THERMOCYCLER_MODULE_V1 + ), + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="3" + ), + ], ) ).then_return( LabwareOffset( id="labware-offset-id", createdAt=datetime(year=2021, month=1, day=2), definitionUri="opentrons-test/load-name/1", - location=LabwareOffsetLocation( + location=LegacyLabwareOffsetLocation( slotName=DeckSlotName.SLOT_3, moduleModel=ModuleModel.THERMOCYCLER_MODULE_V1, ), + locationSequence=[ + OnModuleOffsetLocationSequenceComponent( + moduleModel=ModuleModel.THERMOCYCLER_MODULE_V1 + ), + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="3" + ), + ], vector=LabwareOffsetVector(x=1, y=2, z=3), ) ) @@ -541,25 +647,49 @@ def test_find_offset_id_of_labware_on_labware( decoy.when(state_store.labware.get_parent_location("labware-id")).then_return( parent_location ) - + decoy.when( + state_store.geometry.get_projected_offset_location( + OnLabwareLocation(labwareId="labware-id") + ) + ).then_return( + [ + OnLabwareOffsetLocationSequenceComponent( + labwareUri="opentrons-test/load-name-2/1" + ), + OnAddressableAreaOffsetLocationSequenceComponent(addressableAreaName="1"), + ] + if parent_location is not OFF_DECK_LOCATION + else None + ) decoy.when( state_store.labware.find_applicable_labware_offset( definition_uri="opentrons-test/load-name-1/1", - location=LabwareOffsetLocation( - slotName=DeckSlotName.SLOT_1, - moduleModel=None, - definitionUri="opentrons-test/load-name-2/1", - ), + location=[ + OnLabwareOffsetLocationSequenceComponent( + labwareUri="opentrons-test/load-name-2/1" + ), + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="1" + ), + ], ) ).then_return( LabwareOffset( id="labware-offset-id", createdAt=datetime(year=2021, month=1, day=2), definitionUri="opentrons-test/load-name/1", - location=LabwareOffsetLocation( + location=LegacyLabwareOffsetLocation( slotName=DeckSlotName.SLOT_1, definitionUri="opentrons-test/load-name-2/1", ), + locationSequence=[ + OnLabwareOffsetLocationSequenceComponent( + labwareUri="opentrons-test/load-name-2/1" + ), + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="1" + ), + ], vector=LabwareOffsetVector(x=1, y=2, z=3), ) ) @@ -594,25 +724,161 @@ def test_find_offset_id_of_labware_on_labware_on_modules( DeckSlotLocation(slotName=DeckSlotName.SLOT_1) ) + decoy.when( + state_store.geometry.get_projected_offset_location( + OnLabwareLocation(labwareId="labware-id") + ) + ).then_return( + [ + OnLabwareOffsetLocationSequenceComponent( + labwareUri="opentrons-test/load-name-2/1" + ), + OnModuleOffsetLocationSequenceComponent( + moduleModel=ModuleModel.HEATER_SHAKER_MODULE_V1 + ), + OnAddressableAreaOffsetLocationSequenceComponent(addressableAreaName="1"), + ] + ) + decoy.when( state_store.labware.find_applicable_labware_offset( definition_uri="opentrons-test/load-name-1/1", - location=LabwareOffsetLocation( + location=[ + OnLabwareOffsetLocationSequenceComponent( + labwareUri="opentrons-test/load-name-2/1" + ), + OnModuleOffsetLocationSequenceComponent( + moduleModel=ModuleModel.HEATER_SHAKER_MODULE_V1 + ), + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="1" + ), + ], + ) + ).then_return( + LabwareOffset( + id="labware-offset-id", + createdAt=datetime(year=2021, month=1, day=2), + definitionUri="opentrons-test/load-name/1", + location=LegacyLabwareOffsetLocation( slotName=DeckSlotName.SLOT_1, moduleModel=ModuleModel.HEATER_SHAKER_MODULE_V1, definitionUri="opentrons-test/load-name-2/1", ), + locationSequence=[ + OnLabwareOffsetLocationSequenceComponent( + labwareUri="opentrons-test/load-name-2/1" + ), + OnModuleOffsetLocationSequenceComponent( + moduleModel=ModuleModel.HEATER_SHAKER_MODULE_V1 + ), + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="1" + ), + ], + vector=LabwareOffsetVector(x=1, y=2, z=3), + ) + ) + + result = subject.find_applicable_labware_offset_id( + labware_definition_uri="opentrons-test/load-name-1/1", + labware_location=OnLabwareLocation(labwareId="labware-id"), + ) + + assert result == "labware-offset-id" + + +def test_find_offset_id_of_labware_on_labware_on_labware_modules( + decoy: Decoy, + state_store: StateStore, + subject: EquipmentHandler, +) -> None: + """It should find an offset for a labware on a labware on a module.""" + decoy.when(state_store.labware.get_definition_uri("labware-id")).then_return( + LabwareUri("opentrons-test/load-name-2/1") + ) + + decoy.when(state_store.labware.get_parent_location("labware-id")).then_return( + ModuleLocation(moduleId="labware-id-2"), + ) + + decoy.when(state_store.labware.get_definition_uri("labware-id-2")).then_return( + LabwareUri("opentrons-test/load-name-3/1") + ) + + decoy.when(state_store.labware.get_parent_location("labware-id-2")).then_return( + ModuleLocation(moduleId="module-id"), + ) + + decoy.when(state_store.modules.get_requested_model("module-id")).then_return( + ModuleModel.HEATER_SHAKER_MODULE_V1 + ) + + decoy.when(state_store.modules.get_location("module-id")).then_return( + DeckSlotLocation(slotName=DeckSlotName.SLOT_1) + ) + + decoy.when( + state_store.geometry.get_projected_offset_location( + OnLabwareLocation(labwareId="labware-id") + ) + ).then_return( + [ + OnLabwareOffsetLocationSequenceComponent( + labwareUri="opentrons-test/load-name-2/1" + ), + OnLabwareOffsetLocationSequenceComponent( + labwareUri="opentrons-test/load-name-3/1" + ), + OnModuleOffsetLocationSequenceComponent( + moduleModel=ModuleModel.HEATER_SHAKER_MODULE_V1 + ), + OnAddressableAreaOffsetLocationSequenceComponent(addressableAreaName="1"), + ] + ) + + decoy.when( + state_store.labware.find_applicable_labware_offset( + definition_uri="opentrons-test/load-name-1/1", + location=[ + OnLabwareOffsetLocationSequenceComponent( + labwareUri="opentrons-test/load-name-2/1" + ), + OnLabwareOffsetLocationSequenceComponent( + labwareUri="opentrons-test/load-name-3/1" + ), + OnModuleOffsetLocationSequenceComponent( + moduleModel=ModuleModel.HEATER_SHAKER_MODULE_V1 + ), + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="1" + ), + ], ) ).then_return( LabwareOffset( id="labware-offset-id", createdAt=datetime(year=2021, month=1, day=2), definitionUri="opentrons-test/load-name/1", - location=LabwareOffsetLocation( + location=LegacyLabwareOffsetLocation( slotName=DeckSlotName.SLOT_1, moduleModel=ModuleModel.HEATER_SHAKER_MODULE_V1, definitionUri="opentrons-test/load-name-2/1", ), + locationSequence=[ + OnLabwareOffsetLocationSequenceComponent( + labwareUri="opentrons-test/load-name-2/1" + ), + OnLabwareOffsetLocationSequenceComponent( + labwareUri="opentrons-test/load-name-3/1" + ), + OnModuleOffsetLocationSequenceComponent( + moduleModel=ModuleModel.HEATER_SHAKER_MODULE_V1 + ), + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="1" + ), + ], vector=LabwareOffsetVector(x=1, y=2, z=3), ) ) diff --git a/api/tests/opentrons/protocol_engine/execution/test_labware_movement_handler.py b/api/tests/opentrons/protocol_engine/execution/test_labware_movement_handler.py index 3377e39b666..ea400011b22 100644 --- a/api/tests/opentrons/protocol_engine/execution/test_labware_movement_handler.py +++ b/api/tests/opentrons/protocol_engine/execution/test_labware_movement_handler.py @@ -18,7 +18,7 @@ ModuleLocation, OnLabwareLocation, LabwareOffset, - LabwareOffsetLocation, + LegacyLabwareOffsetLocation, LabwareOffsetVector, LabwareLocation, NonStackedLocation, @@ -142,7 +142,7 @@ async def set_up_decoy_hardware_gripper( id="new-offset-id", createdAt=datetime(year=2022, month=10, day=20), definitionUri="my-labware", - location=LabwareOffsetLocation( + location=LegacyLabwareOffsetLocation( slotName=DeckSlotName.SLOT_5 ), # this location doesn't matter for this test vector=LabwareOffsetVector(x=0.5, y=0.6, z=0.7), diff --git a/api/tests/opentrons/protocol_engine/resources/test_deck_configuration_provider.py b/api/tests/opentrons/protocol_engine/resources/test_deck_configuration_provider.py index ba9c93e03cf..294266f21a8 100644 --- a/api/tests/opentrons/protocol_engine/resources/test_deck_configuration_provider.py +++ b/api/tests/opentrons/protocol_engine/resources/test_deck_configuration_provider.py @@ -1,4 +1,5 @@ """Test deck configuration provider.""" + from typing import List, Set import pytest @@ -246,7 +247,7 @@ def test_get_potential_cutout_fixtures_raises( AddressableArea( area_name="1", area_type=AreaType.SLOT, - base_slot=DeckSlotName.SLOT_A1, + base_slot=DeckSlotName.SLOT_1, display_name="Slot 1", bounding_box=Dimensions(x=128.0, y=86.0, z=0), position=AddressableOffsetVector(x=1, y=2, z=3), @@ -263,7 +264,7 @@ def test_get_potential_cutout_fixtures_raises( AddressableArea( area_name="1", area_type=AreaType.SLOT, - base_slot=DeckSlotName.SLOT_A1, + base_slot=DeckSlotName.SLOT_1, display_name="Slot 1", bounding_box=Dimensions(x=128.0, y=86.0, z=0), position=AddressableOffsetVector(x=1, y=2, z=3), @@ -280,7 +281,7 @@ def test_get_potential_cutout_fixtures_raises( AddressableArea( area_name="D1", area_type=AreaType.SLOT, - base_slot=DeckSlotName.SLOT_A1, + base_slot=DeckSlotName.SLOT_D1, display_name="Slot D1", bounding_box=Dimensions(x=128.0, y=86.0, z=0), position=AddressableOffsetVector(x=1, y=2, z=3), @@ -293,7 +294,7 @@ def test_get_potential_cutout_fixtures_raises( AddressableArea( area_name="movableTrashB3", area_type=AreaType.MOVABLE_TRASH, - base_slot=DeckSlotName.SLOT_A1, + base_slot=DeckSlotName.SLOT_B3, display_name="Trash Bin in B3", bounding_box=Dimensions(x=225, y=78, z=40), position=AddressableOffsetVector(x=-5.25, y=6, z=3), @@ -306,7 +307,7 @@ def test_get_potential_cutout_fixtures_raises( AddressableArea( area_name="gripperWasteChute", area_type=AreaType.WASTE_CHUTE, - base_slot=DeckSlotName.SLOT_A1, + base_slot=DeckSlotName.SLOT_D3, display_name="Waste Chute", bounding_box=Dimensions(x=0, y=0, z=0), position=AddressableOffsetVector(x=65, y=31, z=139.5), @@ -323,7 +324,7 @@ def test_get_addressable_area_from_name( ) -> None: """It should get the deck position for the requested cutout id.""" addressable_area = subject.get_addressable_area_from_name( - addressable_area_name, DeckPoint(x=1, y=2, z=3), DeckSlotName.SLOT_A1, deck_def + addressable_area_name, DeckPoint(x=1, y=2, z=3), deck_def ) assert addressable_area == expected_addressable_area @@ -336,6 +337,5 @@ def test_get_addressable_area_from_name_raises( subject.get_addressable_area_from_name( "theFunArea", DeckPoint(x=1, y=2, z=3), - DeckSlotName.SLOT_A1, ot3_standard_deck_def, ) diff --git a/api/tests/opentrons/protocol_engine/state/test_addressable_area_view_old.py b/api/tests/opentrons/protocol_engine/state/test_addressable_area_view_old.py index 5aa157c59db..a85f51a1891 100644 --- a/api/tests/opentrons/protocol_engine/state/test_addressable_area_view_old.py +++ b/api/tests/opentrons/protocol_engine/state/test_addressable_area_view_old.py @@ -214,7 +214,6 @@ def test_get_addressable_area_for_simulation_not_loaded(decoy: Decoy) -> None: deck_configuration_provider.get_addressable_area_from_name( "abc", DeckPoint(x=1, y=2, z=3), - DeckSlotName.SLOT_A1, sentinel.deck_definition, ) ).then_return(addressable_area) diff --git a/api/tests/opentrons/protocol_engine/state/test_geometry_view.py b/api/tests/opentrons/protocol_engine/state/test_geometry_view.py index f5f86fc8c4c..3c214923e25 100644 --- a/api/tests/opentrons/protocol_engine/state/test_geometry_view.py +++ b/api/tests/opentrons/protocol_engine/state/test_geometry_view.py @@ -65,6 +65,9 @@ ProbedVolumeInfo, LoadedVolumeInfo, WellLiquidInfo, + OnAddressableAreaOffsetLocationSequenceComponent, + OnModuleOffsetLocationSequenceComponent, + OnLabwareOffsetLocationSequenceComponent, ) from opentrons.protocol_engine.commands import ( CommandStatus, @@ -3042,10 +3045,9 @@ def test_get_offset_location_deck_slot( ) labware_store.handle_action(action) offset_location = subject.get_offset_location("labware-id-1") - assert offset_location is not None - assert offset_location.slotName == DeckSlotName.SLOT_C2 - assert offset_location.definitionUri is None - assert offset_location.moduleModel is None + assert offset_location == [ + OnAddressableAreaOffsetLocationSequenceComponent(addressableAreaName="C2") + ] @pytest.mark.parametrize("use_mocks", [False]) @@ -3062,7 +3064,7 @@ def test_get_offset_location_module( command=LoadModule( params=LoadModuleParams( location=DeckSlotLocation(slotName=DeckSlotName.SLOT_A3), - model=ModuleModel.TEMPERATURE_MODULE_V1, + model=ModuleModel.TEMPERATURE_MODULE_V2, ), id="load-module-1", createdAt=datetime.now(), @@ -3107,10 +3109,14 @@ def test_get_offset_location_module( module_store.handle_action(load_module) labware_store.handle_action(load_labware) offset_location = subject.get_offset_location("labware-id-1") - assert offset_location is not None - assert offset_location.slotName == DeckSlotName.SLOT_A3 - assert offset_location.definitionUri is None - assert offset_location.moduleModel == ModuleModel.TEMPERATURE_MODULE_V1 + assert offset_location == [ + OnModuleOffsetLocationSequenceComponent( + moduleModel=ModuleModel.TEMPERATURE_MODULE_V2 + ), + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="temperatureModuleV2A3" + ), + ] @pytest.mark.parametrize("use_mocks", [False]) @@ -3128,8 +3134,8 @@ def test_get_offset_location_module_with_adapter( load_module = SucceedCommandAction( command=LoadModule( params=LoadModuleParams( - location=DeckSlotLocation(slotName=DeckSlotName.SLOT_A2), - model=ModuleModel.TEMPERATURE_MODULE_V1, + location=DeckSlotLocation(slotName=DeckSlotName.SLOT_A3), + model=ModuleModel.TEMPERATURE_MODULE_V2, ), id="load-module-1", createdAt=datetime.now(), @@ -3202,12 +3208,17 @@ def test_get_offset_location_module_with_adapter( labware_store.handle_action(load_adapter) labware_store.handle_action(load_labware) offset_location = subject.get_offset_location("labware-id-1") - assert offset_location is not None - assert offset_location.slotName == DeckSlotName.SLOT_A2 - assert offset_location.definitionUri == labware_view.get_uri_from_definition( - nice_adapter_definition - ) - assert offset_location.moduleModel == ModuleModel.TEMPERATURE_MODULE_V1 + assert offset_location == [ + OnLabwareOffsetLocationSequenceComponent( + labwareUri=labware_view.get_uri_from_definition(nice_adapter_definition) + ), + OnModuleOffsetLocationSequenceComponent( + moduleModel=ModuleModel.TEMPERATURE_MODULE_V2 + ), + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="temperatureModuleV2A3" + ), + ] @pytest.mark.parametrize("use_mocks", [False]) diff --git a/api/tests/opentrons/protocol_engine/state/test_labware_store_old.py b/api/tests/opentrons/protocol_engine/state/test_labware_store_old.py index d5e7e41770e..75e3aeb7339 100644 --- a/api/tests/opentrons/protocol_engine/state/test_labware_store_old.py +++ b/api/tests/opentrons/protocol_engine/state/test_labware_store_old.py @@ -4,6 +4,7 @@ longer helpful. Try to add new tests to test_labware_state.py, where they can be tested together, treating LabwareState as a private implementation detail. """ + from typing import Optional from opentrons.protocol_engine.state import update_types import pytest @@ -17,9 +18,10 @@ from opentrons.protocol_engine.types import ( LabwareOffset, - LabwareOffsetCreate, + LabwareOffsetCreateInternal, LabwareOffsetVector, - LabwareOffsetLocation, + LegacyLabwareOffsetLocation, + OnAddressableAreaOffsetLocationSequenceComponent, DeckSlotLocation, LoadedLabware, OFF_DECK_LOCATION, @@ -64,9 +66,12 @@ def test_handles_add_labware_offset( subject: LabwareStore, ) -> None: """It should add the labware offset to the state and add the ID.""" - request = LabwareOffsetCreate( + request = LabwareOffsetCreateInternal( definitionUri="offset-definition-uri", - location=LabwareOffsetLocation(slotName=DeckSlotName.SLOT_1), + legacyLocation=LegacyLabwareOffsetLocation(slotName=DeckSlotName.SLOT_1), + locationSequence=[ + OnAddressableAreaOffsetLocationSequenceComponent(addressableAreaName="1") + ], vector=LabwareOffsetVector(x=1, y=2, z=3), ) @@ -74,7 +79,10 @@ def test_handles_add_labware_offset( id="offset-id", createdAt=datetime(year=2021, month=1, day=2), definitionUri="offset-definition-uri", - location=LabwareOffsetLocation(slotName=DeckSlotName.SLOT_1), + location=LegacyLabwareOffsetLocation(slotName=DeckSlotName.SLOT_1), + locationSequence=[ + OnAddressableAreaOffsetLocationSequenceComponent(addressableAreaName="1") + ], vector=LabwareOffsetVector(x=1, y=2, z=3), ) @@ -99,9 +107,12 @@ def test_handles_load_labware( offset_id: Optional[str], ) -> None: """It should add the labware data to the state.""" - offset_request = LabwareOffsetCreate( + offset_request = LabwareOffsetCreateInternal( definitionUri="offset-definition-uri", - location=LabwareOffsetLocation(slotName=DeckSlotName.SLOT_1), + legacyLocation=LegacyLabwareOffsetLocation(slotName=DeckSlotName.SLOT_1), + locationSequence=[ + OnAddressableAreaOffsetLocationSequenceComponent(addressableAreaName="1") + ], vector=LabwareOffsetVector(x=1, y=2, z=3), ) @@ -180,9 +191,12 @@ def test_handles_reload_labware( == expected_definition_uri ) - offset_request = LabwareOffsetCreate( + offset_request = LabwareOffsetCreateInternal( definitionUri="offset-definition-uri", - location=LabwareOffsetLocation(slotName=DeckSlotName.SLOT_1), + legacyLocation=LegacyLabwareOffsetLocation(slotName=DeckSlotName.SLOT_1), + locationSequence=[ + OnAddressableAreaOffsetLocationSequenceComponent(addressableAreaName="1") + ], vector=LabwareOffsetVector(x=1, y=2, z=3), ) subject.handle_action( @@ -242,9 +256,12 @@ def test_handles_move_labware( ) -> None: """It should update labware state with new location & offset.""" comment_command = create_comment_command() - offset_request = LabwareOffsetCreate( + offset_request = LabwareOffsetCreateInternal( definitionUri="offset-definition-uri", - location=LabwareOffsetLocation(slotName=DeckSlotName.SLOT_1), + legacyLocation=LegacyLabwareOffsetLocation(slotName=DeckSlotName.SLOT_1), + locationSequence=[ + OnAddressableAreaOffsetLocationSequenceComponent(addressableAreaName="1") + ], vector=LabwareOffsetVector(x=1, y=2, z=3), ) subject.handle_action( @@ -297,9 +314,12 @@ def test_handles_move_labware_off_deck( ) -> None: """It should update labware state with new location & offset.""" comment_command = create_comment_command() - offset_request = LabwareOffsetCreate( + offset_request = LabwareOffsetCreateInternal( definitionUri="offset-definition-uri", - location=LabwareOffsetLocation(slotName=DeckSlotName.SLOT_1), + legacyLocation=LegacyLabwareOffsetLocation(slotName=DeckSlotName.SLOT_1), + locationSequence=[ + OnAddressableAreaOffsetLocationSequenceComponent(addressableAreaName="1") + ], vector=LabwareOffsetVector(x=1, y=2, z=3), ) subject.handle_action( diff --git a/api/tests/opentrons/protocol_engine/state/test_labware_view_old.py b/api/tests/opentrons/protocol_engine/state/test_labware_view_old.py index 770f24f3e7f..699893b47b4 100644 --- a/api/tests/opentrons/protocol_engine/state/test_labware_view_old.py +++ b/api/tests/opentrons/protocol_engine/state/test_labware_view_old.py @@ -4,6 +4,7 @@ longer helpful. Try to add new tests to test_labware_state.py, where they can be tested together, treating LabwareState as a private implementation detail. """ + import pytest from datetime import datetime from typing import Dict, Optional, cast, ContextManager, Any, Union, NamedTuple, List @@ -34,7 +35,7 @@ Dimensions, LabwareOffset, LabwareOffsetVector, - LabwareOffsetLocation, + LegacyLabwareOffsetLocation, LoadedLabware, ModuleModel, ModuleLocation, @@ -44,6 +45,8 @@ OFF_DECK_LOCATION, OverlapOffset, LabwareMovementOffsetData, + OnAddressableAreaOffsetLocationSequenceComponent, + OnModuleOffsetLocationSequenceComponent, ) from opentrons.protocol_engine.state._move_types import EdgePathType from opentrons.protocol_engine.state.labware import ( @@ -838,7 +841,10 @@ def test_get_labware_offset_vector() -> None: id="offset-id", createdAt=datetime(year=2021, month=1, day=2), definitionUri="some-labware-uri", - location=LabwareOffsetLocation(slotName=DeckSlotName.SLOT_1), + location=LegacyLabwareOffsetLocation(slotName=DeckSlotName.SLOT_1), + locationSequence=[ + OnAddressableAreaOffsetLocationSequenceComponent(addressableAreaName="1") + ], vector=offset_vector, ) @@ -866,7 +872,10 @@ def test_get_labware_offset() -> None: id="id-a", createdAt=datetime(year=2021, month=1, day=1), definitionUri="uri-a", - location=LabwareOffsetLocation(slotName=DeckSlotName.SLOT_1), + location=LegacyLabwareOffsetLocation(slotName=DeckSlotName.SLOT_1), + locationSequence=[ + OnAddressableAreaOffsetLocationSequenceComponent(addressableAreaName="1") + ], vector=LabwareOffsetVector(x=1, y=1, z=1), ) @@ -874,7 +883,10 @@ def test_get_labware_offset() -> None: id="id-b", createdAt=datetime(year=2022, month=2, day=2), definitionUri="uri-b", - location=LabwareOffsetLocation(slotName=DeckSlotName.SLOT_2), + location=LegacyLabwareOffsetLocation(slotName=DeckSlotName.SLOT_2), + locationSequence=[ + OnAddressableAreaOffsetLocationSequenceComponent(addressableAreaName="2") + ], vector=LabwareOffsetVector(x=2, y=2, z=2), ) @@ -894,7 +906,10 @@ def test_get_labware_offsets() -> None: id="id-a", createdAt=datetime(year=2021, month=1, day=1), definitionUri="uri-a", - location=LabwareOffsetLocation(slotName=DeckSlotName.SLOT_1), + location=LegacyLabwareOffsetLocation(slotName=DeckSlotName.SLOT_1), + locationSequence=[ + OnAddressableAreaOffsetLocationSequenceComponent(addressableAreaName="1") + ], vector=LabwareOffsetVector(x=1, y=1, z=1), ) @@ -902,7 +917,10 @@ def test_get_labware_offsets() -> None: id="id-b", createdAt=datetime(year=2022, month=2, day=2), definitionUri="uri-b", - location=LabwareOffsetLocation(slotName=DeckSlotName.SLOT_2), + location=LegacyLabwareOffsetLocation(slotName=DeckSlotName.SLOT_2), + locationSequence=[ + OnAddressableAreaOffsetLocationSequenceComponent(addressableAreaName="2") + ], vector=LabwareOffsetVector(x=2, y=2, z=2), ) @@ -926,7 +944,10 @@ def test_find_applicable_labware_offset() -> None: id="id-1", createdAt=datetime(year=2021, month=1, day=1), definitionUri="definition-uri", - location=LabwareOffsetLocation(slotName=DeckSlotName.SLOT_1), + location=LegacyLabwareOffsetLocation(slotName=DeckSlotName.SLOT_1), + locationSequence=[ + OnAddressableAreaOffsetLocationSequenceComponent(addressableAreaName="1") + ], vector=LabwareOffsetVector(x=1, y=1, z=1), ) @@ -935,7 +956,10 @@ def test_find_applicable_labware_offset() -> None: id="id-2", createdAt=datetime(year=2022, month=2, day=2), definitionUri="definition-uri", - location=LabwareOffsetLocation(slotName=DeckSlotName.SLOT_1), + location=LegacyLabwareOffsetLocation(slotName=DeckSlotName.SLOT_1), + locationSequence=[ + OnAddressableAreaOffsetLocationSequenceComponent(addressableAreaName="1") + ], vector=LabwareOffsetVector(x=2, y=2, z=2), ) @@ -943,10 +967,16 @@ def test_find_applicable_labware_offset() -> None: id="id-3", createdAt=datetime(year=2023, month=3, day=3), definitionUri="on-module-definition-uri", - location=LabwareOffsetLocation( + location=LegacyLabwareOffsetLocation( slotName=DeckSlotName.SLOT_1, moduleModel=ModuleModel.TEMPERATURE_MODULE_V1, ), + locationSequence=[ + OnModuleOffsetLocationSequenceComponent( + moduleModel=ModuleModel.TEMPERATURE_MODULE_V1 + ), + OnAddressableAreaOffsetLocationSequenceComponent(addressableAreaName="1"), + ], vector=LabwareOffsetVector(x=3, y=3, z=3), ) @@ -959,7 +989,11 @@ def test_find_applicable_labware_offset() -> None: assert ( subject.find_applicable_labware_offset( definition_uri="definition-uri", - location=LabwareOffsetLocation(slotName=DeckSlotName.SLOT_1), + location=[ + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="1" + ) + ], ) == offset_2 ) @@ -967,10 +1001,14 @@ def test_find_applicable_labware_offset() -> None: assert ( subject.find_applicable_labware_offset( definition_uri="on-module-definition-uri", - location=LabwareOffsetLocation( - slotName=DeckSlotName.SLOT_1, - moduleModel=ModuleModel.TEMPERATURE_MODULE_V1, - ), + location=[ + OnModuleOffsetLocationSequenceComponent( + moduleModel=ModuleModel.TEMPERATURE_MODULE_V1 + ), + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="1" + ), + ], ) == offset_3 ) @@ -979,7 +1017,11 @@ def test_find_applicable_labware_offset() -> None: assert ( subject.find_applicable_labware_offset( definition_uri="different-definition-uri", - location=LabwareOffsetLocation(slotName=DeckSlotName.SLOT_1), + location=[ + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="1" + ) + ], ) is None ) @@ -988,7 +1030,11 @@ def test_find_applicable_labware_offset() -> None: assert ( subject.find_applicable_labware_offset( definition_uri="different-definition-uri", - location=LabwareOffsetLocation(slotName=DeckSlotName.SLOT_2), + location=[ + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="2" + ) + ], ) is None ) diff --git a/api/tests/opentrons/protocol_engine/test_labware_offset_standardization.py b/api/tests/opentrons/protocol_engine/test_labware_offset_standardization.py new file mode 100644 index 00000000000..f78885a8428 --- /dev/null +++ b/api/tests/opentrons/protocol_engine/test_labware_offset_standardization.py @@ -0,0 +1,725 @@ +"""Tests for `labware_offset_standardization`.""" + +from functools import lru_cache +import pytest + +from opentrons_shared_data.robot.types import RobotType +from opentrons_shared_data.deck import load +from opentrons_shared_data.deck.types import DeckDefinitionV5 +from opentrons.types import DeckSlotName +from opentrons.protocol_engine import labware_offset_standardization as subject +from opentrons.protocol_engine.types import ( + LabwareOffsetCreate, + LegacyLabwareOffsetCreate, + LegacyLabwareOffsetLocation, + OnLabwareOffsetLocationSequenceComponent, + OnModuleOffsetLocationSequenceComponent, + OnAddressableAreaOffsetLocationSequenceComponent, + ModuleModel, + LabwareOffsetVector, + LabwareOffsetLocationSequence, + LabwareOffsetCreateInternal, +) + + +@lru_cache +def load_from_robot_type(robot_type: RobotType) -> DeckDefinitionV5: + """Get a deck from robot type.""" + if robot_type == "OT-3 Standard": + return load("ot3_standard") + else: + return load("ot2_standard") + + +@pytest.mark.parametrize( + ("location", "robot_type", "expected_modern_location", "expected_legacy_location"), + [ + # Directly on a slot + pytest.param( + LegacyLabwareOffsetLocation(slotName=DeckSlotName.SLOT_5), + "OT-2 Standard", + [OnAddressableAreaOffsetLocationSequenceComponent(addressableAreaName="5")], + LegacyLabwareOffsetLocation(slotName=DeckSlotName.SLOT_5), + id="direct-slot-ot2-native", + ), + pytest.param( + LegacyLabwareOffsetLocation(slotName=DeckSlotName.SLOT_5), + "OT-3 Standard", + [ + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="C2" + ) + ], + LegacyLabwareOffsetLocation(slotName=DeckSlotName.SLOT_C2), + id="direct-slot-flex-ot2", + ), + pytest.param( + LegacyLabwareOffsetLocation(slotName=DeckSlotName.SLOT_C2), + "OT-2 Standard", + [OnAddressableAreaOffsetLocationSequenceComponent(addressableAreaName="5")], + LegacyLabwareOffsetLocation(slotName=DeckSlotName.SLOT_5), + id="direct-slot-ot2-flex", + ), + pytest.param( + LegacyLabwareOffsetLocation(slotName=DeckSlotName.SLOT_C2), + "OT-3 Standard", + [ + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="C2" + ) + ], + LegacyLabwareOffsetLocation(slotName=DeckSlotName.SLOT_C2), + id="direct-slot-flex-native", + ), + # On a module with no adapter + pytest.param( + LegacyLabwareOffsetLocation( + slotName=DeckSlotName.SLOT_D1, + moduleModel=ModuleModel.TEMPERATURE_MODULE_V2, + ), + "OT-3 Standard", + [ + OnModuleOffsetLocationSequenceComponent( + moduleModel=ModuleModel.TEMPERATURE_MODULE_V2 + ), + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="temperatureModuleV2D1", + ), + ], + LegacyLabwareOffsetLocation( + slotName=DeckSlotName.SLOT_D1, + moduleModel=ModuleModel.TEMPERATURE_MODULE_V2, + ), + id="module-flex-native", + ), + pytest.param( + LegacyLabwareOffsetLocation( + slotName=DeckSlotName.SLOT_1, + moduleModel=ModuleModel.TEMPERATURE_MODULE_V2, + ), + "OT-3 Standard", + [ + OnModuleOffsetLocationSequenceComponent( + moduleModel=ModuleModel.TEMPERATURE_MODULE_V2 + ), + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="temperatureModuleV2D1", + ), + ], + LegacyLabwareOffsetLocation( + slotName=DeckSlotName.SLOT_D1, + moduleModel=ModuleModel.TEMPERATURE_MODULE_V2, + ), + id="module-flex-ot2", + ), + pytest.param( + LegacyLabwareOffsetLocation( + slotName=DeckSlotName.SLOT_D1, + moduleModel=ModuleModel.TEMPERATURE_MODULE_V2, + ), + "OT-2 Standard", + [ + OnModuleOffsetLocationSequenceComponent( + moduleModel=ModuleModel.TEMPERATURE_MODULE_V2, + ), + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="1", + ), + ], + LegacyLabwareOffsetLocation( + slotName=DeckSlotName.SLOT_1, + moduleModel=ModuleModel.TEMPERATURE_MODULE_V2, + ), + id="module-ot2-flex", + ), + pytest.param( + LegacyLabwareOffsetLocation( + slotName=DeckSlotName.SLOT_1, + moduleModel=ModuleModel.TEMPERATURE_MODULE_V2, + ), + "OT-2 Standard", + [ + OnModuleOffsetLocationSequenceComponent( + moduleModel=ModuleModel.TEMPERATURE_MODULE_V2, + ), + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="1", + ), + ], + LegacyLabwareOffsetLocation( + slotName=DeckSlotName.SLOT_1, + moduleModel=ModuleModel.TEMPERATURE_MODULE_V2, + ), + id="module-ot2-native", + ), + # On a labware (or stack...) on a slot + pytest.param( + LegacyLabwareOffsetLocation( + slotName=DeckSlotName.SLOT_D1, definitionUri="opentrons-test/foo/1" + ), + "OT-3 Standard", + [ + OnLabwareOffsetLocationSequenceComponent( + labwareUri="opentrons-test/foo/1" + ), + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="D1" + ), + ], + LegacyLabwareOffsetLocation( + slotName=DeckSlotName.SLOT_D1, definitionUri="opentrons-test/foo/1" + ), + id="labware-slot-flex-native", + ), + pytest.param( + LegacyLabwareOffsetLocation( + slotName=DeckSlotName.SLOT_D1, definitionUri="opentrons-test/foo/1" + ), + "OT-2 Standard", + [ + OnLabwareOffsetLocationSequenceComponent( + labwareUri="opentrons-test/foo/1" + ), + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="1" + ), + ], + LegacyLabwareOffsetLocation( + slotName=DeckSlotName.SLOT_1, definitionUri="opentrons-test/foo/1" + ), + id="labware-slot-ot2-flex", + ), + pytest.param( + LegacyLabwareOffsetLocation( + slotName=DeckSlotName.SLOT_1, definitionUri="opentrons-test/foo/1" + ), + "OT-3 Standard", + [ + OnLabwareOffsetLocationSequenceComponent( + labwareUri="opentrons-test/foo/1" + ), + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="D1" + ), + ], + LegacyLabwareOffsetLocation( + slotName=DeckSlotName.SLOT_D1, definitionUri="opentrons-test/foo/1" + ), + id="labware-slot-flex-ot2", + ), + pytest.param( + LegacyLabwareOffsetLocation( + slotName=DeckSlotName.SLOT_1, definitionUri="opentrons-test/foo/1" + ), + "OT-2 Standard", + [ + OnLabwareOffsetLocationSequenceComponent( + labwareUri="opentrons-test/foo/1" + ), + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="1" + ), + ], + LegacyLabwareOffsetLocation( + slotName=DeckSlotName.SLOT_1, definitionUri="opentrons-test/foo/1" + ), + id="labware-slot-ot2-native", + ), + # On an adapter on a module + pytest.param( + LegacyLabwareOffsetLocation( + slotName=DeckSlotName.SLOT_D1, + definitionUri="opentrons-test/foo/1", + moduleModel=ModuleModel.TEMPERATURE_MODULE_V2, + ), + "OT-3 Standard", + [ + OnLabwareOffsetLocationSequenceComponent( + labwareUri="opentrons-test/foo/1" + ), + OnModuleOffsetLocationSequenceComponent( + moduleModel=ModuleModel.TEMPERATURE_MODULE_V2, + ), + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="temperatureModuleV2D1", + ), + ], + LegacyLabwareOffsetLocation( + slotName=DeckSlotName.SLOT_D1, + definitionUri="opentrons-test/foo/1", + moduleModel=ModuleModel.TEMPERATURE_MODULE_V2, + ), + id="labware-module-flex-native", + ), + pytest.param( + LegacyLabwareOffsetLocation( + slotName=DeckSlotName.SLOT_D1, + definitionUri="opentrons-test/foo/1", + moduleModel=ModuleModel.TEMPERATURE_MODULE_V2, + ), + "OT-2 Standard", + [ + OnLabwareOffsetLocationSequenceComponent( + labwareUri="opentrons-test/foo/1" + ), + OnModuleOffsetLocationSequenceComponent( + moduleModel=ModuleModel.TEMPERATURE_MODULE_V2, + ), + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="1", + ), + ], + LegacyLabwareOffsetLocation( + slotName=DeckSlotName.SLOT_1, + definitionUri="opentrons-test/foo/1", + moduleModel=ModuleModel.TEMPERATURE_MODULE_V2, + ), + id="labware-module-ot2-flex", + ), + pytest.param( + LegacyLabwareOffsetLocation( + slotName=DeckSlotName.SLOT_1, + definitionUri="opentrons-test/foo/1", + moduleModel=ModuleModel.TEMPERATURE_MODULE_V2, + ), + "OT-3 Standard", + [ + OnLabwareOffsetLocationSequenceComponent( + labwareUri="opentrons-test/foo/1" + ), + OnModuleOffsetLocationSequenceComponent( + moduleModel=ModuleModel.TEMPERATURE_MODULE_V2, + ), + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="temperatureModuleV2D1", + ), + ], + LegacyLabwareOffsetLocation( + slotName=DeckSlotName.SLOT_D1, + definitionUri="opentrons-test/foo/1", + moduleModel=ModuleModel.TEMPERATURE_MODULE_V2, + ), + id="labware-module-flex-ot2", + ), + pytest.param( + LegacyLabwareOffsetLocation( + slotName=DeckSlotName.SLOT_1, + definitionUri="opentrons-test/foo/1", + moduleModel=ModuleModel.TEMPERATURE_MODULE_V2, + ), + "OT-2 Standard", + [ + OnLabwareOffsetLocationSequenceComponent( + labwareUri="opentrons-test/foo/1" + ), + OnModuleOffsetLocationSequenceComponent( + moduleModel=ModuleModel.TEMPERATURE_MODULE_V2, + ), + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="1", + ), + ], + LegacyLabwareOffsetLocation( + slotName=DeckSlotName.SLOT_1, + definitionUri="opentrons-test/foo/1", + moduleModel=ModuleModel.TEMPERATURE_MODULE_V2, + ), + id="labware-module-ot2-native", + ), + ], +) +def test_standardize_legacy_labware_offset( + location: LegacyLabwareOffsetLocation, + robot_type: RobotType, + expected_modern_location: LabwareOffsetLocationSequence, + expected_legacy_location: LegacyLabwareOffsetLocation, +) -> None: + """It should convert deck slots in `LegacyLabwareOffsetCreate`s and go to the new format.""" + deck_def = load_from_robot_type(robot_type) + original = LegacyLabwareOffsetCreate( + definitionUri="opentrons-test/foo/1", + location=location, + vector=LabwareOffsetVector(x=1, y=2, z=3), + ) + expected = LabwareOffsetCreateInternal( + definitionUri="opentrons-test/foo/1", + legacyLocation=expected_legacy_location, + locationSequence=expected_modern_location, + vector=LabwareOffsetVector(x=1, y=2, z=3), + ) + assert ( + subject.standardize_labware_offset_create(original, robot_type, deck_def) + == expected + ) + + +@pytest.mark.parametrize( + ("location", "robot_type", "expected_modern_location", "expected_legacy_location"), + [ + # Directly on a slot + pytest.param( + [OnAddressableAreaOffsetLocationSequenceComponent(addressableAreaName="5")], + "OT-2 Standard", + [OnAddressableAreaOffsetLocationSequenceComponent(addressableAreaName="5")], + LegacyLabwareOffsetLocation(slotName=DeckSlotName.SLOT_5), + id="slot-direct-ot2", + ), + pytest.param( + [ + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="C2" + ) + ], + "OT-3 Standard", + [ + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="C2" + ) + ], + LegacyLabwareOffsetLocation(slotName=DeckSlotName.SLOT_C2), + id="slot-direct-flex", + ), + # On a module with no adapter + pytest.param( + [ + OnModuleOffsetLocationSequenceComponent( + moduleModel=ModuleModel.TEMPERATURE_MODULE_V2, + ), + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="temperatureModuleV2D1", + ), + ], + "OT-3 Standard", + [ + OnModuleOffsetLocationSequenceComponent( + moduleModel=ModuleModel.TEMPERATURE_MODULE_V2, + ), + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="temperatureModuleV2D1", + ), + ], + LegacyLabwareOffsetLocation( + slotName=DeckSlotName.SLOT_D1, + moduleModel=ModuleModel.TEMPERATURE_MODULE_V2, + ), + id="module-slot-flex", + ), + pytest.param( + [ + OnModuleOffsetLocationSequenceComponent( + moduleModel=ModuleModel.TEMPERATURE_MODULE_V2, + ), + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="1", + ), + ], + "OT-2 Standard", + [ + OnModuleOffsetLocationSequenceComponent( + moduleModel=ModuleModel.TEMPERATURE_MODULE_V2, + ), + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="1", + ), + ], + LegacyLabwareOffsetLocation( + slotName=DeckSlotName.SLOT_1, + moduleModel=ModuleModel.TEMPERATURE_MODULE_V2, + ), + id="module-slot-ot2", + ), + # On a labware on a slot + pytest.param( + [ + OnLabwareOffsetLocationSequenceComponent( + labwareUri="opentrons-test/foo/1" + ), + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="D1" + ), + ], + "OT-3 Standard", + [ + OnLabwareOffsetLocationSequenceComponent( + labwareUri="opentrons-test/foo/1" + ), + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="D1" + ), + ], + LegacyLabwareOffsetLocation( + slotName=DeckSlotName.SLOT_D1, definitionUri="opentrons-test/foo/1" + ), + id="labware-slot-flex", + ), + pytest.param( + [ + OnLabwareOffsetLocationSequenceComponent( + labwareUri="opentrons-test/foo/1" + ), + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="1" + ), + ], + "OT-2 Standard", + [ + OnLabwareOffsetLocationSequenceComponent( + labwareUri="opentrons-test/foo/1" + ), + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="1" + ), + ], + LegacyLabwareOffsetLocation( + slotName=DeckSlotName.SLOT_1, definitionUri="opentrons-test/foo/1" + ), + id="labware-slot-ot2", + ), + # On an adapter on a module + pytest.param( + [ + OnLabwareOffsetLocationSequenceComponent( + labwareUri="opentrons-test/foo/1" + ), + OnModuleOffsetLocationSequenceComponent( + moduleModel=ModuleModel.TEMPERATURE_MODULE_V2, + ), + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="temperatureModuleV2D1", + ), + ], + "OT-3 Standard", + [ + OnLabwareOffsetLocationSequenceComponent( + labwareUri="opentrons-test/foo/1" + ), + OnModuleOffsetLocationSequenceComponent( + moduleModel=ModuleModel.TEMPERATURE_MODULE_V2, + ), + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="temperatureModuleV2D1", + ), + ], + LegacyLabwareOffsetLocation( + slotName=DeckSlotName.SLOT_D1, + definitionUri="opentrons-test/foo/1", + moduleModel=ModuleModel.TEMPERATURE_MODULE_V2, + ), + id="labware-module-flex", + ), + pytest.param( + [ + OnLabwareOffsetLocationSequenceComponent( + labwareUri="opentrons-test/foo/1" + ), + OnModuleOffsetLocationSequenceComponent( + moduleModel=ModuleModel.TEMPERATURE_MODULE_V2, + ), + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="1", + ), + ], + "OT-2 Standard", + [ + OnLabwareOffsetLocationSequenceComponent( + labwareUri="opentrons-test/foo/1" + ), + OnModuleOffsetLocationSequenceComponent( + moduleModel=ModuleModel.TEMPERATURE_MODULE_V2, + ), + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="1", + ), + ], + LegacyLabwareOffsetLocation( + slotName=DeckSlotName.SLOT_1, + definitionUri="opentrons-test/foo/1", + moduleModel=ModuleModel.TEMPERATURE_MODULE_V2, + ), + id="labware-slot-ot2", + ), + # On a stack of labware + pytest.param( + [ + OnLabwareOffsetLocationSequenceComponent( + labwareUri="opentrons-test/foo/1" + ), + OnLabwareOffsetLocationSequenceComponent( + labwareUri="opentrons-test/bar/1" + ), + OnLabwareOffsetLocationSequenceComponent( + labwareUri="opentrons-test/baz/1" + ), + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="A3", + ), + ], + "OT-3 Standard", + [ + OnLabwareOffsetLocationSequenceComponent( + labwareUri="opentrons-test/foo/1" + ), + OnLabwareOffsetLocationSequenceComponent( + labwareUri="opentrons-test/bar/1" + ), + OnLabwareOffsetLocationSequenceComponent( + labwareUri="opentrons-test/baz/1" + ), + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="A3", + ), + ], + LegacyLabwareOffsetLocation( + slotName=DeckSlotName.SLOT_A3, + definitionUri="opentrons-test/foo/1", + ), + id="labware-stack-flex", + ), + pytest.param( + [ + OnLabwareOffsetLocationSequenceComponent( + labwareUri="opentrons-test/foo/1" + ), + OnLabwareOffsetLocationSequenceComponent( + labwareUri="opentrons-test/bar/1" + ), + OnLabwareOffsetLocationSequenceComponent( + labwareUri="opentrons-test/baz/1" + ), + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="2", + ), + ], + "OT-2 Standard", + [ + OnLabwareOffsetLocationSequenceComponent( + labwareUri="opentrons-test/foo/1" + ), + OnLabwareOffsetLocationSequenceComponent( + labwareUri="opentrons-test/bar/1" + ), + OnLabwareOffsetLocationSequenceComponent( + labwareUri="opentrons-test/baz/1" + ), + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="2", + ), + ], + LegacyLabwareOffsetLocation( + slotName=DeckSlotName.SLOT_2, + definitionUri="opentrons-test/foo/1", + ), + id="labware-stack-ot2", + ), + # On a stack of labware on a module + pytest.param( + [ + OnLabwareOffsetLocationSequenceComponent( + labwareUri="opentrons-test/foo/1" + ), + OnLabwareOffsetLocationSequenceComponent( + labwareUri="opentrons-test/bar/1" + ), + OnLabwareOffsetLocationSequenceComponent( + labwareUri="opentrons-test/baz/1" + ), + OnModuleOffsetLocationSequenceComponent( + moduleModel=ModuleModel.TEMPERATURE_MODULE_V2, + ), + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="3", + ), + ], + "OT-2 Standard", + [ + OnLabwareOffsetLocationSequenceComponent( + labwareUri="opentrons-test/foo/1" + ), + OnLabwareOffsetLocationSequenceComponent( + labwareUri="opentrons-test/bar/1" + ), + OnLabwareOffsetLocationSequenceComponent( + labwareUri="opentrons-test/baz/1" + ), + OnModuleOffsetLocationSequenceComponent( + moduleModel=ModuleModel.TEMPERATURE_MODULE_V2, + ), + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="3", + ), + ], + LegacyLabwareOffsetLocation( + slotName=DeckSlotName.SLOT_3, + definitionUri="opentrons-test/foo/1", + moduleModel=ModuleModel.TEMPERATURE_MODULE_V2, + ), + id="labware-stack-module-ot2", + ), + pytest.param( + [ + OnLabwareOffsetLocationSequenceComponent( + labwareUri="opentrons-test/foo/1" + ), + OnLabwareOffsetLocationSequenceComponent( + labwareUri="opentrons-test/bar/1" + ), + OnLabwareOffsetLocationSequenceComponent( + labwareUri="opentrons-test/baz/1" + ), + OnModuleOffsetLocationSequenceComponent( + moduleModel=ModuleModel.TEMPERATURE_MODULE_V2, + ), + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="A1", + ), + ], + "OT-3 Standard", + [ + OnLabwareOffsetLocationSequenceComponent( + labwareUri="opentrons-test/foo/1" + ), + OnLabwareOffsetLocationSequenceComponent( + labwareUri="opentrons-test/bar/1" + ), + OnLabwareOffsetLocationSequenceComponent( + labwareUri="opentrons-test/baz/1" + ), + OnModuleOffsetLocationSequenceComponent( + moduleModel=ModuleModel.TEMPERATURE_MODULE_V2, + ), + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="A1", + ), + ], + LegacyLabwareOffsetLocation( + slotName=DeckSlotName.SLOT_A1, + definitionUri="opentrons-test/foo/1", + moduleModel=ModuleModel.TEMPERATURE_MODULE_V2, + ), + id="labware-stack-module-flex", + ), + ], +) +def test_standardize_modern_labware_offset( + location: LabwareOffsetLocationSequence, + robot_type: RobotType, + expected_modern_location: LabwareOffsetLocationSequence, + expected_legacy_location: LegacyLabwareOffsetLocation, +) -> None: + """It should convert deck slots in `LabwareOffsetCreate`s and fill in the old format.""" + deck_def = load_from_robot_type(robot_type) + original = LabwareOffsetCreate( + definitionUri="opentrons-test/foo/1", + locationSequence=location, + vector=LabwareOffsetVector(x=1, y=2, z=3), + ) + expected = LabwareOffsetCreateInternal( + definitionUri="opentrons-test/foo/1", + legacyLocation=expected_legacy_location, + locationSequence=expected_modern_location, + vector=LabwareOffsetVector(x=1, y=2, z=3), + ) + assert ( + subject.standardize_labware_offset_create(original, robot_type, deck_def) + == expected + ) diff --git a/api/tests/opentrons/protocol_engine/test_protocol_engine.py b/api/tests/opentrons/protocol_engine/test_protocol_engine.py index 6c1efcc55d7..ed933e760d0 100644 --- a/api/tests/opentrons/protocol_engine/test_protocol_engine.py +++ b/api/tests/opentrons/protocol_engine/test_protocol_engine.py @@ -2,7 +2,7 @@ import inspect from datetime import datetime -from typing import Any +from typing import Any, cast from unittest.mock import sentinel import pytest @@ -10,6 +10,7 @@ from opentrons_shared_data.robot.types import RobotType from opentrons_shared_data.labware.labware_definition import LabwareDefinition +from opentrons_shared_data.deck.types import DeckDefinitionV5 from opentrons.protocol_engine.actions.actions import SetErrorRecoveryPolicyAction from opentrons.protocol_engine.state.update_types import StateUpdate @@ -18,7 +19,12 @@ from opentrons.hardware_control.modules import MagDeck, TempDeck from opentrons.hardware_control.types import PauseType as HardwarePauseType -from opentrons.protocol_engine import ProtocolEngine, commands, slot_standardization +from opentrons.protocol_engine import ( + ProtocolEngine, + commands, + slot_standardization, + labware_offset_standardization, +) from opentrons.protocol_engine.errors.exceptions import ( CommandNotAllowedError, ) @@ -26,8 +32,11 @@ DeckType, LabwareOffset, LabwareOffsetCreate, + LegacyLabwareOffsetCreate, LabwareOffsetVector, - LabwareOffsetLocation, + LegacyLabwareOffsetLocation, + OnAddressableAreaOffsetLocationSequenceComponent, + LabwareOffsetCreateInternal, LabwareUri, ModuleDefinition, ModuleModel, @@ -138,6 +147,17 @@ def _mock_slot_standardization_module( monkeypatch.setattr(slot_standardization, name, decoy.mock(func=func)) +@pytest.fixture(autouse=True) +def _mock_labware_offset_standardization_module( + decoy: Decoy, monkeypatch: pytest.MonkeyPatch +) -> None: + """Mock out opentrons.labware_offset_standardization functions.""" + for name, func in inspect.getmembers( + labware_offset_standardization, inspect.isfunction + ): + monkeypatch.setattr(labware_offset_standardization, name, decoy.mock(func=func)) + + @pytest.fixture(autouse=True) def _mock_hash_command_params_module( decoy: Decoy, monkeypatch: pytest.MonkeyPatch @@ -1020,6 +1040,81 @@ def test_add_plugin( decoy.verify(plugin_starter.start(plugin)) +def test_add_legacy_labware_offset( + decoy: Decoy, + action_dispatcher: ActionDispatcher, + model_utils: ModelUtils, + state_store: StateStore, + subject: ProtocolEngine, +) -> None: + """It should have the labware offset request resolved and added to state.""" + request = LegacyLabwareOffsetCreate( + definitionUri="definition-uri", + location=LegacyLabwareOffsetLocation(slotName=DeckSlotName.SLOT_1), + vector=LabwareOffsetVector(x=1, y=2, z=3), + ) + + standardized_request = LabwareOffsetCreateInternal( + definitionUri="standardized-definition-uri", + locationSequence=[ + OnAddressableAreaOffsetLocationSequenceComponent(addressableAreaName="2") + ], + legacyLocation=LegacyLabwareOffsetLocation(slotName=DeckSlotName.SLOT_2), + vector=LabwareOffsetVector(x=2, y=3, z=4), + ) + + id = "labware-offset-id" + + created_at = datetime(year=2021, month=11, day=15) + + expected_result = LabwareOffset( + id=id, + createdAt=created_at, + definitionUri=standardized_request.definitionUri, + location=standardized_request.legacyLocation, + locationSequence=standardized_request.locationSequence, + vector=standardized_request.vector, + ) + + robot_type: RobotType = "OT-3 Standard" + decoy.when(state_store.config).then_return( + Config(robot_type=robot_type, deck_type=DeckType.OT3_STANDARD) + ) + decoy.when(state_store.addressable_areas.deck_definition).then_return( + cast(DeckDefinitionV5, {}) + ) + decoy.when( + labware_offset_standardization.standardize_labware_offset_create( + request, robot_type, cast(DeckDefinitionV5, {}) + ) + ).then_return(standardized_request) + decoy.when(model_utils.generate_id()).then_return(id) + decoy.when(model_utils.get_timestamp()).then_return(created_at) + decoy.when( + state_store.labware.get_labware_offset(labware_offset_id=id) + ).then_return(expected_result) + + result = subject.add_labware_offset( + request=LegacyLabwareOffsetCreate( + definitionUri="definition-uri", + location=LegacyLabwareOffsetLocation(slotName=DeckSlotName.SLOT_1), + vector=LabwareOffsetVector(x=1, y=2, z=3), + ) + ) + + assert result == expected_result + + decoy.verify( + action_dispatcher.dispatch( + AddLabwareOffsetAction( + labware_offset_id=id, + created_at=created_at, + request=standardized_request, + ) + ) + ) + + def test_add_labware_offset( decoy: Decoy, action_dispatcher: ActionDispatcher, @@ -1030,23 +1125,31 @@ def test_add_labware_offset( """It should have the labware offset request resolved and added to state.""" request = LabwareOffsetCreate( definitionUri="definition-uri", - location=LabwareOffsetLocation(slotName=DeckSlotName.SLOT_1), + locationSequence=[ + OnAddressableAreaOffsetLocationSequenceComponent(addressableAreaName="1") + ], vector=LabwareOffsetVector(x=1, y=2, z=3), ) - standardized_request = LabwareOffsetCreate( + + standardized_request = LabwareOffsetCreateInternal( definitionUri="standardized-definition-uri", - location=LabwareOffsetLocation(slotName=DeckSlotName.SLOT_2), - vector=LabwareOffsetVector(x=2, y=3, z=4), + locationSequence=[ + OnAddressableAreaOffsetLocationSequenceComponent(addressableAreaName="3") + ], + legacyLocation=LegacyLabwareOffsetLocation(slotName=DeckSlotName.SLOT_3), + vector=LabwareOffsetVector(x=2, y=5, z=6), ) id = "labware-offset-id" + created_at = datetime(year=2021, month=11, day=15) expected_result = LabwareOffset( id=id, createdAt=created_at, definitionUri=standardized_request.definitionUri, - location=standardized_request.location, + location=standardized_request.legacyLocation, + locationSequence=standardized_request.locationSequence, vector=standardized_request.vector, ) @@ -1054,8 +1157,13 @@ def test_add_labware_offset( decoy.when(state_store.config).then_return( Config(robot_type=robot_type, deck_type=DeckType.OT3_STANDARD) ) + decoy.when(state_store.addressable_areas.deck_definition).then_return( + cast(DeckDefinitionV5, {}) + ) decoy.when( - slot_standardization.standardize_labware_offset(request, robot_type) + labware_offset_standardization.standardize_labware_offset_create( + request, robot_type, cast(DeckDefinitionV5, {}) + ) ).then_return(standardized_request) decoy.when(model_utils.generate_id()).then_return(id) decoy.when(model_utils.get_timestamp()).then_return(created_at) @@ -1066,7 +1174,11 @@ def test_add_labware_offset( result = subject.add_labware_offset( request=LabwareOffsetCreate( definitionUri="definition-uri", - location=LabwareOffsetLocation(slotName=DeckSlotName.SLOT_1), + locationSequence=[ + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="1" + ) + ], vector=LabwareOffsetVector(x=1, y=2, z=3), ) ) diff --git a/api/tests/opentrons/protocol_engine/test_slot_standardization.py b/api/tests/opentrons/protocol_engine/test_slot_standardization.py index f97d09af242..78090e16b00 100644 --- a/api/tests/opentrons/protocol_engine/test_slot_standardization.py +++ b/api/tests/opentrons/protocol_engine/test_slot_standardization.py @@ -13,8 +13,6 @@ OnLabwareLocation, LabwareLocation, LabwareMovementStrategy, - LabwareOffsetCreate, - LabwareOffsetLocation, LabwareOffsetVector, ModuleLocation, ModuleModel, @@ -22,42 +20,6 @@ ) -@pytest.mark.parametrize("module_model", [None, ModuleModel.MAGNETIC_MODULE_V1]) -@pytest.mark.parametrize( - ("slot_name", "robot_type", "expected_slot_name"), - [ - (DeckSlotName.SLOT_5, "OT-2 Standard", DeckSlotName.SLOT_5), - (DeckSlotName.SLOT_C2, "OT-2 Standard", DeckSlotName.SLOT_5), - (DeckSlotName.SLOT_5, "OT-3 Standard", DeckSlotName.SLOT_C2), - (DeckSlotName.SLOT_C2, "OT-3 Standard", DeckSlotName.SLOT_C2), - ], -) -def test_standardize_labware_offset( - module_model: ModuleModel, - slot_name: DeckSlotName, - robot_type: RobotType, - expected_slot_name: DeckSlotName, -) -> None: - """It should convert deck slots in `LabwareOffsetCreate`s.""" - original = LabwareOffsetCreate( - definitionUri="opentrons-test/foo/1", - location=LabwareOffsetLocation( - moduleModel=module_model, - slotName=slot_name, - ), - vector=LabwareOffsetVector(x=1, y=2, z=3), - ) - expected = LabwareOffsetCreate( - definitionUri="opentrons-test/foo/1", - location=LabwareOffsetLocation( - moduleModel=module_model, - slotName=expected_slot_name, - ), - vector=LabwareOffsetVector(x=1, y=2, z=3), - ) - assert subject.standardize_labware_offset(original, robot_type) == expected - - @pytest.mark.parametrize( ("original_location", "robot_type", "expected_location"), [ diff --git a/app/src/molecules/PythonLabwareOffsetSnippet/index.tsx b/app/src/molecules/PythonLabwareOffsetSnippet/index.tsx index d6e1e4bbd7d..b416858d156 100644 --- a/app/src/molecules/PythonLabwareOffsetSnippet/index.tsx +++ b/app/src/molecules/PythonLabwareOffsetSnippet/index.tsx @@ -2,7 +2,7 @@ import { useState, useEffect } from 'react' import styled from 'styled-components' import { TYPOGRAPHY, SPACING, BORDERS, COLORS } from '@opentrons/components' import { createSnippet } from './createSnippet' -import type { LabwareOffsetCreateData } from '@opentrons/api-client' +import type { LegacyLabwareOffsetCreateData } from '@opentrons/api-client' import type { LoadedLabware, LoadedModule, @@ -25,7 +25,7 @@ interface PythonLabwareOffsetSnippetProps { commands: RunTimeCommand[] labware: LoadedLabware[] modules: LoadedModule[] - labwareOffsets: LabwareOffsetCreateData[] | null + labwareOffsets: LegacyLabwareOffsetCreateData[] | null } export function PythonLabwareOffsetSnippet( diff --git a/app/src/organisms/Desktop/ChooseRobotToRunProtocolSlideout/useCreateRunFromProtocol.ts b/app/src/organisms/Desktop/ChooseRobotToRunProtocolSlideout/useCreateRunFromProtocol.ts index 58d1bdf08df..44ba2933189 100644 --- a/app/src/organisms/Desktop/ChooseRobotToRunProtocolSlideout/useCreateRunFromProtocol.ts +++ b/app/src/organisms/Desktop/ChooseRobotToRunProtocolSlideout/useCreateRunFromProtocol.ts @@ -12,7 +12,7 @@ import { getValidCustomLabwareFiles } from '/app/redux/custom-labware/selectors' import type { UseMutateFunction } from 'react-query' import type { HostConfig, - LabwareOffsetCreateData, + LegacyLabwareOffsetCreateData, Protocol, } from '@opentrons/api-client' import type { UseCreateRunMutationOptions } from '@opentrons/react-api-client/src/runs/useCreateRunMutation' @@ -35,7 +35,7 @@ export interface UseCreateRun { export function useCreateRunFromProtocol( options: UseCreateRunMutationOptions, hostOverride?: HostConfig | null, - labwareOffsets?: LabwareOffsetCreateData[] + labwareOffsets?: LegacyLabwareOffsetCreateData[] ): UseCreateRun { const contextHost = useHost() const host = diff --git a/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/commands/modules.ts b/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/commands/modules.ts index 6fd4f57c1d3..8c5487a66e9 100644 --- a/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/commands/modules.ts +++ b/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/commands/modules.ts @@ -10,7 +10,7 @@ import type { CompletedProtocolAnalysis, CreateCommand, } from '@opentrons/shared-data' -import type { LabwareOffsetLocation } from '@opentrons/api-client' +import type { LegacyLabwareOffsetLocation } from '@opentrons/api-client' export interface BuildModulePrepCommandsParams { step: CheckPositionsStep @@ -128,7 +128,7 @@ const thermocyclerInitCommands = ( const heaterShakerCleanupCommands = ( moduleId: string | undefined, - location: LabwareOffsetLocation + location: LegacyLabwareOffsetLocation ): CreateCommand[] => { const moduleType = (moduleId != null && diff --git a/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/useApplyLPCOffsets.ts b/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/useApplyLPCOffsets.ts index 64c505d9fbd..29183c98f06 100644 --- a/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/useApplyLPCOffsets.ts +++ b/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/useApplyLPCOffsets.ts @@ -2,7 +2,7 @@ import { useState } from 'react' import { useCreateLabwareOffsetMutation } from '@opentrons/react-api-client' -import type { LabwareOffsetCreateData } from '@opentrons/api-client' +import type { LegacyLabwareOffsetCreateData } from '@opentrons/api-client' import type { UseLPCCommandChildProps } from './types' export interface UseApplyLPCOffsetsProps extends UseLPCCommandChildProps { @@ -11,7 +11,7 @@ export interface UseApplyLPCOffsetsProps extends UseLPCCommandChildProps { export interface UseApplyLPCOffsetsResult { handleApplyOffsetsAndClose: ( - offsets: LabwareOffsetCreateData[] + offsets: LegacyLabwareOffsetCreateData[] ) => Promise isApplyingOffsets: boolean } @@ -26,7 +26,7 @@ export function useApplyLPCOffsets({ const { createLabwareOffset } = useCreateLabwareOffsetMutation() const handleApplyOffsetsAndClose = ( - offsets: LabwareOffsetCreateData[] + offsets: LegacyLabwareOffsetCreateData[] ): Promise => { setIsApplyingOffsets(true) return Promise.all( diff --git a/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/useBuildOffsetsToApply.ts b/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/useBuildOffsetsToApply.ts index 6b4b01d6632..56667853952 100644 --- a/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/useBuildOffsetsToApply.ts +++ b/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/useBuildOffsetsToApply.ts @@ -3,11 +3,11 @@ import { useStore } from 'react-redux' import { selectOffsetsToApply } from '/app/redux/protocol-runs' import type { State } from '/app/redux/types' -import type { LabwareOffsetCreateData } from '@opentrons/api-client' +import type { LegacyLabwareOffsetCreateData } from '@opentrons/api-client' import type { UseLPCCommandChildProps } from '/app/organisms/LabwarePositionCheck/hooks/useLPCCommands/types' export interface UseBuildOffsetsToApplyResult { - buildOffsetsToApply: () => LabwareOffsetCreateData[] + buildOffsetsToApply: () => LegacyLabwareOffsetCreateData[] } export interface UseApplyLPCOffsetsProps extends UseLPCCommandChildProps { diff --git a/app/src/organisms/LabwarePositionCheck/steps/ResultsSummary/OffsetTable.tsx b/app/src/organisms/LabwarePositionCheck/steps/ResultsSummary/OffsetTable.tsx index d35c3d2f885..46d8d430bbb 100644 --- a/app/src/organisms/LabwarePositionCheck/steps/ResultsSummary/OffsetTable.tsx +++ b/app/src/organisms/LabwarePositionCheck/steps/ResultsSummary/OffsetTable.tsx @@ -18,7 +18,7 @@ import { import { selectLwDisplayName } from '/app/redux/protocol-runs' import type { LabwareDefinition2 } from '@opentrons/shared-data' -import type { LabwareOffsetCreateData } from '@opentrons/api-client' +import type { LegacyLabwareOffsetCreateData } from '@opentrons/api-client' import type { LPCStepProps, ResultsSummaryStep, @@ -27,7 +27,7 @@ import type { LPCWizardState } from '/app/redux/protocol-runs' import type { State } from '/app/redux/types' interface OffsetTableProps extends LPCStepProps { - offsets: LabwareOffsetCreateData[] + offsets: LegacyLabwareOffsetCreateData[] labwareDefinitions: LabwareDefinition2[] } diff --git a/app/src/organisms/LabwarePositionCheck/steps/ResultsSummary/TableComponent.tsx b/app/src/organisms/LabwarePositionCheck/steps/ResultsSummary/TableComponent.tsx index 90ddb8edcf1..7e1dce4d58e 100644 --- a/app/src/organisms/LabwarePositionCheck/steps/ResultsSummary/TableComponent.tsx +++ b/app/src/organisms/LabwarePositionCheck/steps/ResultsSummary/TableComponent.tsx @@ -4,7 +4,7 @@ import { TerseOffsetTable } from '/app/organisms/TerseOffsetTable' import { OffsetTable } from './OffsetTable' import { getIsOnDevice } from '/app/redux/config' -import type { LabwareOffsetCreateData } from '@opentrons/api-client' +import type { LegacyLabwareOffsetCreateData } from '@opentrons/api-client' import type { LPCStepProps, ResultsSummaryStep, @@ -13,7 +13,7 @@ import type { State } from '/app/redux/types' import type { LPCWizardState } from '/app/redux/protocol-runs' interface TableComponentProps extends LPCStepProps { - offsetsToApply: LabwareOffsetCreateData[] + offsetsToApply: LegacyLabwareOffsetCreateData[] } export function TableComponent(props: TableComponentProps): JSX.Element { diff --git a/app/src/organisms/LabwarePositionCheck/types/steps.ts b/app/src/organisms/LabwarePositionCheck/types/steps.ts index 3cc781aebff..17caa519d1b 100644 --- a/app/src/organisms/LabwarePositionCheck/types/steps.ts +++ b/app/src/organisms/LabwarePositionCheck/types/steps.ts @@ -1,4 +1,4 @@ -import type { LabwareOffsetLocation } from '@opentrons/api-client' +import type { LegacyLabwareOffsetLocation } from '@opentrons/api-client' import type { NAV_STEPS } from '../constants' import type { LPCWizardContentProps } from './content' @@ -19,7 +19,7 @@ export type LPCStepProps = Omit< export interface PerformLPCStep { pipetteId: string labwareId: string - location: LabwareOffsetLocation + location: LegacyLabwareOffsetLocation definitionUri: string adapterId?: string moduleId?: string diff --git a/app/src/organisms/LegacyApplyHistoricOffsets/hooks/getLabwareLocationCombos.ts b/app/src/organisms/LegacyApplyHistoricOffsets/hooks/getLabwareLocationCombos.ts index 4dc49c5ca23..9422c3de1cf 100644 --- a/app/src/organisms/LegacyApplyHistoricOffsets/hooks/getLabwareLocationCombos.ts +++ b/app/src/organisms/LegacyApplyHistoricOffsets/hooks/getLabwareLocationCombos.ts @@ -9,10 +9,10 @@ import type { ProtocolAnalysisOutput, RunTimeCommand, } from '@opentrons/shared-data' -import type { LabwareOffsetLocation } from '@opentrons/api-client' +import type { LegacyLabwareOffsetLocation } from '@opentrons/api-client' export interface LabwareLocationCombo { - location: LabwareOffsetLocation + location: LegacyLabwareOffsetLocation definitionUri: string labwareId: string moduleId?: string @@ -167,7 +167,7 @@ function appendLocationComboIfUniq( function resolveModuleLocation( modules: ProtocolAnalysisOutput['modules'], moduleId: string -): LabwareOffsetLocation | null { +): LegacyLabwareOffsetLocation | null { const moduleEntity = modules.find(m => m.id === moduleId) if (moduleEntity == null) { console.warn( @@ -182,7 +182,7 @@ function resolveModuleLocation( } interface ResolveAdapterLocation { - adapterOffsetLocation: LabwareOffsetLocation | null + adapterOffsetLocation: LegacyLabwareOffsetLocation | null moduleIdUnderAdapter?: string } function resolveAdapterLocation( @@ -200,7 +200,7 @@ function resolveAdapterLocation( const labwareDefUri = labwareEntity.definitionUri let moduleIdUnderAdapter - let adapterOffsetLocation: LabwareOffsetLocation | null = null + let adapterOffsetLocation: LegacyLabwareOffsetLocation | null = null if ( labwareEntity.location === 'offDeck' || labwareEntity.location === 'systemLocation' @@ -211,7 +211,7 @@ function resolveAdapterLocation( return { adapterOffsetLocation: null } } else if ('moduleId' in labwareEntity.location) { const moduleId = labwareEntity.location.moduleId - const resolvedModuleLocation: LabwareOffsetLocation | null = resolveModuleLocation( + const resolvedModuleLocation: LegacyLabwareOffsetLocation | null = resolveModuleLocation( modules, moduleId ) diff --git a/app/src/organisms/LegacyLabwarePositionCheck/LabwarePositionCheckComponent.tsx b/app/src/organisms/LegacyLabwarePositionCheck/LabwarePositionCheckComponent.tsx index 6ff45018b1a..57309df764b 100644 --- a/app/src/organisms/LegacyLabwarePositionCheck/LabwarePositionCheckComponent.tsx +++ b/app/src/organisms/LegacyLabwarePositionCheck/LabwarePositionCheckComponent.tsx @@ -39,7 +39,7 @@ import type { RobotType, } from '@opentrons/shared-data' import type { - LabwareOffsetCreateData, + LegacyLabwareOffsetCreateData, LabwareOffset, CommandData, } from '@opentrons/api-client' @@ -310,7 +310,9 @@ export const LabwarePositionCheckComponent = ( robotType, } - const handleApplyOffsets = (offsets: LabwareOffsetCreateData[]): void => { + const handleApplyOffsets = ( + offsets: LegacyLabwareOffsetCreateData[] + ): void => { setIsApplyingOffsets(true) Promise.all(offsets.map(data => createLabwareOffset({ runId, data }))) .then(() => { diff --git a/app/src/organisms/LegacyLabwarePositionCheck/ResultsSummary.tsx b/app/src/organisms/LegacyLabwarePositionCheck/ResultsSummary.tsx index 22934c0f8a0..8e53f40c366 100644 --- a/app/src/organisms/LegacyLabwarePositionCheck/ResultsSummary.tsx +++ b/app/src/organisms/LegacyLabwarePositionCheck/ResultsSummary.tsx @@ -48,7 +48,7 @@ import type { } from '@opentrons/shared-data' import type { LabwareOffset, - LabwareOffsetCreateData, + LegacyLabwareOffsetCreateData, } from '@opentrons/api-client' import type { ResultsSummaryStep, WorkingOffset } from './types' import type { TFunction } from 'i18next' @@ -60,7 +60,7 @@ interface ResultsSummaryProps extends ResultsSummaryStep { protocolData: CompletedProtocolAnalysis workingOffsets: WorkingOffset[] existingOffsets: LabwareOffset[] - handleApplyOffsets: (offsets: LabwareOffsetCreateData[]) => void + handleApplyOffsets: (offsets: LegacyLabwareOffsetCreateData[]) => void isApplyingOffsets: boolean isDeletingMaintenanceRun?: boolean } @@ -86,7 +86,7 @@ export const ResultsSummary = ( const isOnDevice = useSelector(getIsOnDevice) const offsetsToApply = useMemo(() => { - return workingOffsets.map( + return workingOffsets.map( ({ initialPosition, finalPosition, labwareId, location }) => { const definitionUri = protocolData.labware.find(l => l.id === labwareId)?.definitionUri ?? @@ -269,7 +269,7 @@ const ScrollContainer = styled(Flex)` ` interface OffsetTableProps { - offsets: LabwareOffsetCreateData[] + offsets: LegacyLabwareOffsetCreateData[] labwareDefinitions: LabwareDefinition2[] } diff --git a/app/src/organisms/LegacyLabwarePositionCheck/types.ts b/app/src/organisms/LegacyLabwarePositionCheck/types.ts index 2ddd14c25d6..4cb26dbfaed 100644 --- a/app/src/organisms/LegacyLabwarePositionCheck/types.ts +++ b/app/src/organisms/LegacyLabwarePositionCheck/types.ts @@ -1,6 +1,9 @@ import type { SECTIONS } from './constants' import type { useCreateCommandMutation } from '@opentrons/react-api-client' -import type { LabwareOffsetLocation, VectorOffset } from '@opentrons/api-client' +import type { + LegacyLabwareOffsetLocation, + VectorOffset, +} from '@opentrons/api-client' import type { LabwareDefinition2 } from '@opentrons/shared-data' export type LabwarePositionCheckStep = @@ -20,7 +23,7 @@ export interface CheckTipRacksStep { section: typeof SECTIONS.CHECK_TIP_RACKS pipetteId: string labwareId: string - location: LabwareOffsetLocation + location: LegacyLabwareOffsetLocation definitionUri: string adapterId?: string } @@ -32,7 +35,7 @@ export interface PickUpTipStep { section: typeof SECTIONS.PICK_UP_TIP pipetteId: string labwareId: string - location: LabwareOffsetLocation + location: LegacyLabwareOffsetLocation definitionUri: string adapterId?: string } @@ -40,7 +43,7 @@ export interface CheckPositionsStep { section: typeof SECTIONS.CHECK_POSITIONS pipetteId: string labwareId: string - location: LabwareOffsetLocation + location: LegacyLabwareOffsetLocation definitionUri: string moduleId?: string } @@ -48,7 +51,7 @@ export interface CheckLabwareStep { section: typeof SECTIONS.CHECK_LABWARE pipetteId: string labwareId: string - location: LabwareOffsetLocation + location: LegacyLabwareOffsetLocation definitionUri: string moduleId?: string adapterId?: string @@ -57,7 +60,7 @@ export interface ReturnTipStep { section: typeof SECTIONS.RETURN_TIP pipetteId: string labwareId: string - location: LabwareOffsetLocation + location: LegacyLabwareOffsetLocation definitionUri: string adapterId?: string } @@ -80,13 +83,13 @@ export type CreateRunCommand = ( interface InitialPositionAction { type: 'initialPosition' labwareId: string - location: LabwareOffsetLocation + location: LegacyLabwareOffsetLocation position: VectorOffset | null } interface FinalPositionAction { type: 'finalPosition' labwareId: string - location: LabwareOffsetLocation + location: LegacyLabwareOffsetLocation position: VectorOffset | null } interface TipPickUpOffsetAction { @@ -99,7 +102,7 @@ export type RegisterPositionAction = | TipPickUpOffsetAction export interface WorkingOffset { labwareId: string - location: LabwareOffsetLocation + location: LegacyLabwareOffsetLocation initialPosition: VectorOffset | null finalPosition: VectorOffset | null } diff --git a/app/src/organisms/LegacyLabwarePositionCheck/utils/getDisplayLocation.ts b/app/src/organisms/LegacyLabwarePositionCheck/utils/getDisplayLocation.ts index d70b741c48d..88ab9976719 100644 --- a/app/src/organisms/LegacyLabwarePositionCheck/utils/getDisplayLocation.ts +++ b/app/src/organisms/LegacyLabwarePositionCheck/utils/getDisplayLocation.ts @@ -6,10 +6,10 @@ import { } from '@opentrons/shared-data' import type { i18n, TFunction } from 'i18next' import type { LabwareDefinition2 } from '@opentrons/shared-data' -import type { LabwareOffsetLocation } from '@opentrons/api-client' +import type { LegacyLabwareOffsetLocation } from '@opentrons/api-client' export function getDisplayLocation( - location: LabwareOffsetLocation, + location: LegacyLabwareOffsetLocation, labwareDefinitions: LabwareDefinition2[], t: TFunction, i18n: i18n, diff --git a/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupParameters/ProtocolSetupParameters.tsx b/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupParameters/ProtocolSetupParameters.tsx index ec4df679049..519a5a32150 100644 --- a/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupParameters/ProtocolSetupParameters.tsx +++ b/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupParameters/ProtocolSetupParameters.tsx @@ -40,12 +40,15 @@ import type { CsvFileParameterFileData, } from '@opentrons/shared-data' import type { ProtocolSetupStepStatus } from '../ProtocolSetupStep' -import type { FileData, LabwareOffsetCreateData } from '@opentrons/api-client' +import type { + FileData, + LegacyLabwareOffsetCreateData, +} from '@opentrons/api-client' interface ProtocolSetupParametersProps { protocolId: string runTimeParameters: RunTimeParameter[] - labwareOffsets?: LabwareOffsetCreateData[] + labwareOffsets?: LegacyLabwareOffsetCreateData[] mostRecentAnalysis?: CompletedProtocolAnalysis | null } diff --git a/app/src/organisms/TerseOffsetTable/index.tsx b/app/src/organisms/TerseOffsetTable/index.tsx index 5fdbaf162a2..d1f4ac13da5 100644 --- a/app/src/organisms/TerseOffsetTable/index.tsx +++ b/app/src/organisms/TerseOffsetTable/index.tsx @@ -21,11 +21,11 @@ import { DIRECTION_ROW, } from '@opentrons/components' -import type { LabwareOffsetCreateData } from '@opentrons/api-client' +import type { LegacyLabwareOffsetCreateData } from '@opentrons/api-client' import type { LabwareDefinition2 } from '@opentrons/shared-data' export interface TerseOffsetTableProps { - offsets: LabwareOffsetCreateData[] + offsets: LegacyLabwareOffsetCreateData[] labwareDefinitions: LabwareDefinition2[] } diff --git a/app/src/redux/protocol-runs/selectors/lpc/labware.ts b/app/src/redux/protocol-runs/selectors/lpc/labware.ts index afce4ae46e1..fd831163cc2 100644 --- a/app/src/redux/protocol-runs/selectors/lpc/labware.ts +++ b/app/src/redux/protocol-runs/selectors/lpc/labware.ts @@ -14,7 +14,10 @@ import { getCurrentOffsetForLabwareInLocation } from '/app/transformations/analy import { getItemLabwareDef } from './transforms' import type { Selector } from 'reselect' -import type { VectorOffset, LabwareOffsetLocation } from '@opentrons/api-client' +import type { + VectorOffset, + LegacyLabwareOffsetLocation, +} from '@opentrons/api-client' import type { LabwareDefinition2, Coordinates } from '@opentrons/shared-data' import type { State } from '../../../types' @@ -88,7 +91,7 @@ export const selectActiveLwExistingOffset = ( export interface SelectOffsetsToApplyResult { definitionUri: string - location: LabwareOffsetLocation + location: LegacyLabwareOffsetLocation vector: Coordinates } diff --git a/app/src/redux/protocol-runs/types/lpc.ts b/app/src/redux/protocol-runs/types/lpc.ts index aec42e6eb98..0e31a166bf1 100644 --- a/app/src/redux/protocol-runs/types/lpc.ts +++ b/app/src/redux/protocol-runs/types/lpc.ts @@ -4,7 +4,7 @@ import type { CompletedProtocolAnalysis, } from '@opentrons/shared-data' import type { - LabwareOffsetLocation, + LegacyLabwareOffsetLocation, VectorOffset, LabwareOffset, } from '@opentrons/api-client' @@ -15,13 +15,13 @@ import type { StepsInfo } from '/app/organisms/LabwarePositionCheck/redux/types' export interface PositionParams { labwareId: string - location: LabwareOffsetLocation + location: LegacyLabwareOffsetLocation position: VectorOffset | null } export interface WorkingOffset { labwareId: string - location: LabwareOffsetLocation + location: LegacyLabwareOffsetLocation initialPosition: VectorOffset | null finalPosition: VectorOffset | null } diff --git a/app/src/transformations/analysis/getLabwareOffsetLocation.ts b/app/src/transformations/analysis/getLabwareOffsetLocation.ts index 526c3f780cb..6043c4c7eca 100644 --- a/app/src/transformations/analysis/getLabwareOffsetLocation.ts +++ b/app/src/transformations/analysis/getLabwareOffsetLocation.ts @@ -2,7 +2,7 @@ import { getModuleInitialLoadInfo, getLabwareLocation, } from '/app/transformations/commands' -import type { LabwareOffsetLocation } from '@opentrons/api-client' +import type { LegacyLabwareOffsetLocation } from '@opentrons/api-client' import type { LoadedModule, LoadedLabware, @@ -17,7 +17,7 @@ export const getLabwareOffsetLocation = ( commands: ProtocolAnalysisOutput['commands'], modules: LoadedModule[], labware: LoadedLabware[] -): LabwareOffsetLocation | null => { +): LegacyLabwareOffsetLocation | null => { const labwareLocation = getLabwareLocation(labwareId, commands) if (labwareLocation === 'offDeck' || labwareLocation === 'systemLocation') { diff --git a/react-api-client/src/runs/__tests__/useCreateLabwareOffsetsMutation.test.tsx b/react-api-client/src/runs/__tests__/useCreateLabwareOffsetsMutation.test.tsx index beb57a9ca72..e2b83c5741c 100644 --- a/react-api-client/src/runs/__tests__/useCreateLabwareOffsetsMutation.test.tsx +++ b/react-api-client/src/runs/__tests__/useCreateLabwareOffsetsMutation.test.tsx @@ -6,7 +6,10 @@ import { createLabwareOffset } from '@opentrons/api-client' import { useHost } from '../../api' import { useCreateLabwareOffsetMutation } from '../useCreateLabwareOffsetMutation' -import type { HostConfig, LabwareOffsetCreateData } from '@opentrons/api-client' +import type { + HostConfig, + LegacyLabwareOffsetCreateData, +} from '@opentrons/api-client' vi.mock('@opentrons/api-client') vi.mock('../../api/useHost') @@ -19,7 +22,7 @@ const OFFSET = { x: 1, y: 2, z: 3 } describe('useCreateLabwareOffsetMutation hook', () => { let wrapper: React.FunctionComponent<{ children: React.ReactNode }> - let labwareOffset: LabwareOffsetCreateData + let labwareOffset: LegacyLabwareOffsetCreateData beforeEach(() => { const queryClient = new QueryClient() diff --git a/react-api-client/src/runs/useCreateLabwareOffsetMutation.ts b/react-api-client/src/runs/useCreateLabwareOffsetMutation.ts index adf92f9657c..f1b04505b30 100644 --- a/react-api-client/src/runs/useCreateLabwareOffsetMutation.ts +++ b/react-api-client/src/runs/useCreateLabwareOffsetMutation.ts @@ -4,13 +4,13 @@ import { useHost } from '../api' import type { HostConfig, Run, - LabwareOffsetCreateData, + LegacyLabwareOffsetCreateData, } from '@opentrons/api-client' import type { UseMutationResult, UseMutateAsyncFunction } from 'react-query' interface CreateLabwareOffsetParams { runId: string - data: LabwareOffsetCreateData + data: LegacyLabwareOffsetCreateData } export type UseCreateLabwareOffsetMutationResult = UseMutationResult< diff --git a/robot-server/robot_server/labware_offsets/router.py b/robot-server/robot_server/labware_offsets/router.py index 3a01ca73278..e75bb27d926 100644 --- a/robot-server/robot_server/labware_offsets/router.py +++ b/robot-server/robot_server/labware_offsets/router.py @@ -1,6 +1,5 @@ """FastAPI endpoint functions for the `/labwareOffsets` endpoints.""" - from datetime import datetime import textwrap from typing import Annotated, Literal @@ -10,7 +9,11 @@ from pydantic.json_schema import SkipJsonSchema from server_utils.fastapi_utils.light_router import LightRouter -from opentrons.protocol_engine import LabwareOffset, LabwareOffsetCreate, ModuleModel +from opentrons.protocol_engine import ( + LabwareOffset, + LegacyLabwareOffsetCreate, + ModuleModel, +) from opentrons.types import DeckSlotName from robot_server.labware_offsets.models import LabwareOffsetNotFound @@ -54,7 +57,7 @@ async def post_labware_offset( # noqa: D103 store: Annotated[LabwareOffsetStore, fastapi.Depends(get_labware_offset_store)], new_offset_id: Annotated[str, fastapi.Depends(get_unique_id)], new_offset_created_at: Annotated[datetime, fastapi.Depends(get_current_time)], - request_body: Annotated[RequestModel[LabwareOffsetCreate], fastapi.Body()], + request_body: Annotated[RequestModel[LegacyLabwareOffsetCreate], fastapi.Body()], ) -> PydanticResponse[SimpleBody[LabwareOffset]]: new_offset = LabwareOffset.model_construct( id=new_offset_id, diff --git a/robot-server/robot_server/labware_offsets/store.py b/robot-server/robot_server/labware_offsets/store.py index a605f75da3e..dbeccc728a1 100644 --- a/robot-server/robot_server/labware_offsets/store.py +++ b/robot-server/robot_server/labware_offsets/store.py @@ -5,7 +5,7 @@ from opentrons.protocol_engine.types import ( LabwareOffset, - LabwareOffsetLocation, + LegacyLabwareOffsetLocation, LabwareOffsetVector, ModuleModel, ) @@ -154,7 +154,7 @@ def _sql_to_pydantic(row: sqlalchemy.engine.Row) -> LabwareOffset: id=row.offset_id, createdAt=row.created_at, definitionUri=row.definition_uri, - location=LabwareOffsetLocation( + location=LegacyLabwareOffsetLocation( slotName=DeckSlotName(row.location_slot_name), moduleModel=row.location_module_model, definitionUri=row.location_definition_uri, diff --git a/robot-server/robot_server/maintenance_runs/maintenance_run_data_manager.py b/robot-server/robot_server/maintenance_runs/maintenance_run_data_manager.py index dfc76945f81..2a27e0c9a67 100644 --- a/robot-server/robot_server/maintenance_runs/maintenance_run_data_manager.py +++ b/robot-server/robot_server/maintenance_runs/maintenance_run_data_manager.py @@ -1,9 +1,11 @@ """Manage current maintenance run data.""" + from datetime import datetime -from typing import List, Optional, Callable +from typing import Optional, Callable, Sequence from opentrons.protocol_engine import ( EngineStatus, + LegacyLabwareOffsetCreate, LabwareOffsetCreate, StateSummary, CommandSlice, @@ -87,7 +89,7 @@ async def create( self, run_id: str, created_at: datetime, - labware_offsets: List[LabwareOffsetCreate], + labware_offsets: Sequence[LabwareOffsetCreate | LegacyLabwareOffsetCreate], deck_configuration: DeckConfigurationType, notify_publishers: Callable[[], None], ) -> MaintenanceRun: diff --git a/robot-server/robot_server/maintenance_runs/maintenance_run_models.py b/robot-server/robot_server/maintenance_runs/maintenance_run_models.py index 8bde7ea7aff..25b3b40ae74 100644 --- a/robot-server/robot_server/maintenance_runs/maintenance_run_models.py +++ b/robot-server/robot_server/maintenance_runs/maintenance_run_models.py @@ -1,4 +1,5 @@ """Request and response models for maintenance run resources.""" + from datetime import datetime from pydantic import BaseModel, Field from typing import List, Optional @@ -11,6 +12,7 @@ LoadedModule, LabwareOffset, LabwareOffsetCreate, + LegacyLabwareOffsetCreate, Liquid, LiquidClassRecordWithId, ) @@ -89,7 +91,7 @@ class MaintenanceRun(ResourceModel): class MaintenanceRunCreate(BaseModel): """Create request data for a new maintenance run.""" - labwareOffsets: List[LabwareOffsetCreate] = Field( + labwareOffsets: List[LegacyLabwareOffsetCreate | LabwareOffsetCreate] = Field( default_factory=list, description="Labware offsets to apply as labware are loaded.", ) diff --git a/robot-server/robot_server/maintenance_runs/maintenance_run_orchestrator_store.py b/robot-server/robot_server/maintenance_runs/maintenance_run_orchestrator_store.py index 530cdc87563..31ab9228d74 100644 --- a/robot-server/robot_server/maintenance_runs/maintenance_run_orchestrator_store.py +++ b/robot-server/robot_server/maintenance_runs/maintenance_run_orchestrator_store.py @@ -1,14 +1,16 @@ """In-memory storage of ProtocolEngine instances.""" + import asyncio import logging from datetime import datetime -from typing import List, Optional, Callable +from typing import Optional, Callable, Sequence from opentrons.protocol_engine.errors.exceptions import EStopActivatedError from opentrons.protocol_engine.types import PostRunHardwareState, DeckConfigurationType from opentrons.protocol_engine import ( DeckType, LabwareOffsetCreate, + LegacyLabwareOffsetCreate, StateSummary, CommandSlice, CommandPointer, @@ -146,7 +148,7 @@ async def create( self, run_id: str, created_at: datetime, - labware_offsets: List[LabwareOffsetCreate], + labware_offsets: Sequence[LegacyLabwareOffsetCreate | LabwareOffsetCreate], notify_publishers: Callable[[], None], deck_configuration: Optional[DeckConfigurationType] = [], ) -> StateSummary: @@ -265,7 +267,9 @@ async def add_command_and_wait_for_interval( command=request, wait_until_complete=wait_until_complete, timeout=timeout ) - def add_labware_offset(self, request: LabwareOffsetCreate) -> LabwareOffset: + def add_labware_offset( + self, request: LegacyLabwareOffsetCreate | LabwareOffsetCreate + ) -> LabwareOffset: """Add a new labware offset to state.""" return self.run_orchestrator.add_labware_offset(request) diff --git a/robot-server/robot_server/maintenance_runs/router/labware_router.py b/robot-server/robot_server/maintenance_runs/router/labware_router.py index 53dce4ae6eb..c64e8b7db97 100644 --- a/robot-server/robot_server/maintenance_runs/router/labware_router.py +++ b/robot-server/robot_server/maintenance_runs/router/labware_router.py @@ -1,4 +1,5 @@ """Router for /maintenance_runs endpoints dealing with labware offsets and definitions.""" + from typing import Annotated import logging @@ -7,7 +8,11 @@ from opentrons_shared_data.labware.labware_definition import LabwareDefinition from server_utils.fastapi_utils.light_router import LightRouter -from opentrons.protocol_engine import LabwareOffsetCreate, LabwareOffset +from opentrons.protocol_engine import ( + LabwareOffsetCreate, + LegacyLabwareOffsetCreate, + LabwareOffset, +) from robot_server.errors.error_responses import ErrorBody from robot_server.service.json_api import RequestModel, SimpleBody, PydanticResponse @@ -40,7 +45,7 @@ }, ) async def add_labware_offset( - request_body: RequestModel[LabwareOffsetCreate], + request_body: RequestModel[LabwareOffsetCreate | LegacyLabwareOffsetCreate], run_orchestrator_store: Annotated[ MaintenanceRunOrchestratorStore, Depends(get_maintenance_run_orchestrator_store) ], diff --git a/robot-server/robot_server/runs/router/labware_router.py b/robot-server/robot_server/runs/router/labware_router.py index f9264da51e6..78c880a2df5 100644 --- a/robot-server/robot_server/runs/router/labware_router.py +++ b/robot-server/robot_server/runs/router/labware_router.py @@ -9,7 +9,11 @@ from server_utils.fastapi_utils.light_router import LightRouter -from opentrons.protocol_engine import LabwareOffsetCreate, LabwareOffset +from opentrons.protocol_engine import ( + LabwareOffsetCreate, + LegacyLabwareOffsetCreate, + LabwareOffset, +) from robot_server.errors.error_responses import ErrorBody from robot_server.service.json_api import ( @@ -47,7 +51,7 @@ }, ) async def add_labware_offset( - request_body: RequestModel[LabwareOffsetCreate], + request_body: RequestModel[LegacyLabwareOffsetCreate | LabwareOffsetCreate], run_orchestrator_store: Annotated[ RunOrchestratorStore, Depends(get_run_orchestrator_store) ], diff --git a/robot-server/robot_server/runs/run_data_manager.py b/robot-server/robot_server/runs/run_data_manager.py index fa937f7cb68..86473667987 100644 --- a/robot-server/robot_server/runs/run_data_manager.py +++ b/robot-server/robot_server/runs/run_data_manager.py @@ -1,7 +1,7 @@ """Manage current and historical run data.""" from datetime import datetime -from typing import Dict, List, Optional, Callable, Union, Mapping +from typing import Dict, List, Optional, Callable, Union, Mapping, Sequence from opentrons_shared_data.labware.labware_definition import LabwareDefinition from opentrons_shared_data.errors.exceptions import InvalidStoredData, EnumeratedError @@ -10,6 +10,7 @@ from opentrons.protocol_engine import ( EngineStatus, LabwareOffsetCreate, + LegacyLabwareOffsetCreate, StateSummary, CommandSlice, CommandErrorSlice, @@ -181,7 +182,7 @@ async def create( self, run_id: str, created_at: datetime, - labware_offsets: List[LabwareOffsetCreate], + labware_offsets: Sequence[LabwareOffsetCreate | LegacyLabwareOffsetCreate], deck_configuration: DeckConfigurationType, file_provider: FileProvider, run_time_param_values: Optional[PrimitiveRunTimeParamValuesType], diff --git a/robot-server/robot_server/runs/run_models.py b/robot-server/robot_server/runs/run_models.py index 4d5da7560c0..f530707d4c3 100644 --- a/robot-server/robot_server/runs/run_models.py +++ b/robot-server/robot_server/runs/run_models.py @@ -1,4 +1,5 @@ """Request and response models for run resources.""" + from datetime import datetime from enum import Enum @@ -16,6 +17,7 @@ LoadedLabware, LoadedModule, LabwareOffset, + LegacyLabwareOffsetCreate, LabwareOffsetCreate, Liquid, LiquidClassRecordWithId, @@ -265,7 +267,7 @@ class RunCreate(BaseModel): None, description="Protocol resource ID that this run will be using, if applicable.", ) - labwareOffsets: List[LabwareOffsetCreate] = Field( + labwareOffsets: List[LegacyLabwareOffsetCreate | LabwareOffsetCreate] = Field( default_factory=list, description="Labware offsets to apply as labware are loaded.", ) diff --git a/robot-server/robot_server/runs/run_orchestrator_store.py b/robot-server/robot_server/runs/run_orchestrator_store.py index adb7cac151e..38a6c2e23c6 100644 --- a/robot-server/robot_server/runs/run_orchestrator_store.py +++ b/robot-server/robot_server/runs/run_orchestrator_store.py @@ -2,7 +2,7 @@ import asyncio import logging -from typing import Dict, List, Optional, Callable, Mapping +from typing import Dict, List, Optional, Callable, Mapping, Sequence from opentrons.types import NozzleMapInterface from opentrons.protocol_engine.errors.exceptions import EStopActivatedError @@ -33,6 +33,7 @@ from opentrons.protocol_engine import ( DeckType, LabwareOffsetCreate, + LegacyLabwareOffsetCreate, StateSummary, CommandSlice, CommandErrorSlice, @@ -192,7 +193,7 @@ async def get_default_orchestrator(self) -> RunOrchestrator: async def create( self, run_id: str, - labware_offsets: List[LabwareOffsetCreate], + labware_offsets: Sequence[LabwareOffsetCreate | LegacyLabwareOffsetCreate], initial_error_recovery_policy: error_recovery_policy.ErrorRecoveryPolicy, deck_configuration: DeckConfigurationType, file_provider: FileProvider, @@ -408,7 +409,9 @@ def run_was_started(self) -> bool: """Get whether the run has started.""" return self.run_orchestrator.run_has_started() - def add_labware_offset(self, request: LabwareOffsetCreate) -> LabwareOffset: + def add_labware_offset( + self, request: LabwareOffsetCreate | LegacyLabwareOffsetCreate + ) -> LabwareOffset: """Add a new labware offset to state.""" return self.run_orchestrator.add_labware_offset(request) diff --git a/robot-server/tests/integration/http_api/runs/test_protocol_run.tavern.yaml b/robot-server/tests/integration/http_api/runs/test_protocol_run.tavern.yaml index 732726d39e9..038f510d1dc 100644 --- a/robot-server/tests/integration/http_api/runs/test_protocol_run.tavern.yaml +++ b/robot-server/tests/integration/http_api/runs/test_protocol_run.tavern.yaml @@ -105,6 +105,9 @@ stages: definitionUri: opentrons/biorad_96_wellplate_200ul_pcr/1 location: slotName: '1' + locationSequence: + - kind: 'onAddressableArea' + addressableAreaName: '1' vector: x: 1.11 y: 2.22 @@ -264,6 +267,9 @@ stages: definitionUri: opentrons/biorad_96_wellplate_200ul_pcr/1 location: slotName: '1' + locationSequence: + - kind: 'onAddressableArea' + addressableAreaName: '1' vector: x: 1.11 y: 2.22 diff --git a/robot-server/tests/labware_offsets/test_store.py b/robot-server/tests/labware_offsets/test_store.py index a23b55aff9e..0b6048da86b 100644 --- a/robot-server/tests/labware_offsets/test_store.py +++ b/robot-server/tests/labware_offsets/test_store.py @@ -7,7 +7,7 @@ from opentrons.protocol_engine import ( LabwareOffset, - LabwareOffsetLocation, + LegacyLabwareOffsetLocation, LabwareOffsetVector, ) from opentrons.protocol_engine.types import ModuleModel @@ -35,7 +35,7 @@ def test_filter_fields(subject: LabwareOffsetStore) -> None: id="a", createdAt=datetime.now(timezone.utc), definitionUri="definitionUri a", - location=LabwareOffsetLocation( + location=LegacyLabwareOffsetLocation( slotName=DeckSlotName.SLOT_A1, moduleModel=ModuleModel.THERMOCYCLER_MODULE_V1, definitionUri="location.definitionUri a", @@ -46,7 +46,7 @@ def test_filter_fields(subject: LabwareOffsetStore) -> None: id="b", createdAt=datetime.now(timezone.utc), definitionUri="definitionUri b", - location=LabwareOffsetLocation( + location=LegacyLabwareOffsetLocation( slotName=DeckSlotName.SLOT_B1, moduleModel=ModuleModel.MAGNETIC_BLOCK_V1, definitionUri="location.definitionUri b", @@ -100,7 +100,7 @@ def test_filter_combinations(subject: LabwareOffsetStore) -> None: id=id, createdAt=datetime.now(timezone.utc), definitionUri=definition_uri, - location=LabwareOffsetLocation(slotName=DeckSlotName.SLOT_A1), + location=LegacyLabwareOffsetLocation(slotName=DeckSlotName.SLOT_A1), vector=LabwareOffsetVector(x=1, y=2, z=3), ) for (id, definition_uri) in ids_and_definition_uris @@ -141,7 +141,7 @@ def test_delete(subject: LabwareOffsetStore) -> None: id=id, createdAt=datetime.now(timezone.utc), definitionUri="", - location=LabwareOffsetLocation(slotName=DeckSlotName.SLOT_A1), + location=LegacyLabwareOffsetLocation(slotName=DeckSlotName.SLOT_A1), vector=LabwareOffsetVector(x=1, y=2, z=3), ) for id in ["id-a", "id-b", "id-c"] diff --git a/robot-server/tests/maintenance_runs/router/test_base_router.py b/robot-server/tests/maintenance_runs/router/test_base_router.py index 29a9c81a3b7..b7b1182fa91 100644 --- a/robot-server/tests/maintenance_runs/router/test_base_router.py +++ b/robot-server/tests/maintenance_runs/router/test_base_router.py @@ -1,10 +1,11 @@ """Tests for base /runs routes.""" + import pytest from datetime import datetime from decoy import Decoy from opentrons.types import DeckSlotName -from opentrons.protocol_engine import LabwareOffsetCreate, types as pe_types +from opentrons.protocol_engine import types as pe_types from robot_server.errors.error_responses import ApiError from robot_server.service.json_api import ( @@ -44,11 +45,11 @@ def mock_notify_publishers() -> None: @pytest.fixture -def labware_offset_create() -> LabwareOffsetCreate: +def labware_offset_create() -> pe_types.LegacyLabwareOffsetCreate: """Get a labware offset create request value object.""" - return pe_types.LabwareOffsetCreate( + return pe_types.LegacyLabwareOffsetCreate( definitionUri="namespace_1/load_name_1/123", - location=pe_types.LabwareOffsetLocation(slotName=DeckSlotName.SLOT_1), + location=pe_types.LegacyLabwareOffsetLocation(slotName=DeckSlotName.SLOT_1), vector=pe_types.LabwareOffsetVector(x=1, y=2, z=3), ) diff --git a/robot-server/tests/maintenance_runs/router/test_labware_router.py b/robot-server/tests/maintenance_runs/router/test_labware_router.py index 2b03b13c9e8..72b1e95e2f7 100644 --- a/robot-server/tests/maintenance_runs/router/test_labware_router.py +++ b/robot-server/tests/maintenance_runs/router/test_labware_router.py @@ -1,4 +1,5 @@ """Tests for /runs routes dealing with labware offsets and definitions.""" + import pytest from datetime import datetime from decoy import Decoy @@ -55,9 +56,9 @@ async def test_add_labware_offset( run: MaintenanceRun, ) -> None: """It should add the labware offset to the engine, assuming the run is current.""" - labware_offset_request = pe_types.LabwareOffsetCreate( + labware_offset_request = pe_types.LegacyLabwareOffsetCreate( definitionUri="namespace_1/load_name_1/123", - location=pe_types.LabwareOffsetLocation(slotName=DeckSlotName.SLOT_1), + location=pe_types.LegacyLabwareOffsetLocation(slotName=DeckSlotName.SLOT_1), vector=pe_types.LabwareOffsetVector(x=1, y=2, z=3), ) @@ -65,7 +66,7 @@ async def test_add_labware_offset( id="labware-offset-id", createdAt=datetime(year=2022, month=2, day=2), definitionUri="labware-definition-uri", - location=pe_types.LabwareOffsetLocation(slotName=DeckSlotName.SLOT_1), + location=pe_types.LegacyLabwareOffsetLocation(slotName=DeckSlotName.SLOT_1), vector=pe_types.LabwareOffsetVector(x=0, y=0, z=0), ) diff --git a/robot-server/tests/maintenance_runs/test_engine_store.py b/robot-server/tests/maintenance_runs/test_engine_store.py index ed9987f5e77..019bb4a913d 100644 --- a/robot-server/tests/maintenance_runs/test_engine_store.py +++ b/robot-server/tests/maintenance_runs/test_engine_store.py @@ -1,4 +1,5 @@ """Tests for the MaintenanceRunOrchestratorStore interface.""" + from datetime import datetime import pytest @@ -95,9 +96,9 @@ async def test_create_engine_with_labware_offsets( subject: MaintenanceRunOrchestratorStore, ) -> None: """It should create an engine for a run with labware offsets.""" - labware_offset = pe_types.LabwareOffsetCreate( + labware_offset = pe_types.LegacyLabwareOffsetCreate( definitionUri="namespace/load_name/version", - location=pe_types.LabwareOffsetLocation(slotName=DeckSlotName.SLOT_5), + location=pe_types.LegacyLabwareOffsetLocation(slotName=DeckSlotName.SLOT_5), vector=pe_types.LabwareOffsetVector(x=1, y=2, z=3), ) @@ -113,7 +114,12 @@ async def test_create_engine_with_labware_offsets( id=matchers.IsA(str), createdAt=matchers.IsA(datetime), definitionUri="namespace/load_name/version", - location=pe_types.LabwareOffsetLocation(slotName=DeckSlotName.SLOT_5), + location=pe_types.LegacyLabwareOffsetLocation(slotName=DeckSlotName.SLOT_5), + locationSequence=[ + pe_types.OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="5" + ) + ], vector=pe_types.LabwareOffsetVector(x=1, y=2, z=3), ) ] diff --git a/robot-server/tests/maintenance_runs/test_run_data_manager.py b/robot-server/tests/maintenance_runs/test_run_data_manager.py index 634eaab6ce5..768bdbe1029 100644 --- a/robot-server/tests/maintenance_runs/test_run_data_manager.py +++ b/robot-server/tests/maintenance_runs/test_run_data_manager.py @@ -160,9 +160,9 @@ async def test_create_with_options( run_id = "hello world" created_at = datetime(year=2021, month=1, day=1) - labware_offset = pe_types.LabwareOffsetCreate( + labware_offset = pe_types.LegacyLabwareOffsetCreate( definitionUri="namespace/load_name/version", - location=pe_types.LabwareOffsetLocation(slotName=DeckSlotName.SLOT_5), + location=pe_types.LegacyLabwareOffsetLocation(slotName=DeckSlotName.SLOT_5), vector=pe_types.LabwareOffsetVector(x=1, y=2, z=3), ) diff --git a/robot-server/tests/runs/router/test_base_router.py b/robot-server/tests/runs/router/test_base_router.py index 0350bb4d0b0..bf475b5a0c0 100644 --- a/robot-server/tests/runs/router/test_base_router.py +++ b/robot-server/tests/runs/router/test_base_router.py @@ -9,7 +9,6 @@ from opentrons.types import DeckSlotName, Point, NozzleConfigurationType from opentrons.protocol_engine import ( - LabwareOffsetCreate, types as pe_types, errors as pe_errors, CommandErrorSlice, @@ -101,11 +100,11 @@ def mock_data_files_directory(decoy: Decoy) -> Path: @pytest.fixture -def labware_offset_create() -> LabwareOffsetCreate: +def labware_offset_create() -> pe_types.LegacyLabwareOffsetCreate: """Get a labware offset create request value object.""" - return pe_types.LabwareOffsetCreate( + return pe_types.LegacyLabwareOffsetCreate( definitionUri="namespace_1/load_name_1/123", - location=pe_types.LabwareOffsetLocation(slotName=DeckSlotName.SLOT_1), + location=pe_types.LegacyLabwareOffsetLocation(slotName=DeckSlotName.SLOT_1), vector=pe_types.LabwareOffsetVector(x=1, y=2, z=3), ) @@ -114,7 +113,7 @@ async def test_create_run( decoy: Decoy, mock_run_data_manager: RunDataManager, mock_run_auto_deleter: RunAutoDeleter, - labware_offset_create: pe_types.LabwareOffsetCreate, + labware_offset_create: pe_types.LegacyLabwareOffsetCreate, mock_deck_configuration_store: DeckConfigurationStore, mock_file_provider_wrapper: FileProviderWrapper, mock_protocol_store: ProtocolStore, diff --git a/robot-server/tests/runs/router/test_labware_router.py b/robot-server/tests/runs/router/test_labware_router.py index bf55021a6ad..2b55b4097f6 100644 --- a/robot-server/tests/runs/router/test_labware_router.py +++ b/robot-server/tests/runs/router/test_labware_router.py @@ -59,9 +59,9 @@ async def test_add_labware_offset( run: Run, ) -> None: """It should add the labware offset to the engine, assuming the run is current.""" - labware_offset_request = pe_types.LabwareOffsetCreate( + labware_offset_request = pe_types.LegacyLabwareOffsetCreate( definitionUri="namespace_1/load_name_1/123", - location=pe_types.LabwareOffsetLocation(slotName=DeckSlotName.SLOT_1), + location=pe_types.LegacyLabwareOffsetLocation(slotName=DeckSlotName.SLOT_1), vector=pe_types.LabwareOffsetVector(x=1, y=2, z=3), ) @@ -69,7 +69,7 @@ async def test_add_labware_offset( id="labware-offset-id", createdAt=datetime(year=2022, month=2, day=2), definitionUri="labware-definition-uri", - location=pe_types.LabwareOffsetLocation(slotName=DeckSlotName.SLOT_1), + location=pe_types.LegacyLabwareOffsetLocation(slotName=DeckSlotName.SLOT_1), vector=pe_types.LabwareOffsetVector(x=0, y=0, z=0), ) @@ -95,9 +95,9 @@ async def test_add_labware_offset_not_current( """It should 409 if the run is not current.""" not_current_run = run.model_copy(update={"current": False}) - labware_offset_request = pe_types.LabwareOffsetCreate( + labware_offset_request = pe_types.LegacyLabwareOffsetCreate( definitionUri="namespace_1/load_name_1/123", - location=pe_types.LabwareOffsetLocation(slotName=DeckSlotName.SLOT_1), + location=pe_types.LegacyLabwareOffsetLocation(slotName=DeckSlotName.SLOT_1), vector=pe_types.LabwareOffsetVector(x=1, y=2, z=3), ) diff --git a/robot-server/tests/runs/test_run_orchestrator_store.py b/robot-server/tests/runs/test_run_orchestrator_store.py index b0f8354e494..a8564cece99 100644 --- a/robot-server/tests/runs/test_run_orchestrator_store.py +++ b/robot-server/tests/runs/test_run_orchestrator_store.py @@ -1,4 +1,5 @@ """Tests for the EngineStore interface.""" + from datetime import datetime import pytest from decoy import Decoy, matchers @@ -103,9 +104,9 @@ async def test_create_engine_with_labware_offsets( subject: RunOrchestratorStore, ) -> None: """It should create an engine for a run with labware offsets.""" - labware_offset = pe_types.LabwareOffsetCreate( + labware_offset = pe_types.LegacyLabwareOffsetCreate( definitionUri="namespace/load_name/version", - location=pe_types.LabwareOffsetLocation(slotName=DeckSlotName.SLOT_5), + location=pe_types.LegacyLabwareOffsetLocation(slotName=DeckSlotName.SLOT_5), vector=pe_types.LabwareOffsetVector(x=1, y=2, z=3), ) @@ -124,7 +125,12 @@ async def test_create_engine_with_labware_offsets( id=matchers.IsA(str), createdAt=matchers.IsA(datetime), definitionUri="namespace/load_name/version", - location=pe_types.LabwareOffsetLocation(slotName=DeckSlotName.SLOT_5), + location=pe_types.LegacyLabwareOffsetLocation(slotName=DeckSlotName.SLOT_5), + locationSequence=[ + pe_types.OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="5" + ) + ], vector=pe_types.LabwareOffsetVector(x=1, y=2, z=3), ) ] diff --git a/shared-data/python/opentrons_shared_data/deck/__init__.py b/shared-data/python/opentrons_shared_data/deck/__init__.py index 38607263418..f2136d6e97a 100644 --- a/shared-data/python/opentrons_shared_data/deck/__init__.py +++ b/shared-data/python/opentrons_shared_data/deck/__init__.py @@ -55,6 +55,11 @@ def load(name: str, version: "DeckSchemaVersion3") -> "DeckDefinitionV3": ... +@overload +def load(name: str) -> "DeckDefinitionV5": + ... + + def load(name: str, version: int = DEFAULT_DECK_DEFINITION_VERSION) -> "DeckDefinition": return json.loads( # type: ignore[no-any-return] load_shared_data(f"deck/definitions/{version}/{name}.json") From 6123b812f666f4e29e7c39036113f9517a5c4966 Mon Sep 17 00:00:00 2001 From: Sanniti Pimpley Date: Wed, 29 Jan 2025 13:56:39 -0500 Subject: [PATCH 041/150] feat(api): remove liquid classes feature flag, gate liquid classes behind 2.23 (#17378) Closes AUTH-1294 # Overview - Removes the `allowLiquidClasses` feature flag - Gates all liquid classes features (including `transfer_liquid()`, `distribute_liquid()`, `consolidate_liquid()`) behind PAPI version 2.23 - Updates tests ## Risk assessment Low. Makes the liquid classes feature available for use in the new API. But this work does not affect any existing APIs. --- api/release-notes-internal.md | 9 ++ api/src/opentrons/config/advanced_settings.py | 20 ++--- api/src/opentrons/config/feature_flags.py | 4 - .../protocol_api/instrument_context.py | 25 +----- .../protocol_api/protocol_context.py | 10 +-- .../test_advanced_settings_migration.py | 12 ++- .../protocol_api/test_instrument_context.py | 87 +------------------ .../protocol_api/test_protocol_context.py | 9 +- .../test_liquid_classes.py | 17 +--- .../test_transfer_with_liquid_classes.py | 18 ++-- 10 files changed, 42 insertions(+), 169 deletions(-) diff --git a/api/release-notes-internal.md b/api/release-notes-internal.md index bc5398781e4..7fb93059e15 100644 --- a/api/release-notes-internal.md +++ b/api/release-notes-internal.md @@ -2,6 +2,15 @@ For more details about this release, please see the full [technical change log][ [technical change log]: https://github.com/Opentrons/opentrons/releases +## Internal Release 2.4.0-alpha.1 + +This internal release, pulled from the `edge` branch, contains features being developed for 8.4.0. It's for internal testing only. + +### New Stuff In This Release (list in progress): + +- Python API version bumped to 2.23 +- Added liquid classes and new transfer functions + ## Internal Release 2.3.0-alpha.2 This internal release, pulled from the `edge` branch, contains features being developed for 8.3.0. It's for internal testing only. diff --git a/api/src/opentrons/config/advanced_settings.py b/api/src/opentrons/config/advanced_settings.py index 44cf5c0fcc4..2ec6f10c643 100644 --- a/api/src/opentrons/config/advanced_settings.py +++ b/api/src/opentrons/config/advanced_settings.py @@ -222,17 +222,6 @@ class Setting(NamedTuple): robot_type=[RobotTypeEnum.OT2, RobotTypeEnum.FLEX], internal_only=True, ), - SettingDefinition( - _id="allowLiquidClasses", - title="Allow the use of liquid classes", - description=( - "Do not enable." - " This is an Opentrons internal setting to allow using in-development" - " liquid classes." - ), - robot_type=[RobotTypeEnum.OT2, RobotTypeEnum.FLEX], - internal_only=True, - ), ] @@ -736,6 +725,14 @@ def _migrate35to36(previous: SettingsMap) -> SettingsMap: return newmap +def _migrate36to37(previous: SettingsMap) -> SettingsMap: + """Migrate to version 37 of the feature flags file. + + - Removes the allowLiquidClasses flag. + """ + return {k: v for k, v in previous.items() if "allowLiquidClasses" != k} + + _MIGRATIONS = [ _migrate0to1, _migrate1to2, @@ -773,6 +770,7 @@ def _migrate35to36(previous: SettingsMap) -> SettingsMap: _migrate33to34, _migrate34to35, _migrate35to36, + _migrate36to37, ] """ List of all migrations to apply, indexed by (version - 1). See _migrate below diff --git a/api/src/opentrons/config/feature_flags.py b/api/src/opentrons/config/feature_flags.py index 2164e66f90a..7eb40721511 100644 --- a/api/src/opentrons/config/feature_flags.py +++ b/api/src/opentrons/config/feature_flags.py @@ -78,7 +78,3 @@ def enable_performance_metrics(robot_type: RobotTypeEnum) -> bool: def oem_mode_enabled() -> bool: return advs.get_setting_with_env_overload("enableOEMMode", RobotTypeEnum.FLEX) - - -def allow_liquid_classes(robot_type: RobotTypeEnum) -> bool: - return advs.get_setting_with_env_overload("allowLiquidClasses", robot_type) diff --git a/api/src/opentrons/protocol_api/instrument_context.py b/api/src/opentrons/protocol_api/instrument_context.py index 6192b35670a..6bd93f27970 100644 --- a/api/src/opentrons/protocol_api/instrument_context.py +++ b/api/src/opentrons/protocol_api/instrument_context.py @@ -8,7 +8,6 @@ UnexpectedTipRemovalError, UnsupportedHardwareCommand, ) -from opentrons_shared_data.robot.types import RobotTypeEnum from opentrons.legacy_broker import LegacyBroker from opentrons.hardware_control.dev_types import PipetteDict @@ -38,7 +37,6 @@ from ._nozzle_layout import NozzleLayout from ._liquid import LiquidClass from . import labware, validation -from ..config import feature_flags from ..protocols.advanced_control.transfers.common import ( TransferTipPolicyV2, TransferTipPolicyV2Type, @@ -1509,6 +1507,7 @@ def _execute_transfer(self, plan: v1_transfer.TransferPlan) -> None: for cmd in plan: getattr(self, cmd["method"])(*cmd["args"], **cmd["kwargs"]) + @requires_version(2, 23) def transfer_liquid( self, liquid_class: LiquidClass, @@ -1528,13 +1527,6 @@ def transfer_liquid( TODO: Add args description. """ - if not feature_flags.allow_liquid_classes( - robot_type=RobotTypeEnum.robot_literal_to_enum( - self._protocol_core.robot_type - ) - ): - raise NotImplementedError("This method is not implemented.") - flat_sources_list = validation.ensure_valid_flat_wells_list_for_transfer_v2( source ) @@ -1604,6 +1596,7 @@ def transfer_liquid( ) return self + @requires_version(2, 23) def distribute_liquid( self, liquid_class: LiquidClass, @@ -1623,13 +1616,6 @@ def distribute_liquid( TODO: Add args description. """ - if not feature_flags.allow_liquid_classes( - robot_type=RobotTypeEnum.robot_literal_to_enum( - self._protocol_core.robot_type - ) - ): - raise NotImplementedError("This method is not implemented.") - if not isinstance(source, labware.Well): raise ValueError(f"Source should be a single Well but received {source}.") flat_dests_list = validation.ensure_valid_flat_wells_list_for_transfer_v2(dest) @@ -1689,6 +1675,7 @@ def distribute_liquid( ) return self + @requires_version(2, 23) def consolidate_liquid( self, liquid_class: LiquidClass, @@ -1708,12 +1695,6 @@ def consolidate_liquid( TODO: Add args description. """ - if not feature_flags.allow_liquid_classes( - robot_type=RobotTypeEnum.robot_literal_to_enum( - self._protocol_core.robot_type - ) - ): - raise NotImplementedError("This method is not implemented.") if not isinstance(dest, labware.Well): raise ValueError( f"Destination should be a single Well but received {dest}." diff --git a/api/src/opentrons/protocol_api/protocol_context.py b/api/src/opentrons/protocol_api/protocol_context.py index 1ea86aca893..f98d46f2e45 100644 --- a/api/src/opentrons/protocol_api/protocol_context.py +++ b/api/src/opentrons/protocol_api/protocol_context.py @@ -14,10 +14,8 @@ from opentrons_shared_data.labware.types import LabwareDefinition from opentrons_shared_data.pipette.types import PipetteNameType -from opentrons_shared_data.robot.types import RobotTypeEnum from opentrons.types import Mount, Location, DeckLocation, DeckSlotName, StagingSlotName -from opentrons.config import feature_flags from opentrons.legacy_broker import LegacyBroker from opentrons.hardware_control.modules.types import ( MagneticBlockModel, @@ -1354,17 +1352,13 @@ def define_liquid( display_color=display_color, ) + @requires_version(2, 23) def define_liquid_class( self, name: str, ) -> LiquidClass: """Define a liquid class for use in the protocol.""" - if feature_flags.allow_liquid_classes( - robot_type=RobotTypeEnum.robot_literal_to_enum(self._core.robot_type) - ): - return self._core.define_liquid_class(name=name) - else: - raise NotImplementedError("This method is not implemented.") + return self._core.define_liquid_class(name=name) @property @requires_version(2, 5) diff --git a/api/tests/opentrons/config/test_advanced_settings_migration.py b/api/tests/opentrons/config/test_advanced_settings_migration.py index a2bcf71a1fb..05101b53fc1 100644 --- a/api/tests/opentrons/config/test_advanced_settings_migration.py +++ b/api/tests/opentrons/config/test_advanced_settings_migration.py @@ -8,7 +8,7 @@ @pytest.fixture def migrated_file_version() -> int: - return 36 + return 37 # make sure to set a boolean value in default_file_settings only if @@ -30,7 +30,6 @@ def default_file_settings() -> Dict[str, Any]: "enableErrorRecoveryExperiments": None, "enableOEMMode": None, "enablePerformanceMetrics": None, - "allowLiquidClasses": None, } @@ -432,6 +431,13 @@ def v36_config(v35_config: Dict[str, Any]) -> Dict[str, Any]: return r +@pytest.fixture +def v37_config(v36_config: Dict[str, Any]) -> Dict[str, Any]: + r = {k: v for k, v in v36_config.items() if k != "allowLiquidClasses"} + r["_version"] = 37 + return r + + @pytest.fixture( scope="session", params=[ @@ -473,6 +479,7 @@ def v36_config(v35_config: Dict[str, Any]) -> Dict[str, Any]: lazy_fixture("v34_config"), lazy_fixture("v35_config"), lazy_fixture("v36_config"), + lazy_fixture("v37_config"), ], ) def old_settings(request: SubRequest) -> Dict[str, Any]: @@ -563,5 +570,4 @@ def test_ensures_config() -> None: "enableErrorRecoveryExperiments": None, "enableOEMMode": None, "enablePerformanceMetrics": None, - "allowLiquidClasses": None, } diff --git a/api/tests/opentrons/protocol_api/test_instrument_context.py b/api/tests/opentrons/protocol_api/test_instrument_context.py index 7fad487086a..fc3d1867634 100644 --- a/api/tests/opentrons/protocol_api/test_instrument_context.py +++ b/api/tests/opentrons/protocol_api/test_instrument_context.py @@ -10,7 +10,6 @@ from decoy import Decoy from pytest_lazyfixture import lazy_fixture # type: ignore[import-untyped] -from opentrons.config import feature_flags as ff from opentrons.protocol_engine.commands.pipetting_common import LiquidNotFoundError from opentrons.protocol_engine.errors.error_occurrence import ( ProtocolCommandFailedError, @@ -63,7 +62,7 @@ from opentrons_shared_data.liquid_classes.liquid_class_definition import ( LiquidClassSchemaV1, ) -from opentrons_shared_data.robot.types import RobotTypeEnum, RobotType +from opentrons_shared_data.robot.types import RobotType from . import versions_at_or_above, versions_between @@ -1737,7 +1736,6 @@ def test_transfer_liquid_raises_for_invalid_locations( decoy: Decoy, mock_protocol_core: ProtocolCore, subject: InstrumentContext, - mock_feature_flags: None, robot_type: RobotType, minimal_liquid_class_def2: LiquidClassSchemaV1, ) -> None: @@ -1745,9 +1743,6 @@ def test_transfer_liquid_raises_for_invalid_locations( test_liq_class = LiquidClass.create(minimal_liquid_class_def2) mock_well = decoy.mock(cls=Well) decoy.when(mock_protocol_core.robot_type).then_return(robot_type) - decoy.when( - ff.allow_liquid_classes(RobotTypeEnum.robot_literal_to_enum(robot_type)) - ).then_return(True) decoy.when( mock_validation.ensure_valid_flat_wells_list_for_transfer_v2([mock_well]) ).then_raise(ValueError("Oh no")) @@ -1765,7 +1760,6 @@ def test_transfer_liquid_raises_for_unequal_source_and_dest( decoy: Decoy, mock_protocol_core: ProtocolCore, subject: InstrumentContext, - mock_feature_flags: None, robot_type: RobotType, minimal_liquid_class_def2: LiquidClassSchemaV1, ) -> None: @@ -1773,9 +1767,6 @@ def test_transfer_liquid_raises_for_unequal_source_and_dest( test_liq_class = LiquidClass.create(minimal_liquid_class_def2) mock_well = decoy.mock(cls=Well) decoy.when(mock_protocol_core.robot_type).then_return(robot_type) - decoy.when( - ff.allow_liquid_classes(RobotTypeEnum.robot_literal_to_enum(robot_type)) - ).then_return(True) decoy.when( mock_validation.ensure_valid_flat_wells_list_for_transfer_v2(mock_well) ).then_return([mock_well, mock_well]) @@ -1795,7 +1786,6 @@ def test_transfer_liquid_raises_for_non_liquid_handling_locations( decoy: Decoy, mock_protocol_core: ProtocolCore, subject: InstrumentContext, - mock_feature_flags: None, robot_type: RobotType, minimal_liquid_class_def2: LiquidClassSchemaV1, ) -> None: @@ -1803,9 +1793,6 @@ def test_transfer_liquid_raises_for_non_liquid_handling_locations( test_liq_class = LiquidClass.create(minimal_liquid_class_def2) mock_well = decoy.mock(cls=Well) decoy.when(mock_protocol_core.robot_type).then_return(robot_type) - decoy.when( - ff.allow_liquid_classes(RobotTypeEnum.robot_literal_to_enum(robot_type)) - ).then_return(True) decoy.when( mock_validation.ensure_valid_flat_wells_list_for_transfer_v2([mock_well]) ).then_return([mock_well]) @@ -1825,7 +1812,6 @@ def test_transfer_liquid_raises_for_bad_tip_policy( decoy: Decoy, mock_protocol_core: ProtocolCore, subject: InstrumentContext, - mock_feature_flags: None, robot_type: RobotType, minimal_liquid_class_def2: LiquidClassSchemaV1, ) -> None: @@ -1833,9 +1819,6 @@ def test_transfer_liquid_raises_for_bad_tip_policy( test_liq_class = LiquidClass.create(minimal_liquid_class_def2) mock_well = decoy.mock(cls=Well) decoy.when(mock_protocol_core.robot_type).then_return(robot_type) - decoy.when( - ff.allow_liquid_classes(RobotTypeEnum.robot_literal_to_enum(robot_type)) - ).then_return(True) decoy.when( mock_validation.ensure_valid_flat_wells_list_for_transfer_v2([mock_well]) ).then_return([mock_well]) @@ -1857,7 +1840,6 @@ def test_transfer_liquid_raises_for_no_tip( decoy: Decoy, mock_protocol_core: ProtocolCore, subject: InstrumentContext, - mock_feature_flags: None, robot_type: RobotType, minimal_liquid_class_def2: LiquidClassSchemaV1, ) -> None: @@ -1865,9 +1847,6 @@ def test_transfer_liquid_raises_for_no_tip( test_liq_class = LiquidClass.create(minimal_liquid_class_def2) mock_well = decoy.mock(cls=Well) decoy.when(mock_protocol_core.robot_type).then_return(robot_type) - decoy.when( - ff.allow_liquid_classes(RobotTypeEnum.robot_literal_to_enum(robot_type)) - ).then_return(True) decoy.when( mock_validation.ensure_valid_flat_wells_list_for_transfer_v2([mock_well]) ).then_return([mock_well]) @@ -1890,7 +1869,6 @@ def test_transfer_liquid_raises_if_tip_has_liquid( mock_protocol_core: ProtocolCore, mock_instrument_core: InstrumentCore, subject: InstrumentContext, - mock_feature_flags: None, robot_type: RobotType, minimal_liquid_class_def2: LiquidClassSchemaV1, ) -> None: @@ -1903,9 +1881,6 @@ def test_transfer_liquid_raises_if_tip_has_liquid( subject.tip_racks = tip_racks decoy.when(mock_protocol_core.robot_type).then_return(robot_type) - decoy.when( - ff.allow_liquid_classes(RobotTypeEnum.robot_literal_to_enum(robot_type)) - ).then_return(True) decoy.when( mock_validation.ensure_valid_flat_wells_list_for_transfer_v2([mock_well]) ).then_return([mock_well]) @@ -1939,7 +1914,6 @@ def test_transfer_liquid_delegates_to_engine_core( mock_protocol_core: ProtocolCore, mock_instrument_core: InstrumentCore, subject: InstrumentContext, - mock_feature_flags: None, robot_type: RobotType, minimal_liquid_class_def2: LiquidClassSchemaV1, ) -> None: @@ -1953,9 +1927,6 @@ def test_transfer_liquid_delegates_to_engine_core( subject._tip_racks = tip_racks decoy.when(mock_protocol_core.robot_type).then_return(robot_type) - decoy.when( - ff.allow_liquid_classes(RobotTypeEnum.robot_literal_to_enum(robot_type)) - ).then_return(True) decoy.when( mock_validation.ensure_valid_flat_wells_list_for_transfer_v2([mock_well]) ).then_return([mock_well]) @@ -1996,7 +1967,6 @@ def test_distribute_liquid_raises_for_invalid_locations( decoy: Decoy, mock_protocol_core: ProtocolCore, subject: InstrumentContext, - mock_feature_flags: None, robot_type: RobotType, minimal_liquid_class_def2: LiquidClassSchemaV1, ) -> None: @@ -2004,9 +1974,6 @@ def test_distribute_liquid_raises_for_invalid_locations( test_liq_class = LiquidClass.create(minimal_liquid_class_def2) mock_well = decoy.mock(cls=Well) decoy.when(mock_protocol_core.robot_type).then_return(robot_type) - decoy.when( - ff.allow_liquid_classes(RobotTypeEnum.robot_literal_to_enum(robot_type)) - ).then_return(True) decoy.when( mock_validation.ensure_valid_flat_wells_list_for_transfer_v2([[mock_well]]) ).then_raise(ValueError("Oh no")) @@ -2031,7 +1998,6 @@ def test_distribute_liquid_raises_if_more_than_one_source( decoy: Decoy, mock_protocol_core: ProtocolCore, subject: InstrumentContext, - mock_feature_flags: None, robot_type: RobotType, minimal_liquid_class_def2: LiquidClassSchemaV1, ) -> None: @@ -2039,9 +2005,6 @@ def test_distribute_liquid_raises_if_more_than_one_source( test_liq_class = LiquidClass.create(minimal_liquid_class_def2) mock_well = decoy.mock(cls=Well) decoy.when(mock_protocol_core.robot_type).then_return(robot_type) - decoy.when( - ff.allow_liquid_classes(RobotTypeEnum.robot_literal_to_enum(robot_type)) - ).then_return(True) with pytest.raises(ValueError, match="Source should be a single Well"): subject.distribute_liquid( liquid_class=test_liq_class, volume=10, source=[mock_well, mock_well], dest=[mock_well] # type: ignore @@ -2053,7 +2016,6 @@ def test_distribute_liquid_raises_for_non_liquid_handling_locations( decoy: Decoy, mock_protocol_core: ProtocolCore, subject: InstrumentContext, - mock_feature_flags: None, robot_type: RobotType, minimal_liquid_class_def2: LiquidClassSchemaV1, ) -> None: @@ -2061,9 +2023,6 @@ def test_distribute_liquid_raises_for_non_liquid_handling_locations( test_liq_class = LiquidClass.create(minimal_liquid_class_def2) mock_well = decoy.mock(cls=Well) decoy.when(mock_protocol_core.robot_type).then_return(robot_type) - decoy.when( - ff.allow_liquid_classes(RobotTypeEnum.robot_literal_to_enum(robot_type)) - ).then_return(True) decoy.when( mock_validation.ensure_valid_flat_wells_list_for_transfer_v2([mock_well]) ).then_return([mock_well]) @@ -2083,7 +2042,6 @@ def test_distribute_liquid_raises_for_bad_tip_policy( decoy: Decoy, mock_protocol_core: ProtocolCore, subject: InstrumentContext, - mock_feature_flags: None, robot_type: RobotType, minimal_liquid_class_def2: LiquidClassSchemaV1, ) -> None: @@ -2091,9 +2049,6 @@ def test_distribute_liquid_raises_for_bad_tip_policy( test_liq_class = LiquidClass.create(minimal_liquid_class_def2) mock_well = decoy.mock(cls=Well) decoy.when(mock_protocol_core.robot_type).then_return(robot_type) - decoy.when( - ff.allow_liquid_classes(RobotTypeEnum.robot_literal_to_enum(robot_type)) - ).then_return(True) decoy.when( mock_validation.ensure_valid_flat_wells_list_for_transfer_v2([mock_well]) ).then_return([mock_well]) @@ -2115,7 +2070,6 @@ def test_distribute_liquid_raises_for_no_tip( decoy: Decoy, mock_protocol_core: ProtocolCore, subject: InstrumentContext, - mock_feature_flags: None, robot_type: RobotType, minimal_liquid_class_def2: LiquidClassSchemaV1, ) -> None: @@ -2123,9 +2077,6 @@ def test_distribute_liquid_raises_for_no_tip( test_liq_class = LiquidClass.create(minimal_liquid_class_def2) mock_well = decoy.mock(cls=Well) decoy.when(mock_protocol_core.robot_type).then_return(robot_type) - decoy.when( - ff.allow_liquid_classes(RobotTypeEnum.robot_literal_to_enum(robot_type)) - ).then_return(True) decoy.when( mock_validation.ensure_valid_flat_wells_list_for_transfer_v2([mock_well]) ).then_return([mock_well]) @@ -2148,7 +2099,6 @@ def test_distribute_liquid_raises_if_tip_has_liquid( mock_protocol_core: ProtocolCore, mock_instrument_core: InstrumentCore, subject: InstrumentContext, - mock_feature_flags: None, robot_type: RobotType, minimal_liquid_class_def2: LiquidClassSchemaV1, ) -> None: @@ -2161,9 +2111,6 @@ def test_distribute_liquid_raises_if_tip_has_liquid( subject.tip_racks = tip_racks decoy.when(mock_protocol_core.robot_type).then_return(robot_type) - decoy.when( - ff.allow_liquid_classes(RobotTypeEnum.robot_literal_to_enum(robot_type)) - ).then_return(True) decoy.when( mock_validation.ensure_valid_flat_wells_list_for_transfer_v2([mock_well]) ).then_return([mock_well]) @@ -2197,7 +2144,6 @@ def test_distribute_liquid_delegates_to_engine_core( mock_protocol_core: ProtocolCore, mock_instrument_core: InstrumentCore, subject: InstrumentContext, - mock_feature_flags: None, robot_type: RobotType, minimal_liquid_class_def2: LiquidClassSchemaV1, ) -> None: @@ -2211,9 +2157,6 @@ def test_distribute_liquid_delegates_to_engine_core( subject._tip_racks = tip_racks decoy.when(mock_protocol_core.robot_type).then_return(robot_type) - decoy.when( - ff.allow_liquid_classes(RobotTypeEnum.robot_literal_to_enum(robot_type)) - ).then_return(True) decoy.when( mock_validation.ensure_valid_flat_wells_list_for_transfer_v2([mock_well]) ).then_return([mock_well]) @@ -2254,7 +2197,6 @@ def test_consolidate_liquid_raises_for_invalid_locations( decoy: Decoy, mock_protocol_core: ProtocolCore, subject: InstrumentContext, - mock_feature_flags: None, robot_type: RobotType, minimal_liquid_class_def2: LiquidClassSchemaV1, ) -> None: @@ -2262,9 +2204,6 @@ def test_consolidate_liquid_raises_for_invalid_locations( test_liq_class = LiquidClass.create(minimal_liquid_class_def2) mock_well = decoy.mock(cls=Well) decoy.when(mock_protocol_core.robot_type).then_return(robot_type) - decoy.when( - ff.allow_liquid_classes(RobotTypeEnum.robot_literal_to_enum(robot_type)) - ).then_return(True) decoy.when( mock_validation.ensure_valid_flat_wells_list_for_transfer_v2([[mock_well]]) ).then_raise(ValueError("Oh no")) @@ -2289,7 +2228,6 @@ def test_consolidate_liquid_raises_if_more_than_one_destination( decoy: Decoy, mock_protocol_core: ProtocolCore, subject: InstrumentContext, - mock_feature_flags: None, robot_type: RobotType, minimal_liquid_class_def2: LiquidClassSchemaV1, ) -> None: @@ -2297,9 +2235,6 @@ def test_consolidate_liquid_raises_if_more_than_one_destination( test_liq_class = LiquidClass.create(minimal_liquid_class_def2) mock_well = decoy.mock(cls=Well) decoy.when(mock_protocol_core.robot_type).then_return(robot_type) - decoy.when( - ff.allow_liquid_classes(RobotTypeEnum.robot_literal_to_enum(robot_type)) - ).then_return(True) with pytest.raises(ValueError, match="Destination should be a single Well"): subject.consolidate_liquid( liquid_class=test_liq_class, @@ -2314,7 +2249,6 @@ def test_consolidate_liquid_raises_for_non_liquid_handling_locations( decoy: Decoy, mock_protocol_core: ProtocolCore, subject: InstrumentContext, - mock_feature_flags: None, robot_type: RobotType, minimal_liquid_class_def2: LiquidClassSchemaV1, ) -> None: @@ -2322,9 +2256,6 @@ def test_consolidate_liquid_raises_for_non_liquid_handling_locations( test_liq_class = LiquidClass.create(minimal_liquid_class_def2) mock_well = decoy.mock(cls=Well) decoy.when(mock_protocol_core.robot_type).then_return(robot_type) - decoy.when( - ff.allow_liquid_classes(RobotTypeEnum.robot_literal_to_enum(robot_type)) - ).then_return(True) decoy.when( mock_validation.ensure_valid_flat_wells_list_for_transfer_v2([mock_well]) ).then_return([mock_well]) @@ -2344,7 +2275,6 @@ def test_consolidate_liquid_raises_for_bad_tip_policy( decoy: Decoy, mock_protocol_core: ProtocolCore, subject: InstrumentContext, - mock_feature_flags: None, robot_type: RobotType, minimal_liquid_class_def2: LiquidClassSchemaV1, ) -> None: @@ -2352,9 +2282,6 @@ def test_consolidate_liquid_raises_for_bad_tip_policy( test_liq_class = LiquidClass.create(minimal_liquid_class_def2) mock_well = decoy.mock(cls=Well) decoy.when(mock_protocol_core.robot_type).then_return(robot_type) - decoy.when( - ff.allow_liquid_classes(RobotTypeEnum.robot_literal_to_enum(robot_type)) - ).then_return(True) decoy.when( mock_validation.ensure_valid_flat_wells_list_for_transfer_v2([mock_well]) ).then_return([mock_well]) @@ -2376,7 +2303,6 @@ def test_consolidate_liquid_raises_for_no_tip( decoy: Decoy, mock_protocol_core: ProtocolCore, subject: InstrumentContext, - mock_feature_flags: None, robot_type: RobotType, minimal_liquid_class_def2: LiquidClassSchemaV1, ) -> None: @@ -2384,9 +2310,6 @@ def test_consolidate_liquid_raises_for_no_tip( test_liq_class = LiquidClass.create(minimal_liquid_class_def2) mock_well = decoy.mock(cls=Well) decoy.when(mock_protocol_core.robot_type).then_return(robot_type) - decoy.when( - ff.allow_liquid_classes(RobotTypeEnum.robot_literal_to_enum(robot_type)) - ).then_return(True) decoy.when( mock_validation.ensure_valid_flat_wells_list_for_transfer_v2([mock_well]) ).then_return([mock_well]) @@ -2409,7 +2332,6 @@ def test_consolidate_liquid_raises_if_tip_has_liquid( mock_protocol_core: ProtocolCore, mock_instrument_core: InstrumentCore, subject: InstrumentContext, - mock_feature_flags: None, robot_type: RobotType, minimal_liquid_class_def2: LiquidClassSchemaV1, ) -> None: @@ -2422,9 +2344,6 @@ def test_consolidate_liquid_raises_if_tip_has_liquid( subject.tip_racks = tip_racks decoy.when(mock_protocol_core.robot_type).then_return(robot_type) - decoy.when( - ff.allow_liquid_classes(RobotTypeEnum.robot_literal_to_enum(robot_type)) - ).then_return(True) decoy.when( mock_validation.ensure_valid_flat_wells_list_for_transfer_v2([mock_well]) ).then_return([mock_well]) @@ -2458,7 +2377,6 @@ def test_consolidate_liquid_delegates_to_engine_core( mock_protocol_core: ProtocolCore, mock_instrument_core: InstrumentCore, subject: InstrumentContext, - mock_feature_flags: None, robot_type: RobotType, minimal_liquid_class_def2: LiquidClassSchemaV1, ) -> None: @@ -2472,9 +2390,6 @@ def test_consolidate_liquid_delegates_to_engine_core( subject._tip_racks = tip_racks decoy.when(mock_protocol_core.robot_type).then_return(robot_type) - decoy.when( - ff.allow_liquid_classes(RobotTypeEnum.robot_literal_to_enum(robot_type)) - ).then_return(True) decoy.when( mock_validation.ensure_valid_flat_wells_list_for_transfer_v2([mock_well]) ).then_return([mock_well]) diff --git a/api/tests/opentrons/protocol_api/test_protocol_context.py b/api/tests/opentrons/protocol_api/test_protocol_context.py index 8e944d62cac..ebe6734a539 100644 --- a/api/tests/opentrons/protocol_api/test_protocol_context.py +++ b/api/tests/opentrons/protocol_api/test_protocol_context.py @@ -7,11 +7,10 @@ from opentrons_shared_data.pipette.types import PipetteNameType from opentrons_shared_data.labware.types import LabwareDefinition as LabwareDefDict -from opentrons_shared_data.robot.types import RobotTypeEnum, RobotType +from opentrons_shared_data.robot.types import RobotType from opentrons.protocol_api._liquid import LiquidClass from opentrons.types import Mount, DeckSlotName, StagingSlotName -from opentrons.config import feature_flags as ff from opentrons.protocol_api import OFF_DECK from opentrons.legacy_broker import LegacyBroker from opentrons.hardware_control.modules.types import ( @@ -1456,7 +1455,6 @@ def test_define_liquid_class( mock_core: ProtocolCore, subject: ProtocolContext, robot_type: RobotType, - mock_feature_flags: None, ) -> None: """It should create the liquid class definition.""" expected_liquid_class = LiquidClass( @@ -1466,14 +1464,11 @@ def test_define_liquid_class( expected_liquid_class ) decoy.when(mock_core.robot_type).then_return(robot_type) - decoy.when( - ff.allow_liquid_classes(RobotTypeEnum.robot_literal_to_enum(robot_type)) - ).then_return(True) assert subject.define_liquid_class("volatile_90") == expected_liquid_class def test_bundled_data( - decoy: Decoy, mock_core_map: LoadedCoreMap, mock_deck: Deck, mock_core: ProtocolCore + mock_core_map: LoadedCoreMap, mock_deck: Deck, mock_core: ProtocolCore ) -> None: """It should return bundled data.""" subject = ProtocolContext( diff --git a/api/tests/opentrons/protocol_api_integration/test_liquid_classes.py b/api/tests/opentrons/protocol_api_integration/test_liquid_classes.py index 54112941c4c..83b53f01e1a 100644 --- a/api/tests/opentrons/protocol_api_integration/test_liquid_classes.py +++ b/api/tests/opentrons/protocol_api_integration/test_liquid_classes.py @@ -1,23 +1,17 @@ """Tests for the APIs around liquid classes.""" import pytest -from decoy import Decoy -from opentrons_shared_data.robot.types import RobotTypeEnum from opentrons.protocol_api import ProtocolContext -from opentrons.config import feature_flags as ff @pytest.mark.ot3_only @pytest.mark.parametrize( - "simulated_protocol_context", [("2.20", "Flex")], indirect=True + "simulated_protocol_context", [("2.23", "Flex")], indirect=True ) def test_liquid_class_creation_and_property_fetching( - decoy: Decoy, - mock_feature_flags: None, simulated_protocol_context: ProtocolContext, ) -> None: """It should create the liquid class and provide access to its properties.""" - decoy.when(ff.allow_liquid_classes(RobotTypeEnum.FLEX)).then_return(True) pipette_load_name = "flex_8channel_50" simulated_protocol_context.load_instrument(pipette_load_name, mount="left") tiprack = simulated_protocol_context.load_labware( @@ -51,12 +45,3 @@ def test_liquid_class_creation_and_property_fetching( with pytest.raises(ValueError, match="Liquid class definition not found"): simulated_protocol_context.define_liquid_class("non-existent-liquid") - - -@pytest.mark.parametrize( - "simulated_protocol_context", [("2.20", "OT-2")], indirect=True -) -def test_liquid_class_feature_flag(simulated_protocol_context: ProtocolContext) -> None: - """It should raise a not implemented error without the allowLiquidClass flag set.""" - with pytest.raises(NotImplementedError): - simulated_protocol_context.define_liquid_class("water") diff --git a/api/tests/opentrons/protocol_api_integration/test_transfer_with_liquid_classes.py b/api/tests/opentrons/protocol_api_integration/test_transfer_with_liquid_classes.py index 24a5efc0dab..ba3d3facd6a 100644 --- a/api/tests/opentrons/protocol_api_integration/test_transfer_with_liquid_classes.py +++ b/api/tests/opentrons/protocol_api_integration/test_transfer_with_liquid_classes.py @@ -1,11 +1,8 @@ """Tests for the transfer APIs using liquid classes.""" import pytest import mock -from decoy import Decoy -from opentrons_shared_data.robot.types import RobotTypeEnum from opentrons.protocol_api import ProtocolContext -from opentrons.config import feature_flags as ff from opentrons.protocol_api.core.engine import InstrumentCore from opentrons.protocol_api.core.engine.transfer_components_executor import ( TransferType, @@ -15,10 +12,10 @@ @pytest.mark.ot3_only @pytest.mark.parametrize( - "simulated_protocol_context", [("2.20", "Flex")], indirect=True + "simulated_protocol_context", [("2.23", "Flex")], indirect=True ) def test_water_transfer_with_volume_more_than_tip_max( - decoy: Decoy, mock_feature_flags: None, simulated_protocol_context: ProtocolContext + simulated_protocol_context: ProtocolContext, ) -> None: """It should run the transfer steps without any errors. @@ -26,7 +23,6 @@ def test_water_transfer_with_volume_more_than_tip_max( analyze successfully. It doesn't check whether the steps are as expected. That will be covered in analysis snapshot tests. """ - decoy.when(ff.allow_liquid_classes(RobotTypeEnum.FLEX)).then_return(True) trash = simulated_protocol_context.load_trash_bin("A3") tiprack = simulated_protocol_context.load_labware( "opentrons_flex_96_tiprack_50ul", "D1" @@ -88,10 +84,10 @@ def test_water_transfer_with_volume_more_than_tip_max( @pytest.mark.ot3_only @pytest.mark.parametrize( - "simulated_protocol_context", [("2.20", "Flex")], indirect=True + "simulated_protocol_context", [("2.23", "Flex")], indirect=True ) def test_order_of_water_transfer_steps( - decoy: Decoy, mock_feature_flags: None, simulated_protocol_context: ProtocolContext + simulated_protocol_context: ProtocolContext, ) -> None: """It should run the transfer steps without any errors. @@ -99,7 +95,6 @@ def test_order_of_water_transfer_steps( analyze successfully. It doesn't check whether the steps are as expected. That will be covered in analysis snapshot tests. """ - decoy.when(ff.allow_liquid_classes(RobotTypeEnum.FLEX)).then_return(True) trash = simulated_protocol_context.load_trash_bin("A3") tiprack = simulated_protocol_context.load_labware( "opentrons_flex_96_tiprack_50ul", "D1" @@ -239,10 +234,10 @@ def test_order_of_water_transfer_steps( @pytest.mark.ot3_only @pytest.mark.parametrize( - "simulated_protocol_context", [("2.20", "Flex")], indirect=True + "simulated_protocol_context", [("2.23", "Flex")], indirect=True ) def test_order_of_water_transfer_steps_with_no_new_tips( - decoy: Decoy, mock_feature_flags: None, simulated_protocol_context: ProtocolContext + simulated_protocol_context: ProtocolContext, ) -> None: """It should run the transfer steps without any errors. @@ -250,7 +245,6 @@ def test_order_of_water_transfer_steps_with_no_new_tips( analyze successfully. It doesn't check whether the steps are as expected. That will be covered in analysis snapshot tests. """ - decoy.when(ff.allow_liquid_classes(RobotTypeEnum.FLEX)).then_return(True) trash = simulated_protocol_context.load_trash_bin("A3") tiprack = simulated_protocol_context.load_labware( "opentrons_flex_96_tiprack_50ul", "D1" From 8004d5948815e8202bdfbf4b27048b08c8151bb9 Mon Sep 17 00:00:00 2001 From: Sarah Breen Date: Wed, 29 Jan 2025 15:49:09 -0500 Subject: [PATCH 042/150] feat(app): Stub out flex stacker in deck config (#17381) Fix EXEC-1087 --- api-client/src/modules/api-types.ts | 1 + .../AddFixtureModal.tsx | 90 +++++++++++++---- .../DeckConfigurator/FlexStackerFixture.tsx | 96 +++++++++++++++++++ .../hardware-sim/DeckConfigurator/index.tsx | 29 +++++- shared-data/js/constants.ts | 10 ++ shared-data/js/fixtures.ts | 26 ++++- 6 files changed, 230 insertions(+), 22 deletions(-) create mode 100644 components/src/hardware-sim/DeckConfigurator/FlexStackerFixture.tsx diff --git a/api-client/src/modules/api-types.ts b/api-client/src/modules/api-types.ts index 17c3bd53fcf..d4755b69f57 100644 --- a/api-client/src/modules/api-types.ts +++ b/api-client/src/modules/api-types.ts @@ -10,6 +10,7 @@ interface PhysicalPort { port: number hub: boolean portGroup: PortGroup + hubPort?: number } type ModuleOffsetSource = diff --git a/app/src/organisms/DeviceDetailsDeckConfiguration/AddFixtureModal.tsx b/app/src/organisms/DeviceDetailsDeckConfiguration/AddFixtureModal.tsx index b4b8f462d7f..f6d633737cf 100644 --- a/app/src/organisms/DeviceDetailsDeckConfiguration/AddFixtureModal.tsx +++ b/app/src/organisms/DeviceDetailsDeckConfiguration/AddFixtureModal.tsx @@ -47,6 +47,10 @@ import { TRASH_BIN_ADAPTER_FIXTURE, WASTE_CHUTE_CUTOUT, WASTE_CHUTE_FIXTURES, + FLEX_STACKER_MODULE_V1, + FLEX_STACKER_V1_FIXTURE, + FLEX_STACKER_WITH_WASTE_CHUTE_ADAPTER_COVERED_FIXTURE, + FLEX_STACKER_WTIH_WASTE_CHUTE_ADAPTER_NO_COVER_FIXTURE, } from '@opentrons/shared-data' import { ODD_FOCUS_VISIBLE } from '/app/atoms/buttons/constants' @@ -249,6 +253,52 @@ export function AddFixtureModal({ ] } } + if ( + cutoutId === 'cutoutD3' && + unconfiguredMods.some(m => m.moduleModel === FLEX_STACKER_MODULE_V1) + ) { + const unconfiguredFlexStackers: CutoutConfig[][] = [] + unconfiguredMods + .filter(mod => mod.moduleModel === FLEX_STACKER_MODULE_V1) + .forEach(mod => { + unconfiguredFlexStackers.push([ + { + cutoutId, + cutoutFixtureId: FLEX_STACKER_V1_FIXTURE, + opentronsModuleSerialNumber: mod.serialNumber, + }, + ]) + unconfiguredFlexStackers.push([ + { + cutoutId, + cutoutFixtureId: FLEX_STACKER_WITH_WASTE_CHUTE_ADAPTER_COVERED_FIXTURE, + opentronsModuleSerialNumber: mod.serialNumber, + }, + ]) + unconfiguredFlexStackers.push([ + { + cutoutId, + cutoutFixtureId: FLEX_STACKER_WTIH_WASTE_CHUTE_ADAPTER_NO_COVER_FIXTURE, + opentronsModuleSerialNumber: mod.serialNumber, + }, + ]) + }) + availableOptions.push(...unconfiguredFlexStackers) + } else if ( + STAGING_AREA_CUTOUTS.includes(cutoutId) && + unconfiguredMods.some(m => m.moduleModel === FLEX_STACKER_MODULE_V1) + ) { + const unconfiguredFlexStackers = unconfiguredMods + .filter(mod => mod.moduleModel === FLEX_STACKER_MODULE_V1) + .map(mod => [ + { + cutoutId, + cutoutFixtureId: FLEX_STACKER_V1_FIXTURE, + opentronsModuleSerialNumber: mod.serialNumber, + }, + ]) + availableOptions = [...availableOptions, ...unconfiguredFlexStackers] + } } else if (optionStage === 'wasteChuteOptions') { availableOptions = WASTE_CHUTE_FIXTURES.map(fixture => [ { @@ -315,22 +365,30 @@ export function AddFixtureModal({ closeModal() } - const fixtureOptions = availableOptions.map(cutoutConfigs => ( - m.serialNumber === cutoutConfigs[0].opentronsModuleSerialNumber - )?.usbPort.port - )} - buttonText={t('add')} - onClickHandler={() => { - handleAddFixture(cutoutConfigs) - }} - isOnDevice={isOnDevice} - /> - )) + const fixtureOptions = availableOptions.map(cutoutConfigs => { + const usbPort = (modulesData?.data ?? []).find( + m => m.serialNumber === cutoutConfigs[0].opentronsModuleSerialNumber + )?.usbPort + const portDisplay = + usbPort?.hubPort != null + ? `${usbPort.port}.${usbPort.hubPort}` + : usbPort?.port + + return ( + { + handleAddFixture(cutoutConfigs) + }} + isOnDevice={isOnDevice} + /> + ) + }) return ( <> diff --git a/components/src/hardware-sim/DeckConfigurator/FlexStackerFixture.tsx b/components/src/hardware-sim/DeckConfigurator/FlexStackerFixture.tsx new file mode 100644 index 00000000000..55866fe1c8d --- /dev/null +++ b/components/src/hardware-sim/DeckConfigurator/FlexStackerFixture.tsx @@ -0,0 +1,96 @@ +import { Icon } from '../../icons' +import { Btn, Text } from '../../primitives' +import { TYPOGRAPHY } from '../../ui-style-constants' +import { COLORS } from '../../helix-design-system' +import { RobotCoordsForeignObject } from '../Deck/RobotCoordsForeignObject' +import { + COLUMN_3_X_ADJUSTMENT, + CONFIG_STYLE_EDITABLE, + CONFIG_STYLE_READ_ONLY, + FIXTURE_HEIGHT, + STAGING_AREA_FIXTURE_WIDTH, + Y_ADJUSTMENT, + CONFIG_STYLE_SELECTED, +} from './constants' + +import type { + CutoutFixtureId, + CutoutId, + DeckDefinition, +} from '@opentrons/shared-data' + +interface FlexStackerFixtureProps { + deckDefinition: DeckDefinition + fixtureLocation: CutoutId + cutoutFixtureId: CutoutFixtureId + hasWasteChute: boolean + handleClickRemove?: ( + fixtureLocation: CutoutId, + cutoutFixtureId: CutoutFixtureId + ) => void + selected?: boolean +} + +const FLEX_STACKER_FIXTURE_DISPLAY_NAME = 'Stacker' +const FLEX_STACKER_WASTE_CHUTE_DISPLAY_NAME = 'Stacker + Waste chute' + +export function FlexStackerFixture( + props: FlexStackerFixtureProps +): JSX.Element { + const { + deckDefinition, + handleClickRemove, + fixtureLocation, + cutoutFixtureId, + hasWasteChute, + selected = false, + } = props + + const cutoutDef = deckDefinition.locations.cutouts.find( + cutout => cutout.id === fixtureLocation + ) + + /** + * deck definition cutout position is the position of the single slot located within that cutout + * so, to get the position of the cutout itself we must add an adjustment to the slot position + * the adjustment for x is different for right side/left side + */ + const [xSlotPosition = 0, ySlotPosition = 0] = cutoutDef?.position ?? [] + + const x = xSlotPosition + COLUMN_3_X_ADJUSTMENT + + const y = ySlotPosition + Y_ADJUSTMENT + + const editableStyle = selected ? CONFIG_STYLE_SELECTED : CONFIG_STYLE_EDITABLE + return ( + + { + handleClickRemove(fixtureLocation, cutoutFixtureId) + } + : () => {} + } + > + + {hasWasteChute + ? FLEX_STACKER_WASTE_CHUTE_DISPLAY_NAME + : FLEX_STACKER_FIXTURE_DISPLAY_NAME} + + {handleClickRemove != null ? ( + + ) : null} + + + ) +} diff --git a/components/src/hardware-sim/DeckConfigurator/index.tsx b/components/src/hardware-sim/DeckConfigurator/index.tsx index 4a90a182cee..27a6ff46886 100644 --- a/components/src/hardware-sim/DeckConfigurator/index.tsx +++ b/components/src/hardware-sim/DeckConfigurator/index.tsx @@ -11,6 +11,8 @@ import { TEMPERATURE_MODULE_V2_FIXTURE, MAGNETIC_BLOCK_V1_FIXTURE, ABSORBANCE_READER_V1_FIXTURE, + FLEX_STACKER_V1_FIXTURE, + FLEX_STACKER_FIXTURES, STAGING_AREA_SLOT_WITH_MAGNETIC_BLOCK_V1_FIXTURE, THERMOCYCLER_MODULE_CUTOUTS, } from '@opentrons/shared-data' @@ -24,6 +26,12 @@ import { StagingAreaConfigFixture } from './StagingAreaConfigFixture' import { TrashBinConfigFixture } from './TrashBinConfigFixture' import { WasteChuteConfigFixture } from './WasteChuteConfigFixture' import { StaticFixture } from './StaticFixture' +import { TemperatureModuleFixture } from './TemperatureModuleFixture' +import { HeaterShakerFixture } from './HeaterShakerFixture' +import { MagneticBlockFixture } from './MagneticBlockFixture' +import { ThermocyclerFixture } from './ThermocyclerFixture' +import { AbsorbanceReaderFixture } from './AbsorbanceReaderFixture' +import { FlexStackerFixture } from './FlexStackerFixture' import type { ReactNode } from 'react' import type { @@ -31,11 +39,6 @@ import type { CutoutId, DeckConfiguration, } from '@opentrons/shared-data' -import { TemperatureModuleFixture } from './TemperatureModuleFixture' -import { HeaterShakerFixture } from './HeaterShakerFixture' -import { MagneticBlockFixture } from './MagneticBlockFixture' -import { ThermocyclerFixture } from './ThermocyclerFixture' -import { AbsorbanceReaderFixture } from './AbsorbanceReaderFixture' export * from './constants' @@ -116,6 +119,9 @@ export function DeckConfigurator(props: DeckConfiguratorProps): JSX.Element { ({ cutoutFixtureId }) => cutoutFixtureId === STAGING_AREA_SLOT_WITH_MAGNETIC_BLOCK_V1_FIXTURE ) + const flexStackerFixtures = deckConfig.filter(({ cutoutFixtureId }) => + FLEX_STACKER_FIXTURES.includes(cutoutFixtureId) + ) return ( ))} + {flexStackerFixtures.map(({ cutoutId, cutoutFixtureId }) => ( + + ))} {additionalStaticFixtures?.map(staticFixture => ( Date: Wed, 29 Jan 2025 15:57:21 -0500 Subject: [PATCH 043/150] fix(shared-data): add D3 as provided addressable area to the flexStackerModuleV1WithWasteChuteRightAdapterCovered fixture. (#17376) - add a short-term fix for the addressable chute+stacker fixture to enable ABR and testing. --- shared-data/deck/definitions/5/ot3_standard.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/shared-data/deck/definitions/5/ot3_standard.json b/shared-data/deck/definitions/5/ot3_standard.json index fda49c38f2d..f317b596ad1 100644 --- a/shared-data/deck/definitions/5/ot3_standard.json +++ b/shared-data/deck/definitions/5/ot3_standard.json @@ -1026,7 +1026,8 @@ "cutoutD3": [ "1ChannelWasteChute", "8ChannelWasteChute", - "flexStackerModuleV1D4" + "flexStackerModuleV1D4", + "D3" ] }, "fixtureGroup": {}, @@ -1043,7 +1044,8 @@ "8ChannelWasteChute", "96ChannelWasteChute", "gripperWasteChute", - "flexStackerModuleV1D4" + "flexStackerModuleV1D4", + "D3" ] }, "fixtureGroup": {}, From 2451026c9f9aca43115309c8168c81d1be429ee7 Mon Sep 17 00:00:00 2001 From: Joe Wojak Date: Wed, 29 Jan 2025 16:21:37 -0500 Subject: [PATCH 044/150] docs(api): Update listed pipette flow rates (#17367) # Overview The API docs section on [default pipette flow rates](https://docs.opentrons.com/v2/pipettes/characteristics.html#pipette-flow-rates) shows inaccurate flow rates. The parent page/file is `characteristics.rst`. This updates that table based on the flow rate data provided in these 2 JIRA issues: - RTC-667 - RESC-375 Both include a list of default flow rates. Excluding 20 uL tips because those are not available yet. ## Test Plan and Hands on Testing Check the updated table to make sure it reflects the correct default flow rates. ## Changelog Change updates and revised the table that lists flow rates for various pipette and tip combinations. Minor text changes in section text. ## Review requests See RTC-667 for a list of flow rates. I think I've got these reproduced correctly. ## Risk assessment Low. Docs change only. Minor table and text change in a single section. --- api/docs/v2/pipettes/characteristics.rst | 49 +++++++++++++----------- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/api/docs/v2/pipettes/characteristics.rst b/api/docs/v2/pipettes/characteristics.rst index 9203dd81816..00971d71832 100644 --- a/api/docs/v2/pipettes/characteristics.rst +++ b/api/docs/v2/pipettes/characteristics.rst @@ -184,29 +184,32 @@ These flow rates will remain in effect until you change the ``flow_rate`` attrib Flex Pipette Flow Rates ----------------------- -Flex pipette flow rates depend on pipette volume and tip capacity. Each pipette–tip combination has a default flow rate for aspirating, dispensing, and blowing out liquid. When using a 50 µL pipette, you should only use 50 µL tips. - -.. list-table:: - :header-rows: 1 - - * - Pipette Model - - Tip Capacity (µL) - - Flow Rate (µL/s) - * - 50 µL (1- and 8-channel) - - 50 - - 57 - * - 1000 µL (1-, 8-, and 96-channel) - - 50 - - 478 - * - 1000 µL (1-, 8-, and 96-channel) - - 200 - - 716 - * - 1000 µL (1-, 8-, and 96-channel) - - 1000 - - 716 - - -Additionally, all Flex pipettes have a well bottom clearance of 1 mm for aspirate and dispense actions. +The following table provides data on the default aspirate, dispense, and blowout flow rates (in µL/s) for Flex pipettes. Default flow rates for each pipette-tip combination are the same across all three actions. + +.. Excludes low-vol 96 channel. Not yet released. + ++-----------------------------+-------------------+------------------------+ +| Pipette Model | Tip Capacity (µL) | Default Flow Rate (µL) | ++=============================+===================+========================+ +| 1- and 8-channel (50 µL) | 50 | 35 | ++-----------------------------+-------------------+------------------------+ +| 1- and 8-channel (1000 µL) | 50 | 478 | ++ +-------------------+------------------------+ +| | 200 | 716 | ++ +-------------------+------------------------+ +| | 1000 | 716 | ++-----------------------------+-------------------+------------------------+ +| 96-channel (5-1000 µL) | 50 | 6 | ++ +-------------------+------------------------+ +| | 200 | 80 | ++ +-------------------+------------------------+ +| | 1000 | 160 | ++-----------------------------+-------------------+------------------------+ + +Additionally: + +- When using a 50 µL pipette, you should only use 50 µL tips. +- All Flex pipettes have a well bottom clearance of 1 mm for aspirate and dispense actions. .. _ot2-flow-rates: From ac70ce08b43d0601604d7c6817fdf3915fb305b9 Mon Sep 17 00:00:00 2001 From: Brayan Almonte Date: Thu, 30 Jan 2025 10:44:29 -0500 Subject: [PATCH 045/150] fix(api): tune store_labware motion parameters and current to increase the z torque. (#17382) Motion parameters need to be adjusted to account for tiprack weight by decreasing the speed when moving on the z-axis when storing labware. This pull request decreases the z speed to half the move speed and also decreases the current back down to 1.5mAmps since the lower speeds increase the torque. --- api/src/opentrons/drivers/flex_stacker/driver.py | 4 ++-- .../hardware_control/modules/flex_stacker.py | 13 +++++++++---- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/api/src/opentrons/drivers/flex_stacker/driver.py b/api/src/opentrons/drivers/flex_stacker/driver.py index 270cd759f90..e96a3a96095 100644 --- a/api/src/opentrons/drivers/flex_stacker/driver.py +++ b/api/src/opentrons/drivers/flex_stacker/driver.py @@ -67,14 +67,14 @@ max_speed=10.0, acceleration=100.0, max_speed_discont=40, - current=1.8, + current=1.5, ), "move": MoveParams( StackerAxis.Z, max_speed=200.0, acceleration=500.0, max_speed_discont=40, - current=1.8, + current=1.5, ), }, StackerAxis.L: { diff --git a/api/src/opentrons/hardware_control/modules/flex_stacker.py b/api/src/opentrons/hardware_control/modules/flex_stacker.py index 136ac1d18bc..3c12673a1a5 100644 --- a/api/src/opentrons/hardware_control/modules/flex_stacker.py +++ b/api/src/opentrons/hardware_control/modules/flex_stacker.py @@ -273,7 +273,9 @@ async def move_axis( await self.reset_stall_detected() motion_params = STACKER_MOTION_CONFIG[axis]["move"] await self._driver.set_run_current(axis, current or motion_params.current or 0) - if any([speed, acceleration]): + if any([speed, acceleration, current]): + motion_params = self._reader.motion_params[axis] + motion_params.current = current or motion_params.current motion_params.max_speed = speed or motion_params.max_speed motion_params.acceleration = acceleration or motion_params.acceleration distance = direction.distance(distance) @@ -391,8 +393,11 @@ async def store_labware(self, labware_height: float) -> bool: # Transfer await self.open_latch() - await self.move_axis(StackerAxis.Z, Direction.EXTEND, (labware_height / 2)) - await self.home_axis(StackerAxis.Z, Direction.EXTEND) + z_speed = (STACKER_MOTION_CONFIG[StackerAxis.Z]["move"].max_speed or 0) / 2 + await self.move_axis( + StackerAxis.Z, Direction.EXTEND, (labware_height / 2), z_speed + ) + await self.home_axis(StackerAxis.Z, Direction.EXTEND, z_speed) await self.close_latch() # Move Z then X axis @@ -448,7 +453,7 @@ async def get_limit_switch_status(self) -> None: async def get_motion_parameters(self) -> None: """Get the motion parameters used by the axis motors.""" - self.move_params = { + self.motion_params = { axis: await self._driver.get_motion_params(axis) for axis in StackerAxis } From b1684cb214be69f1d6ad786fd1665818af62c683 Mon Sep 17 00:00:00 2001 From: Jethary Alcid <66035149+jerader@users.noreply.github.com> Date: Thu, 30 Jan 2025 12:32:58 -0500 Subject: [PATCH 046/150] refactor(step-generation, protocol-designer, app): touchTip to emit from top of well origin (#17375) closes AUTH-1378 Previously, `touchTip` would occur from the bottom of the well, which is a bit confusing since users in python and intuitively would want to start with origin from the top. This PR migrates all touch tip fields and inverses the logic. Here is the summary of the changes: 1. `aspirate_touchTipMmFromBottom` is now `aspirate_touchTipMmFromTop` in `moveLiquid` form data 2. `dispense_touchTipMmFromBottom` is now `dispense_touchTipMmFromTop` in `moveLiquid` form data 3. `mix_touchTipMmFromBottom` is now `mix_touchTipMmFromTop` in `mix` form data 4. the modal in the form is updated to grab the values starting from the top of the well, going into the well the values are negative. This updated in PD **AND** Quick transfer 5. step-generation now emits `touchTip` to be origin from the top of the well with the new z-index 6. old protocols now go through a `8_5_0` migration to migrate their form data z-index fields to be origin from the top of the well --- .../localization/en/quick_transfer.json | 4 +- .../TouchTip.tsx | 29 +- .../AirGap.test.tsx | 8 +- .../Delay.test.tsx | 6 +- .../FlowRate.test.tsx | 2 +- .../Mix.test.tsx | 4 +- .../PipettePath.test.tsx | 2 +- .../TipPosition.test.tsx | 4 +- .../TouchTip.test.tsx | 48 +- .../__tests__/VolumeEntry.test.tsx | 2 +- .../utils/generateQuickTransferArgs.ts | 21 +- .../cypress/e2e/migrations.cy.ts | 16 +- .../protocol/8/doItAllV3MigratedToV8.json | 473 ++++-- .../protocol/8/doItAllV4MigratedToV8.json | 264 ++- .../protocol/8/doItAllV7MigratedToV8.json | 869 +++++++--- .../fixtures/protocol/8/doItAllV8.json | 533 ++++-- .../protocol/8/example_1_1_0MigratedToV8.json | 1495 ++++++++++++----- .../8/newAdvancedSettingsAndMultiTemp.json | 180 +- .../8/ninetySixChannelFullAndColumn.json | 332 ++-- .../8/thermocyclerOnOt2V7MigratedToV8.json | 167 +- .../src/assets/localization/en/modal.json | 6 +- .../localization/en/protocol_steps.json | 2 +- .../src/assets/localization/en/shared.json | 6 +- .../src/assets/localization/en/tooltip.json | 6 +- protocol-designer/src/form-types.ts | 24 +- .../src/load-file/migration/8_5_0.ts | 164 ++ .../src/load-file/migration/index.ts | 3 + .../TipPositionModal/ZTipPositionModal.tsx | 25 +- .../src/organisms/TipPositionModal/index.tsx | 3 +- .../src/organisms/TipPositionModal/utils.tsx | 25 +- .../BatchEditToolbox/BatchEditMixTools.tsx | 4 +- .../StepForm/PipetteFields/PositionField.tsx | 5 +- .../StepForm/StepTools/MixTools/index.tsx | 4 +- .../StepTools/MoveLiquidTools/index.tsx | 4 +- .../Designer/ProtocolSteps/StepForm/utils.ts | 6 +- .../test/createPresavedStepForm.test.ts | 6 +- .../formLevel/getDefaultsForStepType.ts | 6 +- .../dependentFieldsUpdateMix.ts | 2 +- .../dependentFieldsUpdateMoveLiquid.ts | 4 +- .../handleFormChange/test/mix.test.ts | 6 +- .../formLevel/stepFormToArgs/getDelayData.ts | 5 +- .../formLevel/stepFormToArgs/mixFormToArgs.ts | 10 +- .../stepFormToArgs/moveLiquidFormToArgs.ts | 22 +- .../stepFormToArgs/test/mixFormToArgs.test.ts | 10 +- .../test/moveLiquidFormToArgs.test.ts | 16 +- .../test/getDefaultsForStepType.test.ts | 6 +- .../steplist/test/generateSubsteps.test.ts | 2 +- .../generateRobotStateTimeline.test.ts | 10 +- .../src/ui/steps/__fixtures__/index.ts | 6 +- .../src/ui/steps/test/selectors.test.ts | 32 +- protocol-designer/src/ui/steps/utils.ts | 6 +- .../src/__tests__/consolidate.test.ts | 74 +- .../src/__tests__/distribute.test.ts | 80 +- .../src/__tests__/transfer.test.ts | 66 +- .../commandCreators/compound/consolidate.ts | 9 +- .../commandCreators/compound/distribute.ts | 8 +- .../src/commandCreators/compound/mix.ts | 4 +- .../src/commandCreators/compound/transfer.ts | 8 +- .../src/fixtures/commandFixtures.ts | 18 +- step-generation/src/types.ts | 6 +- 60 files changed, 3644 insertions(+), 1524 deletions(-) create mode 100644 protocol-designer/src/load-file/migration/8_5_0.ts diff --git a/app/src/assets/localization/en/quick_transfer.json b/app/src/assets/localization/en/quick_transfer.json index 2ebdb5699b8..c448de06a72 100644 --- a/app/src/assets/localization/en/quick_transfer.json +++ b/app/src/assets/localization/en/quick_transfer.json @@ -132,10 +132,10 @@ "touch_tip": "Touch tip", "touch_tip_after_aspirating": "Touch tip after aspirating", "touch_tip_before_dispensing": "Touch tip before dispensing", - "touch_tip_position_mm": "Touch tip position from bottom of well (mm)", + "touch_tip_position_mm": "Touch tip position from top of well (mm)", "touch_tip_value": "{{position}} mm from bottom", "use_deck_slots": "Quick transfers use deck slots B2-D2. These slots hold a tip rack, a source labware, and a destination labware.Make sure that your deck configuration is up to date to avoid collisions.", - "value_out_of_range": "Value must be between {{min}}-{{max}}", + "value_out_of_range": "Value must be between {{min}} to {{max}}", "too_many_pins_body": "Remove a quick transfer in order to add more transfers to your pinned list.", "too_many_pins_header": "You've hit your max!", "transfer_analysis_failed": "quick transfer analysis failed", diff --git a/app/src/organisms/ODD/QuickTransferFlow/QuickTransferAdvancedSettings/TouchTip.tsx b/app/src/organisms/ODD/QuickTransferFlow/QuickTransferAdvancedSettings/TouchTip.tsx index 41780d65181..4133c9cbec7 100644 --- a/app/src/organisms/ODD/QuickTransferFlow/QuickTransferAdvancedSettings/TouchTip.tsx +++ b/app/src/organisms/ODD/QuickTransferFlow/QuickTransferAdvancedSettings/TouchTip.tsx @@ -47,10 +47,12 @@ export function TouchTip(props: TouchTipProps): JSX.Element { : state.touchTipDispense != null ) const [currentStep, setCurrentStep] = useState(1) - const [position, setPosition] = useState( - kind === 'aspirate' - ? state.touchTipAspirate ?? null - : state.touchTipDispense ?? null + const touchTipAspirate = + state.touchTipAspirate != null ? state.touchTipAspirate.toString() : null + const touchTipDispense = + state.touchTipDispense != null ? state.touchTipDispense.toString() : null + const [position, setPosition] = useState( + kind === 'aspirate' ? touchTipAspirate : touchTipDispense ) const touchTipAction = @@ -94,7 +96,10 @@ export function TouchTip(props: TouchTipProps): JSX.Element { setCurrentStep(2) } } else if (currentStep === 2) { - dispatch({ type: touchTipAction, position: position ?? undefined }) + dispatch({ + type: touchTipAction, + position: position != null ? parseInt(position) : undefined, + }) trackEventWithRobotSerial({ name: ANALYTICS_QUICK_TRANSFER_SETTING_SAVED, properties: { @@ -130,10 +135,13 @@ export function TouchTip(props: TouchTipProps): JSX.Element { } // the allowed range for touch tip is half the height of the well to 1x the height - const positionRange = { min: Math.round(wellHeight / 2), max: wellHeight } + const positionRange = { min: -Math.round(wellHeight / 2), max: 0 } const positionError = position !== null && - (position < positionRange.min || position > positionRange.max) + (position === '-' || + position.indexOf('-') !== position.lastIndexOf('-') || + Number(position) < positionRange.min || + Number(position) > positionRange.max) ? t(`value_out_of_range`, { min: positionRange.min, max: Math.floor(positionRange.max), @@ -197,8 +205,8 @@ export function TouchTip(props: TouchTipProps): JSX.Element { marginTop={SPACING.spacing68} > { - setPosition(Number(e)) + setPosition(e) }} /> diff --git a/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/AirGap.test.tsx b/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/AirGap.test.tsx index f1e6245389f..e80edeb94f9 100644 --- a/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/AirGap.test.tsx +++ b/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/AirGap.test.tsx @@ -123,7 +123,7 @@ describe('AirGap', () => { expect(vi.mocked(InputField)).toHaveBeenCalledWith( { title: 'Air gap volume (µL)', - error: 'Value must be between 1-180', + error: 'Value must be between 1 to 180', readOnly: true, type: 'number', value: 0, @@ -152,7 +152,7 @@ describe('AirGap', () => { expect(vi.mocked(InputField)).toHaveBeenCalledWith( { title: 'Air gap volume (µL)', - error: 'Value must be between 1-80', + error: 'Value must be between 1 to 80', readOnly: true, type: 'number', value: 0, @@ -179,7 +179,7 @@ describe('AirGap', () => { expect(vi.mocked(InputField)).toHaveBeenCalledWith( { title: 'Air gap volume (µL)', - error: 'Value must be between 1-140', + error: 'Value must be between 1 to 140', readOnly: true, type: 'number', value: 0, @@ -204,7 +204,7 @@ describe('AirGap', () => { expect(vi.mocked(InputField)).toHaveBeenCalledWith( { title: 'Air gap volume (µL)', - error: 'Value must be between 1-200', + error: 'Value must be between 1 to 200', readOnly: true, type: 'number', value: 0, diff --git a/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/Delay.test.tsx b/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/Delay.test.tsx index 32b26e4712f..adcec561544 100644 --- a/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/Delay.test.tsx +++ b/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/Delay.test.tsx @@ -132,7 +132,7 @@ describe('Delay', () => { expect(vi.mocked(InputField)).toHaveBeenCalledWith( { title: 'Delay duration (seconds)', - error: 'Value must be between 1-9999999999', + error: 'Value must be between 1 to 9999999999', readOnly: true, type: 'number', value: 0, @@ -158,7 +158,7 @@ describe('Delay', () => { expect(vi.mocked(InputField)).toHaveBeenCalledWith( { title: 'Delay position from bottom of well (mm)', - error: 'Value must be between 1-100', + error: 'Value must be between 1 to 100', readOnly: true, type: 'number', value: 0, @@ -188,7 +188,7 @@ describe('Delay', () => { expect(vi.mocked(InputField)).toHaveBeenCalledWith( { title: 'Delay position from bottom of well (mm)', - error: 'Value must be between 1-400', + error: 'Value must be between 1 to 400', readOnly: true, type: 'number', value: 0, diff --git a/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/FlowRate.test.tsx b/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/FlowRate.test.tsx index 413af34ce99..9e75a5d407b 100644 --- a/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/FlowRate.test.tsx +++ b/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/FlowRate.test.tsx @@ -133,7 +133,7 @@ describe('FlowRate', () => { expect(vi.mocked(InputField)).toHaveBeenCalledWith( { title: 'Aspirate flow rate (µL/s)', - error: 'Value must be between 1-92', + error: 'Value must be between 1 to 92', readOnly: true, type: 'number', value: 0, diff --git a/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/Mix.test.tsx b/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/Mix.test.tsx index 298bd040f1c..ce29e6eb041 100644 --- a/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/Mix.test.tsx +++ b/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/Mix.test.tsx @@ -132,7 +132,7 @@ describe('Mix', () => { expect(vi.mocked(InputField)).toHaveBeenCalledWith( { title: 'Mix volume (µL)', - error: 'Value must be between 1-200', + error: 'Value must be between 1 to 200', readOnly: true, type: 'number', value: 0, @@ -158,7 +158,7 @@ describe('Mix', () => { expect(vi.mocked(InputField)).toHaveBeenCalledWith( { title: 'Mix repetitions', - error: 'Value must be between 1-999', + error: 'Value must be between 1 to 999', readOnly: true, type: 'number', value: 0, diff --git a/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/PipettePath.test.tsx b/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/PipettePath.test.tsx index 536c14bbbfd..fa5245e0fe9 100644 --- a/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/PipettePath.test.tsx +++ b/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/PipettePath.test.tsx @@ -196,7 +196,7 @@ describe('PipettePath', () => { expect(vi.mocked(InputField)).toHaveBeenCalledWith( { title: 'Disposal volume (µL)', - error: 'Value must be between 1-160', + error: 'Value must be between 1 to 160', readOnly: true, type: 'number', value: 201, diff --git a/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/TipPosition.test.tsx b/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/TipPosition.test.tsx index 02e5022785c..ea9c770edbb 100644 --- a/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/TipPosition.test.tsx +++ b/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/TipPosition.test.tsx @@ -130,7 +130,7 @@ describe('TipPosition', () => { expect(vi.mocked(InputField)).toHaveBeenCalledWith( { title: 'Distance from bottom of well (mm)', - error: 'Value must be between 1-100', + error: 'Value must be between 1 to 100', readOnly: true, type: 'text', value: 0, @@ -153,7 +153,7 @@ describe('TipPosition', () => { expect(vi.mocked(InputField)).toHaveBeenCalledWith( { title: 'Distance from bottom of well (mm)', - error: 'Value must be between 1-400', + error: 'Value must be between 1 to 400', readOnly: true, type: 'text', value: 0, diff --git a/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/TouchTip.test.tsx b/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/TouchTip.test.tsx index a5338c8aa71..a8c353272c9 100644 --- a/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/TouchTip.test.tsx +++ b/app/src/organisms/ODD/QuickTransferFlow/__tests__/QuickTransferAdvancedSettings/TouchTip.test.tsx @@ -110,11 +110,11 @@ describe('TouchTip', () => { fireEvent.click(continueBtn) expect(vi.mocked(InputField)).toHaveBeenCalledWith( { - title: 'Touch tip position from bottom of well (mm)', + title: 'Touch tip position from top of well (mm)', error: null, readOnly: true, - type: 'number', - value: null, + type: 'text', + value: '', }, {} ) @@ -136,15 +136,19 @@ describe('TouchTip', () => { fireEvent.click(enabledBtn) const continueBtn = screen.getByText('Continue') fireEvent.click(continueBtn) - const numButton = screen.getByText('0') + const negButton = screen.getByText('-') + fireEvent.click(negButton) + const numButton = screen.getByText('9') fireEvent.click(numButton) + const secondNumButton = screen.getByText('8') + fireEvent.click(secondNumButton) expect(vi.mocked(InputField)).toHaveBeenCalledWith( { - title: 'Touch tip position from bottom of well (mm)', - error: 'Value must be between 25-50', + title: 'Touch tip position from top of well (mm)', + error: 'Value must be between -25 to 0', readOnly: true, - type: 'number', - value: 0, + type: 'text', + value: '-98', }, {} ) @@ -162,15 +166,15 @@ describe('TouchTip', () => { fireEvent.click(enabledBtn) const continueBtn = screen.getByText('Continue') fireEvent.click(continueBtn) - const numButton = screen.getByText('0') + const numButton = screen.getByText('1') fireEvent.click(numButton) expect(vi.mocked(InputField)).toHaveBeenCalledWith( { - title: 'Touch tip position from bottom of well (mm)', - error: 'Value must be between 100-200', + title: 'Touch tip position from top of well (mm)', + error: 'Value must be between -100 to 0', readOnly: true, - type: 'number', - value: 0, + type: 'text', + value: '1', }, {} ) @@ -184,7 +188,7 @@ describe('TouchTip', () => { fireEvent.click(enabledBtn) const continueBtn = screen.getByText('Continue') fireEvent.click(continueBtn) - const numButton = screen.getByText('4') + const numButton = screen.getByText('0') fireEvent.click(numButton) fireEvent.click(numButton) const saveBtn = screen.getByText('Save') @@ -198,7 +202,7 @@ describe('TouchTip', () => { ...props, state: { ...props.state, - touchTipAspirate: 32, + touchTipAspirate: -25, }, } render(props) @@ -206,11 +210,11 @@ describe('TouchTip', () => { fireEvent.click(continueBtn) expect(vi.mocked(InputField)).toHaveBeenCalledWith( { - title: 'Touch tip position from bottom of well (mm)', + title: 'Touch tip position from top of well (mm)', error: null, readOnly: true, - type: 'number', - value: 32, + type: 'text', + value: '-25', }, {} ) @@ -222,7 +226,7 @@ describe('TouchTip', () => { kind: 'dispense', state: { ...props.state, - touchTipDispense: 118, + touchTipDispense: -8, }, } render(props) @@ -230,11 +234,11 @@ describe('TouchTip', () => { fireEvent.click(continueBtn) expect(vi.mocked(InputField)).toHaveBeenCalledWith( { - title: 'Touch tip position from bottom of well (mm)', + title: 'Touch tip position from top of well (mm)', error: null, readOnly: true, - type: 'number', - value: 118, + type: 'text', + value: '-8', }, {} ) diff --git a/app/src/organisms/ODD/QuickTransferFlow/__tests__/VolumeEntry.test.tsx b/app/src/organisms/ODD/QuickTransferFlow/__tests__/VolumeEntry.test.tsx index e96ea2515cd..d6fa82ec5e1 100644 --- a/app/src/organisms/ODD/QuickTransferFlow/__tests__/VolumeEntry.test.tsx +++ b/app/src/organisms/ODD/QuickTransferFlow/__tests__/VolumeEntry.test.tsx @@ -161,7 +161,7 @@ describe('VolumeEntry', () => { expect(vi.mocked(InputField)).toHaveBeenCalledWith( { title: 'Aspirate volume per well (µL)', - error: 'Value must be between 5-50', + error: 'Value must be between 5 to 50', readOnly: true, type: 'text', value: '90', diff --git a/app/src/organisms/ODD/QuickTransferFlow/utils/generateQuickTransferArgs.ts b/app/src/organisms/ODD/QuickTransferFlow/utils/generateQuickTransferArgs.ts index 517e0aabb0d..a2150fd22e8 100644 --- a/app/src/organisms/ODD/QuickTransferFlow/utils/generateQuickTransferArgs.ts +++ b/app/src/organisms/ODD/QuickTransferFlow/utils/generateQuickTransferArgs.ts @@ -4,7 +4,6 @@ import { orderWells, getAllDefinitions, getLabwareDefURI, - getWellsDepth, getTipTypeFromTipRackDefinition, TRASH_BIN_ADAPTER_FIXTURE, WASTE_CHUTE_FIXTURES, @@ -322,6 +321,12 @@ export function generateQuickTransferArgs( if (pipetteEntity.spec.channels === 96) { nozzles = 'ALL' as NozzleConfigurationStyle } + const touchTipAfterDispenseOffsetMmFromTop = + quickTransferState.touchTipDispense ?? DEFAULT_MM_TOUCH_TIP_OFFSET_FROM_TOP + + const touchTipAfterAspirateOffsetMmFromTop = + quickTransferState.touchTipAspirate ?? DEFAULT_MM_TOUCH_TIP_OFFSET_FROM_TOP + const commonFields = { pipette: pipetteEntity.id, volume: quickTransferState.volume, @@ -355,19 +360,9 @@ export function generateQuickTransferArgs( aspirateAirGapVolume: quickTransferState.airGapAspirate ?? null, dispenseAirGapVolume: quickTransferState.airGapDispense ?? null, touchTipAfterAspirate: quickTransferState.touchTipAspirate != null, - touchTipAfterAspirateOffsetMmFromBottom: - quickTransferState.touchTipAspirate ?? - getWellsDepth(quickTransferState.source, sourceWells) + - DEFAULT_MM_TOUCH_TIP_OFFSET_FROM_TOP, + touchTipAfterAspirateOffsetMmFromTop, touchTipAfterDispense: quickTransferState.touchTipDispense != null, - touchTipAfterDispenseOffsetMmFromBottom: - quickTransferState.touchTipDispense ?? - getWellsDepth( - quickTransferState.destination === 'source' - ? quickTransferState.source - : quickTransferState.destination, - destWells - ) + DEFAULT_MM_TOUCH_TIP_OFFSET_FROM_TOP, + touchTipAfterDispenseOffsetMmFromTop, dropTipLocation, aspirateXOffset: 0, aspirateYOffset: 0, diff --git a/protocol-designer/cypress/e2e/migrations.cy.ts b/protocol-designer/cypress/e2e/migrations.cy.ts index eb93db7ed51..b728be98b45 100644 --- a/protocol-designer/cypress/e2e/migrations.cy.ts +++ b/protocol-designer/cypress/e2e/migrations.cy.ts @@ -11,21 +11,21 @@ describe('Protocol fixtures migrate and match snapshots', () => { const testCases: MigrateTestCase[] = [ { - title: 'example_1_1_0 (schema 1, PD version 1.1.1) -> PD 8.2.x, schema 8', + title: 'example_1_1_0 (schema 1, PD version 1.1.1) -> PD 8.5.x, schema 8', importTestFile: TestFilePath.Example_1_1_0, expectedTestFile: TestFilePath.Example_1_1_0V8, unusedHardware: true, migrationModal: 'newLabwareDefs', }, { - title: 'doItAllV3 (schema 3, PD version 4.0.0) -> PD 8.2.x, schema 8', + title: 'doItAllV3 (schema 3, PD version 4.0.0) -> PD 8.5.x, schema 8', importTestFile: TestFilePath.DoItAllV3V4, expectedTestFile: TestFilePath.DoItAllV3MigratedToV8, unusedHardware: false, migrationModal: 'v8.1', }, { - title: 'doItAllV4 (schema 4, PD version 4.0.0) -> PD 8.2.x, schema 8', + title: 'doItAllV4 (schema 4, PD version 4.0.0) -> PD 8.5.x, schema 8', importTestFile: TestFilePath.DoItAllV4V4, expectedTestFile: TestFilePath.DoItAllV4MigratedToV8, unusedHardware: false, @@ -33,7 +33,7 @@ describe('Protocol fixtures migrate and match snapshots', () => { }, { title: - 'doItAllv7MigratedToV8 (schema 7, PD version 8.0.0) -> should migrate to 8.2.x, schema 8', + 'doItAllv7MigratedToV8 (schema 7, PD version 8.0.0) -> should migrate to 8.5.x, schema 8', importTestFile: TestFilePath.DoItAllV7, expectedTestFile: TestFilePath.DoItAllV7MigratedToV8, unusedHardware: false, @@ -41,7 +41,7 @@ describe('Protocol fixtures migrate and match snapshots', () => { }, { title: - '96-channel full and column schema 8 -> should migrate to 8.2.x, schema 8', + '96-channel full and column schema 8 -> should migrate to 8.5.x, schema 8', importTestFile: TestFilePath.NinetySixChannelFullAndColumn, expectedTestFile: TestFilePath.NinetySixChannelFullAndColumn, unusedHardware: false, @@ -49,7 +49,7 @@ describe('Protocol fixtures migrate and match snapshots', () => { }, { title: - 'doItAllV8 flex robot -> reimported, should migrate to 8.2.x, schema 8', + 'doItAllV8 flex robot -> reimported, should migrate to 8.5.x, schema 8', importTestFile: TestFilePath.DoItAllV8, expectedTestFile: TestFilePath.DoItAllV8, unusedHardware: false, @@ -57,7 +57,7 @@ describe('Protocol fixtures migrate and match snapshots', () => { }, { title: - 'new advanced settings with multi temp => reimported, should not migrate and stay at 8.2.x, schema 8', + 'new advanced settings with multi temp => reimported, should not migrate and stay at 8.5.x, schema 8', importTestFile: TestFilePath.NewAdvancedSettingsAndMultiTemp, expectedTestFile: TestFilePath.NewAdvancedSettingsAndMultiTemp, unusedHardware: false, @@ -65,7 +65,7 @@ describe('Protocol fixtures migrate and match snapshots', () => { }, { title: - 'thermocycler on Ot2 (schema 7, PD version 7.0.0) -> should migrate to 8.2.x, schema 8', + 'thermocycler on Ot2 (schema 7, PD version 7.0.0) -> should migrate to 8.5.x, schema 8', importTestFile: TestFilePath.ThermocyclerOnOt2V7, expectedTestFile: TestFilePath.ThermocyclerOnOt2V7MigratedToV8, migrationModal: 'v8.1', diff --git a/protocol-designer/fixtures/protocol/8/doItAllV3MigratedToV8.json b/protocol-designer/fixtures/protocol/8/doItAllV3MigratedToV8.json index 0a88ef75afc..e4419499678 100644 --- a/protocol-designer/fixtures/protocol/8/doItAllV3MigratedToV8.json +++ b/protocol-designer/fixtures/protocol/8/doItAllV3MigratedToV8.json @@ -6,16 +6,16 @@ "author": "Fixture", "description": "Test all v3 commands", "created": 1585930833548, - "lastModified": 1731344391861, + "lastModified": 1738157114365, "category": null, "subcategory": null, "tags": [] }, "designerApplication": { "name": "opentrons/protocol-designer", - "version": "8.2.0", + "version": "8.5.0", "data": { - "_internalAppBuildDate": "Mon, 11 Nov 2024 16:56:05 GMT", + "_internalAppBuildDate": "Wed, 29 Jan 2025 13:23:47 GMT", "defaultValues": { "aspirate_mmFromBottom": 1, "dispense_mmFromBottom": 1, @@ -27,7 +27,10 @@ "opentrons/opentrons_96_tiprack_300ul/1" ] }, - "dismissedWarnings": { "form": [], "timeline": [] }, + "dismissedWarnings": { + "form": [], + "timeline": [] + }, "ingredients": { "0": { "name": "Water", @@ -38,22 +41,86 @@ }, "ingredLocations": { "1e610d40-75c7-11ea-b42f-4b64e50f43e5:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1": { - "A1": { "0": { "volume": 100 } }, - "B1": { "0": { "volume": 100 } }, - "C1": { "0": { "volume": 100 } }, - "D1": { "0": { "volume": 100 } }, - "E1": { "0": { "volume": 100 } }, - "F1": { "0": { "volume": 100 } }, - "G1": { "0": { "volume": 100 } }, - "H1": { "0": { "volume": 100 } }, - "A2": { "0": { "volume": 100 } }, - "B2": { "0": { "volume": 100 } }, - "C2": { "0": { "volume": 100 } }, - "D2": { "0": { "volume": 100 } }, - "E2": { "0": { "volume": 100 } }, - "F2": { "0": { "volume": 100 } }, - "G2": { "0": { "volume": 100 } }, - "H2": { "0": { "volume": 100 } } + "A1": { + "0": { + "volume": 100 + } + }, + "B1": { + "0": { + "volume": 100 + } + }, + "C1": { + "0": { + "volume": 100 + } + }, + "D1": { + "0": { + "volume": 100 + } + }, + "E1": { + "0": { + "volume": 100 + } + }, + "F1": { + "0": { + "volume": 100 + } + }, + "G1": { + "0": { + "volume": 100 + } + }, + "H1": { + "0": { + "volume": 100 + } + }, + "A2": { + "0": { + "volume": 100 + } + }, + "B2": { + "0": { + "volume": 100 + } + }, + "C2": { + "0": { + "volume": 100 + } + }, + "D2": { + "0": { + "volume": 100 + } + }, + "E2": { + "0": { + "volume": 100 + } + }, + "F2": { + "0": { + "volume": 100 + } + }, + "G2": { + "0": { + "volume": 100 + } + }, + "H2": { + "0": { + "volume": 100 + } + } } }, "savedStepForms": { @@ -83,7 +150,7 @@ "aspirate_mix_volume": "30", "aspirate_mmFromBottom": 1, "aspirate_touchTip_checkbox": true, - "aspirate_touchTip_mmFromBottom": 12.8, + "aspirate_touchTip_mmFromTop": -2, "aspirate_wellOrder_first": "t2b", "aspirate_wellOrder_second": "l2r", "aspirate_wells_grouped": false, @@ -92,7 +159,7 @@ "aspirate_y_position": 0, "blowout_checkbox": false, "blowout_flowRate": null, - "blowout_location": "cf94212f-07b9-4b05-b4ca-46e050bcd74f:trashBin", + "blowout_location": "64e49cf0-e3d6-4da3-966f-a3da759c57b8:trashBin", "blowout_z_offset": 0, "changeTip": "always", "dispense_airGap_checkbox": false, @@ -107,7 +174,7 @@ "dispense_mix_volume": null, "dispense_mmFromBottom": 0.5, "dispense_touchTip_checkbox": true, - "dispense_touchTip_mmFromBottom": 40, + "dispense_touchTip_mmFromTop": null, "dispense_wellOrder_first": "t2b", "dispense_wellOrder_second": "l2r", "dispense_wells": ["A1", "A2"], @@ -115,17 +182,18 @@ "dispense_y_position": 0, "disposalVolume_checkbox": true, "disposalVolume_volume": "20", - "dropTip_location": "cf94212f-07b9-4b05-b4ca-46e050bcd74f:trashBin", + "dropTip_location": "64e49cf0-e3d6-4da3-966f-a3da759c57b8:trashBin", "nozzles": null, "path": "multiDispense", "pipette": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "preWetTip": false, "tipRack": "opentrons/opentrons_96_tiprack_300ul/1", "volume": "40", - "id": "3961e4c0-75c7-11ea-b42f-4b64e50f43e5", "stepType": "moveLiquid", "stepName": "transfer", - "stepDetails": "" + "stepDetails": "", + "id": "3961e4c0-75c7-11ea-b42f-4b64e50f43e5", + "dispense_touchTip_mmfromTop": -2 }, "54dc3200-75c7-11ea-b42f-4b64e50f43e5": { "moduleId": null, @@ -155,17 +223,17 @@ "aspirate_flowRate": 40, "blowout_checkbox": true, "blowout_flowRate": 46.43, - "blowout_location": "cf94212f-07b9-4b05-b4ca-46e050bcd74f:trashBin", + "blowout_location": "64e49cf0-e3d6-4da3-966f-a3da759c57b8:trashBin", "blowout_z_offset": 0, "changeTip": "always", "dispense_delay_checkbox": false, "dispense_delay_seconds": "1", "dispense_flowRate": 35, - "dropTip_location": "cf94212f-07b9-4b05-b4ca-46e050bcd74f:trashBin", + "dropTip_location": "64e49cf0-e3d6-4da3-966f-a3da759c57b8:trashBin", "labware": "1e610d40-75c7-11ea-b42f-4b64e50f43e5:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1", "mix_mmFromBottom": 0.5, "mix_touchTip_checkbox": true, - "mix_touchTip_mmFromBottom": 11.8, + "mix_touchTip_mmFromTop": -3, "mix_wellOrder_first": "t2b", "mix_wellOrder_second": "l2r", "mix_x_position": 0, @@ -176,10 +244,10 @@ "tipRack": "opentrons/opentrons_96_tiprack_300ul/1", "volume": "35", "wells": ["D2", "E2"], - "id": "a4cee9a0-75dc-11ea-b42f-4b64e50f43e5", "stepType": "mix", "stepName": "mix", - "stepDetails": "" + "stepDetails": "", + "id": "a4cee9a0-75dc-11ea-b42f-4b64e50f43e5" } }, "orderedStepIds": [ @@ -190,7 +258,10 @@ ] } }, - "robot": { "model": "OT-2 Standard", "deckId": "ot2_standard" }, + "robot": { + "model": "OT-2 Standard", + "deckId": "ot2_standard" + }, "labwareDefinitionSchemaId": "opentronsLabwareSchemaV2", "labwareDefinitions": { "opentrons/opentrons_96_tiprack_300ul/1": { @@ -1206,7 +1277,11 @@ "namespace": "opentrons", "version": 1, "schemaVersion": 2, - "cornerOffsetFromSlot": { "x": 0, "y": 0, "z": 0 } + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + } }, "opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1": { "ordering": [ @@ -2107,7 +2182,9 @@ }, "groups": [ { - "metadata": { "wellBottomShape": "v" }, + "metadata": { + "wellBottomShape": "v" + }, "wells": [ "A1", "B1", @@ -2218,7 +2295,11 @@ "namespace": "opentrons", "version": 1, "schemaVersion": 2, - "cornerOffsetFromSlot": { "x": 0, "y": 0, "z": 0 } + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + } }, "opentrons/opentrons_24_aluminumblock_generic_2ml_screwcap/1": { "ordering": [ @@ -2507,10 +2588,18 @@ "displayCategory": "tubeRack", "wellBottomShape": "v" }, - "brand": { "brand": "generic", "brandId": [], "links": [] } + "brand": { + "brand": "generic", + "brandId": [], + "links": [] + } } ], - "cornerOffsetFromSlot": { "x": 0, "y": 0, "z": 0 } + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + } } }, "liquidSchemaId": "opentronsLiquidSchemaV1", @@ -2524,7 +2613,7 @@ "commandSchemaId": "opentronsCommandSchemaV8", "commands": [ { - "key": "5eb673b3-81d8-47d4-8e0e-b4b82ada5a02", + "key": "3bed79e7-58b0-44f7-b69b-f6bbfca92050", "commandType": "loadPipette", "params": { "pipetteName": "p300_single_gen2", @@ -2533,7 +2622,7 @@ } }, { - "key": "949b68b3-c096-4156-9de2-b6df007cda2b", + "key": "4dde1dc9-5acc-472b-a31c-bde389335fa6", "commandType": "loadLabware", "params": { "displayName": "Opentrons 96 Tip Rack 300 µL", @@ -2541,11 +2630,13 @@ "loadName": "opentrons_96_tiprack_300ul", "namespace": "opentrons", "version": 1, - "location": { "slotName": "2" } + "location": { + "slotName": "2" + } } }, { - "key": "936d0aa1-6614-4e02-9933-4daa17392d65", + "key": "224b643f-b209-4d3f-99c4-c277ea89bc8f", "commandType": "loadLabware", "params": { "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", @@ -2553,11 +2644,13 @@ "loadName": "nest_96_wellplate_100ul_pcr_full_skirt", "namespace": "opentrons", "version": 1, - "location": { "slotName": "1" } + "location": { + "slotName": "1" + } } }, { - "key": "9ef29387-29f5-43b7-b937-152a5bbfbd1e", + "key": "a4e63613-8f60-4bc7-bb1e-112564d35720", "commandType": "loadLabware", "params": { "displayName": "Opentrons 24 Well Aluminum Block with Generic 2 mL Screwcap", @@ -2565,12 +2658,14 @@ "loadName": "opentrons_24_aluminumblock_generic_2ml_screwcap", "namespace": "opentrons", "version": 1, - "location": { "slotName": "3" } + "location": { + "slotName": "3" + } } }, { "commandType": "loadLiquid", - "key": "7884529a-98d0-4a6c-9f84-9e1fe1a4c253", + "key": "c820e00d-268f-4d4c-86ee-cdd27b529efc", "params": { "liquidId": "0", "labwareId": "1e610d40-75c7-11ea-b42f-4b64e50f43e5:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1", @@ -2596,12 +2691,15 @@ }, { "commandType": "waitForDuration", - "key": "dadad2c0-9c65-47ba-9b2c-5dd1cb651e5f", - "params": { "seconds": 62, "message": "" } + "key": "243817c3-d196-48ca-b644-2869c8831be8", + "params": { + "seconds": 62, + "message": "" + } }, { "commandType": "pickUpTip", - "key": "78595527-1473-4a0d-80e2-be6e91859074", + "key": "d9a2045f-f90d-4f38-9853-48ccee28ae19", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "labwareId": "0b44c760-75c7-11ea-b42f-4b64e50f43e5:opentrons/opentrons_96_tiprack_300ul/1", @@ -2610,7 +2708,7 @@ }, { "commandType": "aspirate", - "key": "ce5acab8-32aa-4355-a605-cd36b5877fad", + "key": "cd570d0a-52d3-4c05-be48-951c0c697a70", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 30, @@ -2618,14 +2716,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 46.43 } }, { "commandType": "dispense", - "key": "967e6205-440a-4f35-ab90-4709ec40cf3c", + "key": "1324b2c8-7000-4eb5-bb99-8044e5d2d4a1", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 30, @@ -2633,14 +2735,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 46.43 } }, { "commandType": "aspirate", - "key": "5328590a-1106-4096-95eb-d7ed053e9b91", + "key": "d6fc2391-2fce-4757-841e-b812a0ca7cbd", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 30, @@ -2648,14 +2754,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 46.43 } }, { "commandType": "dispense", - "key": "0464cec1-e2ab-4ce2-bdcf-0a61c37b5fa7", + "key": "0e182daa-bba3-4709-94a2-c09cadf77049", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 30, @@ -2663,14 +2773,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 46.43 } }, { "commandType": "aspirate", - "key": "c74e5096-a002-4075-b537-b4e63f528f78", + "key": "8e66053b-fea4-4ac1-9509-23dd7371678b", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 100, @@ -2678,24 +2792,33 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 46.43 } }, { "commandType": "touchTip", - "key": "920f458d-9756-49dd-b8a3-4bf5e5a3ce01", + "key": "39c918f8-615c-4a0d-99b7-d5439942ced3", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "labwareId": "1e610d40-75c7-11ea-b42f-4b64e50f43e5:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 12.8 } } + "wellLocation": { + "origin": "top", + "offset": { + "z": -2 + } + } } }, { "commandType": "dispense", - "key": "39c46730-e185-4195-8d92-17303a29787b", + "key": "5f583194-0869-4fc9-93f7-bc07580ff7ba", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 40, @@ -2703,24 +2826,33 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 0.5, "x": 0, "y": 0 } + "offset": { + "z": 0.5, + "x": 0, + "y": 0 + } }, "flowRate": 46.43 } }, { "commandType": "touchTip", - "key": "257bbcbf-2505-421a-abc2-49d9b73826d7", + "key": "670e4b7e-c246-4fba-8f76-490d0064f8e7", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "labwareId": "21ed8f60-75c7-11ea-b42f-4b64e50f43e5:opentrons/opentrons_24_aluminumblock_generic_2ml_screwcap/1", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 40 } } + "wellLocation": { + "origin": "top", + "offset": { + "z": -1 + } + } } }, { "commandType": "dispense", - "key": "81ed30f9-92c0-47b7-b15d-11208eb1230d", + "key": "40cfe456-331b-43d8-bee0-1806d93b45a2", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 40, @@ -2728,33 +2860,46 @@ "wellName": "A2", "wellLocation": { "origin": "bottom", - "offset": { "z": 0.5, "x": 0, "y": 0 } + "offset": { + "z": 0.5, + "x": 0, + "y": 0 + } }, "flowRate": 46.43 } }, { "commandType": "touchTip", - "key": "88126279-08ad-447f-813f-0a89dcb3be86", + "key": "b8335845-cabd-4af1-ab1b-1379c7bcd62b", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "labwareId": "21ed8f60-75c7-11ea-b42f-4b64e50f43e5:opentrons/opentrons_24_aluminumblock_generic_2ml_screwcap/1", "wellName": "A2", - "wellLocation": { "origin": "bottom", "offset": { "z": 40 } } + "wellLocation": { + "origin": "top", + "offset": { + "z": -1 + } + } } }, { "commandType": "moveToAddressableArea", - "key": "408d599b-be52-4932-9fe4-63375c09a069", + "key": "c1d8d6b9-1a62-456f-8ca5-c4f21b3af4f3", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "addressableAreaName": "fixedTrash", - "offset": { "x": 0, "y": 0, "z": 0 } + "offset": { + "x": 0, + "y": 0, + "z": 0 + } } }, { "commandType": "blowOutInPlace", - "key": "603b2c89-46d9-4b9e-8f3f-4e91fdf9172f", + "key": "8352e715-668b-4f80-aa35-0d2776137243", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "flowRate": 46.43 @@ -2762,27 +2907,35 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "bc74c9ab-603d-4d40-9ebc-ffd374f18d00", + "key": "79c8d331-5c79-4f03-b8c5-4dc4b3315546", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "addressableAreaName": "fixedTrash", - "offset": { "x": 0, "y": 0, "z": 0 }, + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, "alternateDropLocation": true } }, { "commandType": "dropTipInPlace", - "key": "2f769f1e-fee9-430d-85d6-9fdf9719617a", - "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5" } + "key": "52ee7e0d-ccb4-4e1e-b706-0ee8f9037bcb", + "params": { + "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5" + } }, { "commandType": "waitForResume", - "key": "a687a278-9cf7-4c4e-b716-2404315839ac", - "params": { "message": "Wait until user intervention" } + "key": "add4e276-fc31-4b72-a3c5-612506159a10", + "params": { + "message": "Wait until user intervention" + } }, { "commandType": "pickUpTip", - "key": "5ee67b7f-5569-4ea6-b5db-d97aa36bd2c8", + "key": "c3ced120-cd18-4abf-9e89-0cacea5a5da6", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "labwareId": "0b44c760-75c7-11ea-b42f-4b64e50f43e5:opentrons/opentrons_96_tiprack_300ul/1", @@ -2791,7 +2944,7 @@ }, { "commandType": "aspirate", - "key": "047cab23-b0e7-44cd-b911-69c08da2d1c8", + "key": "cc110c4c-0d07-4373-919a-7941b288a0f8", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 35, @@ -2799,14 +2952,18 @@ "wellName": "D2", "wellLocation": { "origin": "bottom", - "offset": { "z": 0.5, "x": 0, "y": 0 } + "offset": { + "z": 0.5, + "x": 0, + "y": 0 + } }, "flowRate": 40 } }, { "commandType": "dispense", - "key": "63af555a-236f-41c4-9b4b-971bed565100", + "key": "61d7a6ed-1fb7-4c5f-b8c0-b8a02385a9a5", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 35, @@ -2814,14 +2971,18 @@ "wellName": "D2", "wellLocation": { "origin": "bottom", - "offset": { "z": 0.5, "x": 0, "y": 0 } + "offset": { + "z": 0.5, + "x": 0, + "y": 0 + } }, "flowRate": 35 } }, { "commandType": "aspirate", - "key": "fb3397df-bc10-4d00-9543-9f18f5c420ca", + "key": "1e1174dd-f3e9-446a-9e3d-46c68958487d", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 35, @@ -2829,14 +2990,18 @@ "wellName": "D2", "wellLocation": { "origin": "bottom", - "offset": { "z": 0.5, "x": 0, "y": 0 } + "offset": { + "z": 0.5, + "x": 0, + "y": 0 + } }, "flowRate": 40 } }, { "commandType": "dispense", - "key": "ef73d9c8-9503-445d-ba42-4a4b6bbbd6b1", + "key": "fc92a66c-c81d-4645-9761-17b82eace5ca", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 35, @@ -2844,14 +3009,18 @@ "wellName": "D2", "wellLocation": { "origin": "bottom", - "offset": { "z": 0.5, "x": 0, "y": 0 } + "offset": { + "z": 0.5, + "x": 0, + "y": 0 + } }, "flowRate": 35 } }, { "commandType": "aspirate", - "key": "5b3cf83d-19a3-4b4e-8d5d-dd2d49a8a6f9", + "key": "d5ae7a38-aa11-47ea-a3a9-72dcc81bbed3", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 35, @@ -2859,14 +3028,18 @@ "wellName": "D2", "wellLocation": { "origin": "bottom", - "offset": { "z": 0.5, "x": 0, "y": 0 } + "offset": { + "z": 0.5, + "x": 0, + "y": 0 + } }, "flowRate": 40 } }, { "commandType": "dispense", - "key": "e152f451-c373-4d50-bd55-aaa8f02e63d4", + "key": "96411ac4-fe34-4d79-8197-69be37727d22", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 35, @@ -2874,23 +3047,31 @@ "wellName": "D2", "wellLocation": { "origin": "bottom", - "offset": { "z": 0.5, "x": 0, "y": 0 } + "offset": { + "z": 0.5, + "x": 0, + "y": 0 + } }, "flowRate": 35 } }, { "commandType": "moveToAddressableArea", - "key": "aacc7b9e-a3d5-4bb2-8574-4bbf8e7756b7", + "key": "2c6a94b7-ded9-4613-8440-07d61d1aeab9", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "addressableAreaName": "fixedTrash", - "offset": { "x": 0, "y": 0, "z": 0 } + "offset": { + "x": 0, + "y": 0, + "z": 0 + } } }, { "commandType": "blowOutInPlace", - "key": "fc296c88-76b7-4d1a-bc5d-7af1d2c9ce76", + "key": "388ff506-8805-43c4-a28d-fdb1d71af2d6", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "flowRate": 46.43 @@ -2898,32 +3079,43 @@ }, { "commandType": "touchTip", - "key": "4e54d749-d1ec-47ba-ac06-dcb65f367313", + "key": "e5af286f-12fb-4f6a-9ce9-fdc4a2e630df", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "labwareId": "1e610d40-75c7-11ea-b42f-4b64e50f43e5:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1", "wellName": "D2", - "wellLocation": { "origin": "bottom", "offset": { "z": 11.8 } } + "wellLocation": { + "origin": "top", + "offset": { + "z": -3 + } + } } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "cd0533d0-57d6-4f0d-a47a-c8c97deb4a99", + "key": "e2e64d0a-98f7-44b2-a30e-55f947ce383b", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "addressableAreaName": "fixedTrash", - "offset": { "x": 0, "y": 0, "z": 0 }, + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, "alternateDropLocation": true } }, { "commandType": "dropTipInPlace", - "key": "ef18ea90-aba0-40e6-87cb-015905b606c7", - "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5" } + "key": "c66dab4c-5675-468f-a202-be5136e26d97", + "params": { + "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5" + } }, { "commandType": "pickUpTip", - "key": "020e8352-eadd-4459-b4e7-00454434ff6a", + "key": "9b0ee879-5d40-44b4-b8d6-7de4dc308448", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "labwareId": "0b44c760-75c7-11ea-b42f-4b64e50f43e5:opentrons/opentrons_96_tiprack_300ul/1", @@ -2932,7 +3124,7 @@ }, { "commandType": "aspirate", - "key": "eb848013-b7ab-4811-bf9e-75d5206cd5ce", + "key": "59c5aff6-b946-4846-84a3-68701edbd869", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 35, @@ -2940,14 +3132,18 @@ "wellName": "E2", "wellLocation": { "origin": "bottom", - "offset": { "z": 0.5, "x": 0, "y": 0 } + "offset": { + "z": 0.5, + "x": 0, + "y": 0 + } }, "flowRate": 40 } }, { "commandType": "dispense", - "key": "3cd94443-6c0f-41bb-a656-07f2ed850206", + "key": "4b1e2446-55b0-4503-8528-c446066b8f95", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 35, @@ -2955,14 +3151,18 @@ "wellName": "E2", "wellLocation": { "origin": "bottom", - "offset": { "z": 0.5, "x": 0, "y": 0 } + "offset": { + "z": 0.5, + "x": 0, + "y": 0 + } }, "flowRate": 35 } }, { "commandType": "aspirate", - "key": "f0c8d35c-86a0-4dc4-9f04-008d2ce1a133", + "key": "1454a903-58ab-401b-ba6e-682ee6144051", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 35, @@ -2970,14 +3170,18 @@ "wellName": "E2", "wellLocation": { "origin": "bottom", - "offset": { "z": 0.5, "x": 0, "y": 0 } + "offset": { + "z": 0.5, + "x": 0, + "y": 0 + } }, "flowRate": 40 } }, { "commandType": "dispense", - "key": "7b0ee80d-6f37-40f4-9932-e5f69f8e7d30", + "key": "b0f636be-6cce-4d2d-8526-51c80ed8fbe1", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 35, @@ -2985,14 +3189,18 @@ "wellName": "E2", "wellLocation": { "origin": "bottom", - "offset": { "z": 0.5, "x": 0, "y": 0 } + "offset": { + "z": 0.5, + "x": 0, + "y": 0 + } }, "flowRate": 35 } }, { "commandType": "aspirate", - "key": "e1bdbe8c-4ead-4589-af6e-a9aa97b7ef3a", + "key": "c2ad1175-0a40-4982-9fa9-1354744ca6d4", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 35, @@ -3000,14 +3208,18 @@ "wellName": "E2", "wellLocation": { "origin": "bottom", - "offset": { "z": 0.5, "x": 0, "y": 0 } + "offset": { + "z": 0.5, + "x": 0, + "y": 0 + } }, "flowRate": 40 } }, { "commandType": "dispense", - "key": "e260db00-2659-476c-a240-d59dfcf63198", + "key": "d1147be5-d627-48ca-97a9-c92e643b313a", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 35, @@ -3015,23 +3227,31 @@ "wellName": "E2", "wellLocation": { "origin": "bottom", - "offset": { "z": 0.5, "x": 0, "y": 0 } + "offset": { + "z": 0.5, + "x": 0, + "y": 0 + } }, "flowRate": 35 } }, { "commandType": "moveToAddressableArea", - "key": "2eb6a735-e90c-4c38-b435-18048595ee2f", + "key": "563170a0-0e79-4992-8f1c-830653392ef7", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "addressableAreaName": "fixedTrash", - "offset": { "x": 0, "y": 0, "z": 0 } + "offset": { + "x": 0, + "y": 0, + "z": 0 + } } }, { "commandType": "blowOutInPlace", - "key": "bb7ac475-5836-4ea7-9aed-c8f3eec59291", + "key": "40f0e993-5b4b-4d9e-b9df-a7ef8a3bdf9b", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "flowRate": 46.43 @@ -3039,28 +3259,39 @@ }, { "commandType": "touchTip", - "key": "b0e8d063-8491-4eea-bdef-f34e7fcf14a8", + "key": "19a60b57-c610-4df1-88a2-5259038b3687", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "labwareId": "1e610d40-75c7-11ea-b42f-4b64e50f43e5:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1", "wellName": "E2", - "wellLocation": { "origin": "bottom", "offset": { "z": 11.8 } } + "wellLocation": { + "origin": "top", + "offset": { + "z": -3 + } + } } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "256ba868-f582-43b9-867a-5ff91012b1ab", + "key": "f703c506-0bf4-4736-9790-7eab435672ae", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "addressableAreaName": "fixedTrash", - "offset": { "x": 0, "y": 0, "z": 0 }, + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, "alternateDropLocation": true } }, { "commandType": "dropTipInPlace", - "key": "8d34a054-235a-4918-9788-75e50b5e2e81", - "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5" } + "key": "49ded239-d74e-4a3f-944d-0b307cfa3de1", + "params": { + "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5" + } } ], "commandAnnotationSchemaId": "opentronsCommandAnnotationSchemaV1", diff --git a/protocol-designer/fixtures/protocol/8/doItAllV4MigratedToV8.json b/protocol-designer/fixtures/protocol/8/doItAllV4MigratedToV8.json index bf503ff3219..15032ca53cd 100644 --- a/protocol-designer/fixtures/protocol/8/doItAllV4MigratedToV8.json +++ b/protocol-designer/fixtures/protocol/8/doItAllV4MigratedToV8.json @@ -6,16 +6,16 @@ "author": "Fixture", "description": "Test all v4 commands", "created": 1585930833548, - "lastModified": 1731344437355, + "lastModified": 1738157148111, "category": null, "subcategory": null, "tags": [] }, "designerApplication": { "name": "opentrons/protocol-designer", - "version": "8.2.0", + "version": "8.5.0", "data": { - "_internalAppBuildDate": "Mon, 11 Nov 2024 16:56:05 GMT", + "_internalAppBuildDate": "Wed, 29 Jan 2025 13:23:47 GMT", "defaultValues": { "aspirate_mmFromBottom": 1, "dispense_mmFromBottom": 1, @@ -27,7 +27,10 @@ "opentrons/opentrons_96_tiprack_300ul/1" ] }, - "dismissedWarnings": { "form": [], "timeline": [] }, + "dismissedWarnings": { + "form": [], + "timeline": [] + }, "ingredients": { "0": { "name": "Water", @@ -38,22 +41,86 @@ }, "ingredLocations": { "1e610d40-75c7-11ea-b42f-4b64e50f43e5:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1": { - "A1": { "0": { "volume": 100 } }, - "B1": { "0": { "volume": 100 } }, - "C1": { "0": { "volume": 100 } }, - "D1": { "0": { "volume": 100 } }, - "E1": { "0": { "volume": 100 } }, - "F1": { "0": { "volume": 100 } }, - "G1": { "0": { "volume": 100 } }, - "H1": { "0": { "volume": 100 } }, - "A2": { "0": { "volume": 100 } }, - "B2": { "0": { "volume": 100 } }, - "C2": { "0": { "volume": 100 } }, - "D2": { "0": { "volume": 100 } }, - "E2": { "0": { "volume": 100 } }, - "F2": { "0": { "volume": 100 } }, - "G2": { "0": { "volume": 100 } }, - "H2": { "0": { "volume": 100 } } + "A1": { + "0": { + "volume": 100 + } + }, + "B1": { + "0": { + "volume": 100 + } + }, + "C1": { + "0": { + "volume": 100 + } + }, + "D1": { + "0": { + "volume": 100 + } + }, + "E1": { + "0": { + "volume": 100 + } + }, + "F1": { + "0": { + "volume": 100 + } + }, + "G1": { + "0": { + "volume": 100 + } + }, + "H1": { + "0": { + "volume": 100 + } + }, + "A2": { + "0": { + "volume": 100 + } + }, + "B2": { + "0": { + "volume": 100 + } + }, + "C2": { + "0": { + "volume": 100 + } + }, + "D2": { + "0": { + "volume": 100 + } + }, + "E2": { + "0": { + "volume": 100 + } + }, + "F2": { + "0": { + "volume": 100 + } + }, + "G2": { + "0": { + "volume": 100 + } + }, + "H2": { + "0": { + "volume": 100 + } + } } }, "savedStepForms": { @@ -115,7 +182,7 @@ "aspirate_mix_volume": null, "aspirate_mmFromBottom": 1, "aspirate_touchTip_checkbox": false, - "aspirate_touchTip_mmFromBottom": null, + "aspirate_touchTip_mmFromTop": null, "aspirate_wellOrder_first": "t2b", "aspirate_wellOrder_second": "l2r", "aspirate_wells_grouped": false, @@ -124,7 +191,7 @@ "aspirate_y_position": 0, "blowout_checkbox": false, "blowout_flowRate": null, - "blowout_location": "167531be-c08f-48d1-94d1-f71903140c6d:trashBin", + "blowout_location": "9bf036e9-ccfd-4732-80bc-d366731ce6d1:trashBin", "blowout_z_offset": 0, "changeTip": "always", "dispense_airGap_checkbox": false, @@ -139,7 +206,7 @@ "dispense_mix_volume": null, "dispense_mmFromBottom": 0.5, "dispense_touchTip_checkbox": false, - "dispense_touchTip_mmFromBottom": null, + "dispense_touchTip_mmFromTop": null, "dispense_wellOrder_first": "t2b", "dispense_wellOrder_second": "l2r", "dispense_wells": ["A1"], @@ -147,17 +214,18 @@ "dispense_y_position": 0, "disposalVolume_checkbox": true, "disposalVolume_volume": "20", - "dropTip_location": "167531be-c08f-48d1-94d1-f71903140c6d:trashBin", + "dropTip_location": "9bf036e9-ccfd-4732-80bc-d366731ce6d1:trashBin", "nozzles": null, "path": "single", "pipette": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "preWetTip": false, "tipRack": "opentrons/opentrons_96_tiprack_300ul/1", "volume": "30", - "id": "3961e4c0-75c7-11ea-b42f-4b64e50f43e5", "stepType": "moveLiquid", "stepName": "transfer", - "stepDetails": "" + "stepDetails": "", + "id": "3961e4c0-75c7-11ea-b42f-4b64e50f43e5", + "dispense_touchTip_mmfromTop": null }, "4f4057e0-75c7-11ea-b42f-4b64e50f43e5": { "engageHeight": "6", @@ -212,7 +280,10 @@ ] } }, - "robot": { "model": "OT-2 Standard", "deckId": "ot2_standard" }, + "robot": { + "model": "OT-2 Standard", + "deckId": "ot2_standard" + }, "labwareDefinitionSchemaId": "opentronsLabwareSchemaV2", "labwareDefinitions": { "opentrons/opentrons_96_tiprack_300ul/1": { @@ -1228,7 +1299,11 @@ "namespace": "opentrons", "version": 1, "schemaVersion": 2, - "cornerOffsetFromSlot": { "x": 0, "y": 0, "z": 0 } + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + } }, "opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1": { "ordering": [ @@ -2129,7 +2204,9 @@ }, "groups": [ { - "metadata": { "wellBottomShape": "v" }, + "metadata": { + "wellBottomShape": "v" + }, "wells": [ "A1", "B1", @@ -2240,7 +2317,11 @@ "namespace": "opentrons", "version": 1, "schemaVersion": 2, - "cornerOffsetFromSlot": { "x": 0, "y": 0, "z": 0 } + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + } }, "opentrons/opentrons_24_aluminumblock_generic_2ml_screwcap/1": { "ordering": [ @@ -2529,10 +2610,18 @@ "displayCategory": "tubeRack", "wellBottomShape": "v" }, - "brand": { "brand": "generic", "brandId": [], "links": [] } + "brand": { + "brand": "generic", + "brandId": [], + "links": [] + } } ], - "cornerOffsetFromSlot": { "x": 0, "y": 0, "z": 0 } + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + } } }, "liquidSchemaId": "opentronsLiquidSchemaV1", @@ -2546,7 +2635,7 @@ "commandSchemaId": "opentronsCommandSchemaV8", "commands": [ { - "key": "9dc2bc3a-d168-4d1d-b0fd-d245d40ec098", + "key": "8f11bef2-009b-4a4d-99f3-7c710ada996b", "commandType": "loadPipette", "params": { "pipetteName": "p300_single_gen2", @@ -2555,25 +2644,29 @@ } }, { - "key": "b82bae59-895e-4bd7-b99a-6cc71194ee8b", + "key": "9a510ad2-a606-4227-86e5-14635f3ec519", "commandType": "loadModule", "params": { "model": "magneticModuleV2", - "location": { "slotName": "1" }, + "location": { + "slotName": "1" + }, "moduleId": "0b419310-75c7-11ea-b42f-4b64e50f43e5:magneticModuleType" } }, { - "key": "60abede1-fbec-4bf1-8391-aea766f2a47f", + "key": "c98334f7-8f68-4f0b-9ff3-d98a85764e19", "commandType": "loadModule", "params": { "model": "temperatureModuleV2", - "location": { "slotName": "3" }, + "location": { + "slotName": "3" + }, "moduleId": "0b4319b0-75c7-11ea-b42f-4b64e50f43e5:temperatureModuleType" } }, { - "key": "60e77a8c-b589-4c8d-beee-0c523990ea16", + "key": "692d8775-0de4-472c-9e1a-0a7458e6c080", "commandType": "loadLabware", "params": { "displayName": "Opentrons 96 Tip Rack 300 µL", @@ -2581,11 +2674,13 @@ "loadName": "opentrons_96_tiprack_300ul", "namespace": "opentrons", "version": 1, - "location": { "slotName": "2" } + "location": { + "slotName": "2" + } } }, { - "key": "c9e0ed1a-393a-4e24-9c38-09dbd077b1f4", + "key": "2f354149-0585-4fe6-ac4d-571e5d020f9a", "commandType": "loadLabware", "params": { "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", @@ -2599,7 +2694,7 @@ } }, { - "key": "3ece81f9-ab9e-45e2-983b-313f4590d1de", + "key": "e873508f-7a6b-472a-88cc-4d83a0d9d303", "commandType": "loadLabware", "params": { "displayName": "Opentrons 24 Well Aluminum Block with Generic 2 mL Screwcap", @@ -2614,7 +2709,7 @@ }, { "commandType": "loadLiquid", - "key": "75a3d767-5bd8-4e53-bb21-c4ebf5fd5fa4", + "key": "0a0b8038-bf92-4829-9d3b-cd6e950aafd1", "params": { "liquidId": "0", "labwareId": "1e610d40-75c7-11ea-b42f-4b64e50f43e5:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1", @@ -2640,7 +2735,7 @@ }, { "commandType": "magneticModule/engage", - "key": "59f8a733-9ff9-48e9-8d96-f9eda394b2d6", + "key": "7d74d316-4910-4827-836e-bb211eb6f9f0", "params": { "moduleId": "0b419310-75c7-11ea-b42f-4b64e50f43e5:magneticModuleType", "height": 6 @@ -2648,7 +2743,7 @@ }, { "commandType": "temperatureModule/setTargetTemperature", - "key": "14f776bf-8090-44bd-a5a7-6a9dc5de83e4", + "key": "200de5f5-905a-4ea8-b48f-95b748597b56", "params": { "moduleId": "0b4319b0-75c7-11ea-b42f-4b64e50f43e5:temperatureModuleType", "celsius": 25 @@ -2656,12 +2751,15 @@ }, { "commandType": "waitForDuration", - "key": "89c7051a-2e03-4540-aa68-230b4aa2fa73", - "params": { "seconds": 62, "message": "" } + "key": "93982f84-7c02-4609-aac0-916c85341221", + "params": { + "seconds": 62, + "message": "" + } }, { "commandType": "pickUpTip", - "key": "f93df8a3-60cf-4757-9f84-1919a4c08ad8", + "key": "8336f57c-7e0d-41a7-b4a7-d76b6436c073", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "labwareId": "0b44c760-75c7-11ea-b42f-4b64e50f43e5:opentrons/opentrons_96_tiprack_300ul/1", @@ -2670,7 +2768,7 @@ }, { "commandType": "aspirate", - "key": "06deecf7-7e2e-4634-b421-ac4aa34f7dd6", + "key": "c7ada14a-1730-4237-9a6a-b9c9659cc70a", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 30, @@ -2678,14 +2776,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 46.43 } }, { "commandType": "dispense", - "key": "19ea41bb-b586-4890-9066-c1b52bb36b1c", + "key": "cb1db2cb-2901-4fac-9953-84227b284de9", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 30, @@ -2693,29 +2795,39 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 0.5, "x": 0, "y": 0 } + "offset": { + "z": 0.5, + "x": 0, + "y": 0 + } }, "flowRate": 46.43 } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "024b2758-3aeb-43c0-83ed-31968d312eb3", + "key": "3b131455-38d8-4657-a72a-154e3e2e79c9", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "addressableAreaName": "fixedTrash", - "offset": { "x": 0, "y": 0, "z": 0 }, + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, "alternateDropLocation": true } }, { "commandType": "dropTipInPlace", - "key": "eff8e3c5-29cc-45d2-a9fa-9e387f8c47e4", - "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5" } + "key": "7fbc3b35-82c0-4db1-83ba-f079d1b6f8a7", + "params": { + "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5" + } }, { "commandType": "pickUpTip", - "key": "d88115a0-7736-45d1-9d06-c0ea94f11635", + "key": "8facdb58-99b9-4838-8276-7c0e834ec587", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "labwareId": "0b44c760-75c7-11ea-b42f-4b64e50f43e5:opentrons/opentrons_96_tiprack_300ul/1", @@ -2724,7 +2836,7 @@ }, { "commandType": "aspirate", - "key": "6144ee81-8b1d-4cef-a35a-7b213d3b8a8c", + "key": "3284fa14-23dd-40c2-8e93-74ccd0ebb309", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 30, @@ -2732,14 +2844,18 @@ "wellName": "B1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 46.43 } }, { "commandType": "dispense", - "key": "da3aaaa3-1e5d-4492-8763-97b696119450", + "key": "f713e4a5-f9f0-4814-8856-c606f88d26e1", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 30, @@ -2747,29 +2863,39 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 0.5, "x": 0, "y": 0 } + "offset": { + "z": 0.5, + "x": 0, + "y": 0 + } }, "flowRate": 46.43 } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "2168d24b-a738-4505-925e-8285ae6ac620", + "key": "b05b8e43-b996-49d3-b5fe-0197a66783e9", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "addressableAreaName": "fixedTrash", - "offset": { "x": 0, "y": 0, "z": 0 }, + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, "alternateDropLocation": true } }, { "commandType": "dropTipInPlace", - "key": "91da0a46-1eed-4bbc-a428-c9bd9e8ca8c4", - "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5" } + "key": "dc46cc37-9c1b-4da3-b8fc-60fff04b758c", + "params": { + "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5" + } }, { "commandType": "temperatureModule/waitForTemperature", - "key": "b3bf1b53-015d-4141-b5b9-a03a265d9991", + "key": "d71653aa-0905-4d08-aa6c-661389fee829", "params": { "moduleId": "0b4319b0-75c7-11ea-b42f-4b64e50f43e5:temperatureModuleType", "celsius": 25 @@ -2777,15 +2903,17 @@ }, { "commandType": "magneticModule/disengage", - "key": "94500510-1a75-425a-a6c4-2a89c9ed1b50", + "key": "a156c1ba-2508-46b5-8318-f735bb8b42bb", "params": { "moduleId": "0b419310-75c7-11ea-b42f-4b64e50f43e5:magneticModuleType" } }, { "commandType": "waitForResume", - "key": "993f2eaf-7348-4a29-be1c-61612a353639", - "params": { "message": "Wait until user intervention" } + "key": "c53a9aa2-c092-45d5-b427-2f2c6c7c9b8b", + "params": { + "message": "Wait until user intervention" + } } ], "commandAnnotationSchemaId": "opentronsCommandAnnotationSchemaV1", diff --git a/protocol-designer/fixtures/protocol/8/doItAllV7MigratedToV8.json b/protocol-designer/fixtures/protocol/8/doItAllV7MigratedToV8.json index 4ba403c4590..1434bdfd45e 100644 --- a/protocol-designer/fixtures/protocol/8/doItAllV7MigratedToV8.json +++ b/protocol-designer/fixtures/protocol/8/doItAllV7MigratedToV8.json @@ -6,16 +6,16 @@ "author": "", "description": "", "created": 1689346890165, - "lastModified": 1731344479074, + "lastModified": 1738157178084, "category": null, "subcategory": null, "tags": [] }, "designerApplication": { "name": "opentrons/protocol-designer", - "version": "8.2.0", + "version": "8.5.0", "data": { - "_internalAppBuildDate": "Mon, 11 Nov 2024 16:56:05 GMT", + "_internalAppBuildDate": "Wed, 29 Jan 2025 13:23:47 GMT", "defaultValues": { "aspirate_mmFromBottom": 1, "dispense_mmFromBottom": 1, @@ -30,7 +30,10 @@ "opentrons/opentrons_flex_96_filtertiprack_50ul/1" ] }, - "dismissedWarnings": { "form": [], "timeline": [] }, + "dismissedWarnings": { + "form": [], + "timeline": [] + }, "ingredients": { "0": { "name": "Water", @@ -49,17 +52,53 @@ }, "ingredLocations": { "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2": { - "A1": { "0": { "volume": 100 } }, - "B1": { "0": { "volume": 100 } }, - "C1": { "0": { "volume": 100 } }, - "D1": { "0": { "volume": 100 } }, - "E1": { "0": { "volume": 100 } }, - "F1": { "0": { "volume": 100 } }, - "G1": { "0": { "volume": 100 } }, - "H1": { "0": { "volume": 100 } } + "A1": { + "0": { + "volume": 100 + } + }, + "B1": { + "0": { + "volume": 100 + } + }, + "C1": { + "0": { + "volume": 100 + } + }, + "D1": { + "0": { + "volume": 100 + } + }, + "E1": { + "0": { + "volume": 100 + } + }, + "F1": { + "0": { + "volume": 100 + } + }, + "G1": { + "0": { + "volume": 100 + } + }, + "H1": { + "0": { + "volume": 100 + } + } }, "a793a135-06aa-4ed6-a1d3-c176c7810afa:opentrons/opentrons_24_aluminumblock_nest_1.5ml_snapcap/1": { - "A1": { "1": { "volume": 1000 } } + "A1": { + "1": { + "volume": 1000 + } + } } }, "savedStepForms": { @@ -161,7 +200,7 @@ "aspirate_mix_volume": null, "aspirate_mmFromBottom": null, "aspirate_touchTip_checkbox": false, - "aspirate_touchTip_mmFromBottom": null, + "aspirate_touchTip_mmFromTop": null, "aspirate_wellOrder_first": "t2b", "aspirate_wellOrder_second": "l2r", "aspirate_wells_grouped": false, @@ -170,7 +209,7 @@ "aspirate_y_position": 0, "blowout_checkbox": false, "blowout_flowRate": null, - "blowout_location": "d5e65ebb-318b-4c78-8fc8-770b1d6100dc:trashBin", + "blowout_location": "ba8cacad-80e9-4cb8-b16e-12a5dc3669f0:trashBin", "blowout_z_offset": 0, "changeTip": "always", "dispense_airGap_checkbox": false, @@ -185,7 +224,7 @@ "dispense_mix_volume": null, "dispense_mmFromBottom": null, "dispense_touchTip_checkbox": false, - "dispense_touchTip_mmFromBottom": null, + "dispense_touchTip_mmFromTop": null, "dispense_wellOrder_first": "t2b", "dispense_wellOrder_second": "l2r", "dispense_wells": ["A1", "B1", "C1", "D1", "E1", "F1", "G1", "H1"], @@ -193,17 +232,18 @@ "dispense_y_position": 0, "disposalVolume_checkbox": true, "disposalVolume_volume": "100", - "dropTip_location": "d5e65ebb-318b-4c78-8fc8-770b1d6100dc:trashBin", + "dropTip_location": "ba8cacad-80e9-4cb8-b16e-12a5dc3669f0:trashBin", "nozzles": null, "path": "single", "pipette": "2e7c6344-58ab-465c-b542-489883cb63fe", "preWetTip": false, "tipRack": "opentrons/opentrons_flex_96_filtertiprack_50ul/1", "volume": "100", - "id": "f9a294f1-f42b-4cae-893a-592405349d56", "stepType": "moveLiquid", "stepName": "transfer", - "stepDetails": "" + "stepDetails": "", + "id": "f9a294f1-f42b-4cae-893a-592405349d56", + "dispense_touchTip_mmfromTop": null }, "5fdb9a12-fab4-42fd-886f-40af107b15d6": { "aspirate_delay_checkbox": false, @@ -211,17 +251,17 @@ "aspirate_flowRate": null, "blowout_checkbox": false, "blowout_flowRate": null, - "blowout_location": "d5e65ebb-318b-4c78-8fc8-770b1d6100dc:trashBin", + "blowout_location": "ba8cacad-80e9-4cb8-b16e-12a5dc3669f0:trashBin", "blowout_z_offset": 0, "changeTip": "always", "dispense_delay_checkbox": false, "dispense_delay_seconds": "1", "dispense_flowRate": null, - "dropTip_location": "d5e65ebb-318b-4c78-8fc8-770b1d6100dc:trashBin", + "dropTip_location": "ba8cacad-80e9-4cb8-b16e-12a5dc3669f0:trashBin", "labware": "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", "mix_mmFromBottom": 0.5, "mix_touchTip_checkbox": false, - "mix_touchTip_mmFromBottom": null, + "mix_touchTip_mmFromTop": null, "mix_wellOrder_first": "t2b", "mix_wellOrder_second": "l2r", "mix_x_position": 0, @@ -232,10 +272,10 @@ "tipRack": "opentrons/opentrons_flex_96_filtertiprack_50ul/1", "volume": "10", "wells": ["A1"], - "id": "5fdb9a12-fab4-42fd-886f-40af107b15d6", "stepType": "mix", "stepName": "mix", - "stepDetails": "" + "stepDetails": "", + "id": "5fdb9a12-fab4-42fd-886f-40af107b15d6" }, "3901f6f9-cecd-4d2a-8d85-40d85f9f8b4f": { "labware": "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", @@ -360,7 +400,10 @@ ] } }, - "robot": { "model": "OT-3 Standard", "deckId": "ot3_standard" }, + "robot": { + "model": "OT-3 Standard", + "deckId": "ot3_standard" + }, "labwareDefinitionSchemaId": "opentronsLabwareSchemaV2", "labwareDefinitions": { "opentrons/opentrons_flex_96_filtertiprack_50ul/1": { @@ -378,7 +421,10 @@ ["A11", "B11", "C11", "D11", "E11", "F11", "G11", "H11"], ["A12", "B12", "C12", "D12", "E12", "F12", "G12", "H12"] ], - "brand": { "brand": "Opentrons", "brandId": [] }, + "brand": { + "brand": "Opentrons", + "brandId": [] + }, "metadata": { "displayName": "Opentrons Flex 96 Filter Tip Rack 50 µL", "displayCategory": "tipRack", @@ -1373,23 +1419,43 @@ "namespace": "opentrons", "version": 1, "schemaVersion": 2, - "cornerOffsetFromSlot": { "x": 0, "y": 0, "z": 0 }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, "stackingOffsetWithLabware": { - "opentrons_flex_96_tiprack_adapter": { "x": 0, "y": 0, "z": 121 } + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121 + } } }, "opentrons/opentrons_96_flat_bottom_adapter/1": { "ordering": [], - "brand": { "brand": "Opentrons", "brandId": [] }, + "brand": { + "brand": "Opentrons", + "brandId": [] + }, "metadata": { "displayName": "Opentrons 96 Flat Bottom Heater-Shaker Adapter", "displayCategory": "adapter", "displayVolumeUnits": "µL", "tags": [] }, - "dimensions": { "xDimension": 111, "yDimension": 75, "zDimension": 7.9 }, + "dimensions": { + "xDimension": 111, + "yDimension": 75, + "zDimension": 7.9 + }, "wells": {}, - "groups": [{ "metadata": {}, "wells": [] }], + "groups": [ + { + "metadata": {}, + "wells": [] + } + ], "parameters": { "format": "96Standard", "quirks": [], @@ -1401,7 +1467,11 @@ "version": 1, "schemaVersion": 2, "allowedRoles": ["adapter"], - "cornerOffsetFromSlot": { "x": 8.5, "y": 5.5, "z": 0 } + "cornerOffsetFromSlot": { + "x": 8.5, + "y": 5.5, + "z": 0 + } }, "opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2": { "ordering": [ @@ -2304,7 +2374,9 @@ }, "groups": [ { - "metadata": { "wellBottomShape": "v" }, + "metadata": { + "wellBottomShape": "v" + }, "wells": [ "A1", "B1", @@ -2415,13 +2487,29 @@ "namespace": "opentrons", "version": 2, "schemaVersion": 2, - "cornerOffsetFromSlot": { "x": 0, "y": 0, "z": 0 }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, "stackingOffsetWithLabware": { - "opentrons_96_pcr_adapter": { "x": 0, "y": 0, "z": 10.2 }, - "opentrons_96_well_aluminum_block": { "x": 0, "y": 0, "z": 12.66 } + "opentrons_96_pcr_adapter": { + "x": 0, + "y": 0, + "z": 10.2 + }, + "opentrons_96_well_aluminum_block": { + "x": 0, + "y": 0, + "z": 12.66 + } }, "stackingOffsetWithModule": { - "thermocyclerModuleV2": { "x": 0, "y": 0, "z": 10.8 } + "thermocyclerModuleV2": { + "x": 0, + "y": 0, + "z": 10.8 + } } }, "opentrons/opentrons_24_aluminumblock_nest_1.5ml_snapcap/1": { @@ -2719,7 +2807,11 @@ "namespace": "opentrons", "version": 1, "schemaVersion": 2, - "cornerOffsetFromSlot": { "x": 0, "y": 0, "z": 0 } + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + } }, "opentrons/nest_96_wellplate_200ul_flat/2": { "ordering": [ @@ -3624,7 +3716,9 @@ }, "groups": [ { - "metadata": { "wellBottomShape": "flat" }, + "metadata": { + "wellBottomShape": "flat" + }, "wells": [ "A1", "B1", @@ -3734,10 +3828,22 @@ "namespace": "opentrons", "version": 2, "schemaVersion": 2, - "cornerOffsetFromSlot": { "x": 0, "y": 0, "z": 0 }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, "stackingOffsetWithLabware": { - "opentrons_96_flat_bottom_adapter": { "x": 0, "y": 0, "z": 6.7 }, - "opentrons_aluminum_flat_bottom_plate": { "x": 0, "y": 0, "z": 5.55 } + "opentrons_96_flat_bottom_adapter": { + "x": 0, + "y": 0, + "z": 6.7 + }, + "opentrons_aluminum_flat_bottom_plate": { + "x": 0, + "y": 0, + "z": 5.55 + } } } }, @@ -3757,7 +3863,7 @@ "commandSchemaId": "opentronsCommandSchemaV8", "commands": [ { - "key": "887aee95-507e-4e12-befb-fca0df6acd5b", + "key": "086f94d9-065f-4c44-8006-caf80b83783c", "commandType": "loadPipette", "params": { "pipetteName": "p1000_single_flex", @@ -3766,7 +3872,7 @@ } }, { - "key": "ef8f7d50-4fb2-42fc-96b2-1b09825f5de3", + "key": "505163b8-41fd-4983-93a7-be71a7d6ae9c", "commandType": "loadPipette", "params": { "pipetteName": "p50_multi_flex", @@ -3775,43 +3881,51 @@ } }, { - "key": "29625abf-a695-48ad-ae3f-74a484e5ed9b", + "key": "aec18895-04b5-4fef-a696-77741e3aea42", "commandType": "loadModule", "params": { "model": "magneticBlockV1", - "location": { "slotName": "D2" }, + "location": { + "slotName": "D2" + }, "moduleId": "1be16305-74e7-4bdb-9737-61ec726d2b44:magneticBlockType" } }, { - "key": "1ac087ae-c74a-4817-878d-98bdf3db848a", + "key": "f36b8ebe-0c9b-41bc-a1c0-eb754f7648f2", "commandType": "loadModule", "params": { "model": "heaterShakerModuleV1", - "location": { "slotName": "D1" }, + "location": { + "slotName": "D1" + }, "moduleId": "c19dffa3-cb34-4702-bcf6-dcea786257d1:heaterShakerModuleType" } }, { - "key": "92265fb4-87cf-4602-baf1-a1e42abf72b3", + "key": "8db7cf16-2bf4-404d-9112-08c448797f28", "commandType": "loadModule", "params": { "model": "temperatureModuleV2", - "location": { "slotName": "D3" }, + "location": { + "slotName": "D3" + }, "moduleId": "ef44ad7f-0fd9-46d6-8bc0-c70785644cc8:temperatureModuleType" } }, { - "key": "8ad9c496-dc5a-46dc-aabe-51917185f007", + "key": "cfe53e87-ab1d-487a-b48c-d7ae8f82da0f", "commandType": "loadModule", "params": { "model": "thermocyclerModuleV2", - "location": { "slotName": "B1" }, + "location": { + "slotName": "B1" + }, "moduleId": "627b7a27-5bb7-46de-a530-67af45652e3b:thermocyclerModuleType" } }, { - "key": "892a61fd-b3ba-44c8-8404-811992894b80", + "key": "625d5aa2-3b3e-4eea-8255-906705b30f56", "commandType": "loadLabware", "params": { "displayName": "Opentrons 96 Flat Bottom Heater-Shaker Adapter", @@ -3825,7 +3939,7 @@ } }, { - "key": "1ac6ba82-46d4-416e-a8b0-11c0fecf9140", + "key": "01f439b9-bd14-4b2a-829a-04dc59532b28", "commandType": "loadLabware", "params": { "displayName": "Opentrons Flex 96 Filter Tip Rack 50 µL", @@ -3833,11 +3947,13 @@ "loadName": "opentrons_flex_96_filtertiprack_50ul", "namespace": "opentrons", "version": 1, - "location": { "slotName": "C1" } + "location": { + "slotName": "C1" + } } }, { - "key": "980857c6-a7d8-45e6-8288-7b046e10ac3e", + "key": "ce2c9a52-8e8c-4499-a9f4-28d875310ddc", "commandType": "loadLabware", "params": { "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", @@ -3851,7 +3967,7 @@ } }, { - "key": "dbe0a5ac-1af4-4002-8abb-8f525d2ddb68", + "key": "8e919382-c46f-4715-8acc-3e89d9ad20da", "commandType": "loadLabware", "params": { "displayName": "Opentrons 24 Well Aluminum Block with NEST 1.5 mL Snapcap", @@ -3865,7 +3981,7 @@ } }, { - "key": "9751e295-7340-4f63-bdb2-b906a2d7b533", + "key": "e3c83855-cea3-4c64-9a83-4569d7ec6c1c", "commandType": "loadLabware", "params": { "displayName": "NEST 96 Well Plate 200 µL Flat", @@ -3880,16 +3996,18 @@ }, { "commandType": "loadLiquid", - "key": "0af3791b-6921-4c06-a79d-227342db1d93", + "key": "4e2f124b-fdbd-4468-b13f-ff623614c7d5", "params": { "liquidId": "1", "labwareId": "a793a135-06aa-4ed6-a1d3-c176c7810afa:opentrons/opentrons_24_aluminumblock_nest_1.5ml_snapcap/1", - "volumeByWell": { "A1": 1000 } + "volumeByWell": { + "A1": 1000 + } } }, { "commandType": "loadLiquid", - "key": "08e9de43-643d-48bd-a9d9-2d5df8685ffd", + "key": "d1b5d49e-0c3a-4fcf-8908-d5683f62ef8d", "params": { "liquidId": "0", "labwareId": "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", @@ -3907,7 +4025,7 @@ }, { "commandType": "temperatureModule/setTargetTemperature", - "key": "db0ef747-eb15-4392-a794-f0d1e4dbccda", + "key": "92fc9b4c-1952-447a-a6fa-d3f8c572f74c", "params": { "moduleId": "ef44ad7f-0fd9-46d6-8bc0-c70785644cc8:temperatureModuleType", "celsius": 4 @@ -3915,7 +4033,7 @@ }, { "commandType": "heaterShaker/waitForTemperature", - "key": "4aacf1f1-deeb-4b2a-9000-c0280faa4687", + "key": "a0a69251-318f-42df-953f-de79a0caf8c7", "params": { "moduleId": "c19dffa3-cb34-4702-bcf6-dcea786257d1:heaterShakerModuleType", "celsius": 4 @@ -3923,14 +4041,14 @@ }, { "commandType": "thermocycler/closeLid", - "key": "7c7d8790-6b8e-47f5-8fe4-8a752646bb48", + "key": "86747e7e-5adf-4739-8372-da00fd6081f0", "params": { "moduleId": "627b7a27-5bb7-46de-a530-67af45652e3b:thermocyclerModuleType" } }, { "commandType": "thermocycler/setTargetLidTemperature", - "key": "3d4b0df9-e2db-4a47-9cb5-78965dfd53df", + "key": "2c00f180-7898-461e-a7a2-d087e92812bb", "params": { "moduleId": "627b7a27-5bb7-46de-a530-67af45652e3b:thermocyclerModuleType", "celsius": 40 @@ -3938,47 +4056,53 @@ }, { "commandType": "thermocycler/waitForLidTemperature", - "key": "df7b47c3-4a1d-417e-8148-114eff720a7e", + "key": "64440fd5-a728-4ad3-b5ac-8f952d0f6a10", "params": { "moduleId": "627b7a27-5bb7-46de-a530-67af45652e3b:thermocyclerModuleType" } }, { "commandType": "thermocycler/runProfile", - "key": "749ef412-772e-4df5-b9f5-6611d50b7a36", + "key": "b5b4ff79-43a7-4ff5-91a1-fdc9e481190a", "params": { "moduleId": "627b7a27-5bb7-46de-a530-67af45652e3b:thermocyclerModuleType", "profile": [ - { "holdSeconds": 60, "celsius": 4 }, - { "holdSeconds": 120, "celsius": 10 } + { + "holdSeconds": 60, + "celsius": 4 + }, + { + "holdSeconds": 120, + "celsius": 10 + } ], "blockMaxVolumeUl": 10 } }, { "commandType": "thermocycler/deactivateBlock", - "key": "8ad948e1-d18b-4f79-a8bf-1ab607656b36", + "key": "4105ee32-8759-4410-b87f-15d19fa555dd", "params": { "moduleId": "627b7a27-5bb7-46de-a530-67af45652e3b:thermocyclerModuleType" } }, { "commandType": "thermocycler/deactivateLid", - "key": "69de8a1f-6790-4a4d-afe9-35b4c39068a1", + "key": "7b8c3e27-58d7-4385-a1e9-3e4353b6c837", "params": { "moduleId": "627b7a27-5bb7-46de-a530-67af45652e3b:thermocyclerModuleType" } }, { "commandType": "thermocycler/openLid", - "key": "492b24b0-11c5-4bcb-9ae7-5eede69948a5", + "key": "155179f3-86a7-4588-ade0-7f68fe5f0254", "params": { "moduleId": "627b7a27-5bb7-46de-a530-67af45652e3b:thermocyclerModuleType" } }, { "commandType": "pickUpTip", - "key": "48daaa83-b255-47e7-8153-3877b8e6f07e", + "key": "4460ed34-d392-47ec-acc1-be1b1193282e", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -3987,7 +4111,7 @@ }, { "commandType": "aspirate", - "key": "270b0416-b790-4e2d-b1c1-8936d6208471", + "key": "5d23683a-9a8b-4e0f-a934-faf55d04e62b", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -3995,14 +4119,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 478 } }, { "commandType": "dispense", - "key": "055f0831-391f-44f4-a948-cc9219d9afa8", + "key": "2ce5f9af-f4d3-4467-92f1-4a748db40c60", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4010,29 +4138,39 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 478 } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "1d2ab878-315f-4b7d-9f4f-2c8ea6a97fe2", + "key": "a6c0a9ba-3986-4c58-9423-30d802dc7aa4", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", - "offset": { "x": 0, "y": 0, "z": 0 }, + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, "alternateDropLocation": true } }, { "commandType": "dropTipInPlace", - "key": "94fb65ce-697c-49b5-bc4e-fb0cc3500007", - "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } + "key": "0e93144b-9c3d-4444-b69e-a2aa5a731886", + "params": { + "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" + } }, { "commandType": "pickUpTip", - "key": "764e4c75-458a-4d8f-9a7f-e9d63da2cbc5", + "key": "5a636309-7090-49fc-8630-c1d00b014427", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4041,7 +4179,7 @@ }, { "commandType": "aspirate", - "key": "dc4fd07a-a653-4bd7-bf7e-43ab5e24b80d", + "key": "dfe14619-1011-4e6d-a6f5-ec4412332cb1", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4049,14 +4187,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 478 } }, { "commandType": "dispense", - "key": "eb6976b2-6b88-40fc-a0b7-ad72d959fe7e", + "key": "d47fae77-e4b8-47bd-8749-ed3b1ae597a5", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4064,29 +4206,39 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 478 } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "0a696e1d-e207-49d0-875a-a10b50ed1f5a", + "key": "152e5896-8695-4805-b85c-819db216921c", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", - "offset": { "x": 0, "y": 0, "z": 0 }, + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, "alternateDropLocation": true } }, { "commandType": "dropTipInPlace", - "key": "b39fa5a0-63dc-4cc7-92ce-828b345324ef", - "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } + "key": "a85f27c1-2384-4da8-98a8-108836e8eb71", + "params": { + "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" + } }, { "commandType": "pickUpTip", - "key": "06ef1868-96d0-4dd1-b85e-167da4ea05f0", + "key": "d45ffd65-eff6-4a8b-bd6f-5abde6dbf388", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4095,7 +4247,7 @@ }, { "commandType": "aspirate", - "key": "8d957583-f0ba-4799-9fb7-5bb73fefcf75", + "key": "ea9a5388-329c-4587-8363-549269e6a4c8", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4103,14 +4255,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 478 } }, { "commandType": "dispense", - "key": "bc58797b-31ae-4b87-829b-84f9b5c5446e", + "key": "d496cd3f-2189-438e-b9d5-95c698d8a6c0", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4118,29 +4274,39 @@ "wellName": "B1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 478 } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "c2f0bccf-03b1-4069-8b95-3657b32d841f", + "key": "7c444a4b-626d-449c-98a9-beeaf09e9196", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", - "offset": { "x": 0, "y": 0, "z": 0 }, + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, "alternateDropLocation": true } }, { "commandType": "dropTipInPlace", - "key": "e14328bc-0b63-48e4-99ad-43be80f4fd2d", - "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } + "key": "168dc853-1c29-4304-aa4c-5d706d2863a9", + "params": { + "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" + } }, { "commandType": "pickUpTip", - "key": "3f605100-7eed-467b-8783-8ffdcf9b7fa7", + "key": "3e501992-3a68-48a3-8a35-c97f6d922fb5", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4149,7 +4315,7 @@ }, { "commandType": "aspirate", - "key": "8bfe3f3f-265f-4efe-b15a-2f514518bcef", + "key": "e414d931-38f5-4ca3-93e0-28ab8d09a5ce", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4157,14 +4323,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 478 } }, { "commandType": "dispense", - "key": "03a5fc4d-da4c-4a35-9b83-43c098b89fbe", + "key": "1b30be1e-9ab1-4ad2-8528-d0aac15649be", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4172,29 +4342,39 @@ "wellName": "B1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 478 } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "02f8b32b-f284-45b9-a87c-9fbebd0a9643", + "key": "333263db-9887-48f9-9cec-5e76264d02de", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", - "offset": { "x": 0, "y": 0, "z": 0 }, + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, "alternateDropLocation": true } }, { "commandType": "dropTipInPlace", - "key": "ed9a198d-8be1-4633-91ff-2b2a3d76d42c", - "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } + "key": "0613a633-8c69-4273-a40b-25f7d432b9ef", + "params": { + "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" + } }, { "commandType": "pickUpTip", - "key": "f191fabd-2496-40cb-a7d6-8f3ec117d115", + "key": "dce17552-dc58-4420-9566-720bd62d2723", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4203,7 +4383,7 @@ }, { "commandType": "aspirate", - "key": "8a354f35-1aa1-4a96-b0ea-67411d21cb2c", + "key": "d102217f-33c0-4f6d-81e8-ebfa23227b3b", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4211,14 +4391,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 478 } }, { "commandType": "dispense", - "key": "b44e4449-c28e-4aae-b269-a1d382634a98", + "key": "5624dd4a-9428-4764-b72b-854c372ac9b9", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4226,29 +4410,39 @@ "wellName": "C1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 478 } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "d81b7400-11c0-458b-b18e-6fe0c2eda148", + "key": "c9bb306f-9769-4fdf-8425-e6ef485b8053", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", - "offset": { "x": 0, "y": 0, "z": 0 }, + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, "alternateDropLocation": true } }, { "commandType": "dropTipInPlace", - "key": "51c547bd-a33f-47b8-8d83-6bbe3bcd100e", - "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } + "key": "4d34ac41-1e14-47dc-bddd-e035bc34562c", + "params": { + "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" + } }, { "commandType": "pickUpTip", - "key": "18d87e96-962d-4d43-802d-aee8b786485e", + "key": "0737c0cc-cf01-4fa0-b624-ba162f8a5daf", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4257,7 +4451,7 @@ }, { "commandType": "aspirate", - "key": "2f67c8b4-3946-4270-951a-ef0615cd350c", + "key": "d121c382-86f2-4743-b043-d8f3606186de", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4265,14 +4459,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 478 } }, { "commandType": "dispense", - "key": "0120cb1c-3610-43f6-b521-529aea32b8ac", + "key": "5b3da3c8-578e-4570-a9c0-12ba4eccd8ef", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4280,29 +4478,39 @@ "wellName": "C1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 478 } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "de434c5e-7d65-4c86-9f0e-faa91e81f8cc", + "key": "7a73f125-8cea-4846-9503-b1c15b16ca7f", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", - "offset": { "x": 0, "y": 0, "z": 0 }, + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, "alternateDropLocation": true } }, { "commandType": "dropTipInPlace", - "key": "337efcb1-c1ad-4564-9ac3-c626c222ffe8", - "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } + "key": "ad8346ba-09c0-48e5-a4e2-585992b780ff", + "params": { + "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" + } }, { "commandType": "pickUpTip", - "key": "df4d642a-bab5-4dd4-94c1-cca74d57d7b4", + "key": "bb55a704-2741-4543-8ec9-9d7cbe646913", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4311,7 +4519,7 @@ }, { "commandType": "aspirate", - "key": "02e1ddb4-50b7-4578-b79d-7b4e3e14ffe6", + "key": "fa987ffe-4b77-4f23-87e3-26ffff498da2", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4319,14 +4527,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 478 } }, { "commandType": "dispense", - "key": "493e252e-258d-4a2e-88ff-5c78373cbdd9", + "key": "e2fead50-1166-45a6-9a7c-19239a635dcb", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4334,29 +4546,39 @@ "wellName": "D1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 478 } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "4c580d3a-6195-4782-a7c0-ea8967887ba9", + "key": "37bd2126-ea04-43d9-8153-abca7aa37bf2", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", - "offset": { "x": 0, "y": 0, "z": 0 }, + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, "alternateDropLocation": true } }, { "commandType": "dropTipInPlace", - "key": "50839851-407c-47a7-83ff-0f8d776c5114", - "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } + "key": "f2254539-3d1c-475f-9545-2254338bc877", + "params": { + "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" + } }, { "commandType": "pickUpTip", - "key": "da3ab40c-1e79-4a12-96b0-912fd05e3cfa", + "key": "d238b33c-0a51-4593-884d-f294ca9b34bd", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4365,7 +4587,7 @@ }, { "commandType": "aspirate", - "key": "890aa1c0-86c4-489c-8c67-6b4713d8a926", + "key": "d8cc4fb2-c789-4c19-a279-3ab277db620a", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4373,14 +4595,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 478 } }, { "commandType": "dispense", - "key": "17b87840-4838-43d9-ae4e-7466423dd94c", + "key": "04130047-9fc1-4a1d-a437-6d35c9bbc736", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4388,29 +4614,39 @@ "wellName": "D1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 478 } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "9c3a705f-97cf-40cc-99f2-9b1629f76c47", + "key": "ea98ad61-5358-4695-aeac-5c45e45f3945", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", - "offset": { "x": 0, "y": 0, "z": 0 }, + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, "alternateDropLocation": true } }, { "commandType": "dropTipInPlace", - "key": "1621491e-e703-421a-8d72-244f4d916eef", - "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } + "key": "aa748779-1bee-4277-9a0b-cef4c9596db2", + "params": { + "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" + } }, { "commandType": "pickUpTip", - "key": "604c0c35-ef7a-4d97-9cd2-d2ceacdb3a79", + "key": "1104a432-4c46-4048-a167-66935bcbbe46", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4419,7 +4655,7 @@ }, { "commandType": "aspirate", - "key": "9beb1dba-1af3-4de5-a435-c9ce2e803a1f", + "key": "96051ed2-d577-406e-8fcc-6d57489b8098", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4427,14 +4663,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 478 } }, { "commandType": "dispense", - "key": "ec47755c-f777-4a67-a7e4-88e3c5dc079f", + "key": "2aa56498-12ea-4ed1-8d1f-cfc771631231", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4442,29 +4682,39 @@ "wellName": "E1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 478 } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "130577d9-f904-460f-b0d8-8906c3208ba5", + "key": "feec6043-4715-4e0f-8ffb-c7e11625b8ae", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", - "offset": { "x": 0, "y": 0, "z": 0 }, + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, "alternateDropLocation": true } }, { "commandType": "dropTipInPlace", - "key": "fd629662-f71d-4d06-8731-b9a1c4b86240", - "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } + "key": "18c174f1-00c7-4429-a00d-1fb23fa1ab95", + "params": { + "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" + } }, { "commandType": "pickUpTip", - "key": "a73b0c2e-2cb2-48ae-8aa2-884c9c38ced4", + "key": "c6e4b756-57e6-4b99-a13f-b4cc9f68007e", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4473,7 +4723,7 @@ }, { "commandType": "aspirate", - "key": "b48548ce-b630-4923-a47d-1168bfd99bc3", + "key": "f2d8efcd-563d-400e-a517-19c2e5b6daff", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4481,14 +4731,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 478 } }, { "commandType": "dispense", - "key": "869ef98e-183c-404f-ab56-0239836a53bc", + "key": "a167d2fa-005b-4cd7-b877-bc9bc7118576", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4496,29 +4750,39 @@ "wellName": "E1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 478 } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "1eb6b94f-b928-4ae2-b54d-60a6ad685261", + "key": "d9b25719-f389-47d7-969c-f4b9d5eac924", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", - "offset": { "x": 0, "y": 0, "z": 0 }, + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, "alternateDropLocation": true } }, { "commandType": "dropTipInPlace", - "key": "d451de07-77c8-4447-9bee-6e02ecb6c9a8", - "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } + "key": "f120bb0a-aeb5-456f-9400-61c0d086405c", + "params": { + "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" + } }, { "commandType": "pickUpTip", - "key": "e3b57c34-8862-488f-882a-a6c0ed3aab91", + "key": "181f302a-6f86-43ea-8bec-34787329ea91", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4527,7 +4791,7 @@ }, { "commandType": "aspirate", - "key": "7bfcee1f-c539-4f71-86fd-2a4ce45e72c5", + "key": "7af713fd-92ec-4125-9fdc-c4caf6d96881", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4535,14 +4799,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 478 } }, { "commandType": "dispense", - "key": "1933daa4-0769-4b1a-85a3-662009a08ff3", + "key": "74f0f1d4-ede7-4034-bb8a-569af6e51116", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4550,29 +4818,39 @@ "wellName": "F1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 478 } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "be69e705-e90b-45ba-b80a-d750a69fbf00", + "key": "e1062927-fbc0-43f4-aec0-2c4db796f520", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", - "offset": { "x": 0, "y": 0, "z": 0 }, + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, "alternateDropLocation": true } }, { "commandType": "dropTipInPlace", - "key": "f70cf632-8b51-425d-b038-8a15ff2646bd", - "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } + "key": "4fb208b2-406f-41d9-bd75-1bb25c7b6090", + "params": { + "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" + } }, { "commandType": "pickUpTip", - "key": "70420b51-c232-4a9a-b7f8-b71ae7d1c44a", + "key": "99e371f5-ac49-40f5-b077-0ba095fb8b0e", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4581,7 +4859,7 @@ }, { "commandType": "aspirate", - "key": "a4a03e0f-a624-4a2e-8474-4ce0e584c692", + "key": "36456527-abc3-46b3-9be8-d8c3e35d7589", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4589,14 +4867,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 478 } }, { "commandType": "dispense", - "key": "21151169-b36b-47bf-ad6a-6d736975b965", + "key": "fcc09ee3-1280-42ad-9c96-5a35cc7e3682", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4604,29 +4886,39 @@ "wellName": "F1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 478 } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "3ec664a4-e16e-47db-8165-f77243dc94ee", + "key": "973f8392-57e1-4436-8ff3-066370111552", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", - "offset": { "x": 0, "y": 0, "z": 0 }, + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, "alternateDropLocation": true } }, { "commandType": "dropTipInPlace", - "key": "7d14859f-aa90-4eb7-847f-3dfd0bb38ad6", - "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } + "key": "61e589ec-3621-4296-832e-ddf05ed87d71", + "params": { + "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" + } }, { "commandType": "pickUpTip", - "key": "49a3b10f-2a40-4564-9663-183f915f065f", + "key": "dee716cf-0a38-434f-87cf-ed2db7753f22", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4635,7 +4927,7 @@ }, { "commandType": "aspirate", - "key": "9fde5527-9494-4db3-83a7-87fe9dc4d8f9", + "key": "2de3cf3c-ec05-4c71-8da5-5f202dd2067d", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4643,14 +4935,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 478 } }, { "commandType": "dispense", - "key": "f4cdf6e2-b8b6-44be-8979-ba02dba58dca", + "key": "27a832fc-a5da-4c38-ba4f-53fe056a3289", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4658,29 +4954,39 @@ "wellName": "G1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 478 } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "3349573e-f925-4505-8223-5281cd79131e", + "key": "272a9711-02c5-4290-8ef5-82c66ae6db99", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", - "offset": { "x": 0, "y": 0, "z": 0 }, + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, "alternateDropLocation": true } }, { "commandType": "dropTipInPlace", - "key": "634d3638-535c-4dd9-8544-bc01a293699c", - "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } + "key": "9b5c566f-2fb7-4803-9f87-d613609a1766", + "params": { + "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" + } }, { "commandType": "pickUpTip", - "key": "8fcca86a-4d50-4546-98ac-8af62f0d0650", + "key": "c4e4cc2b-1151-471b-82d4-75291a5a85fc", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4689,7 +4995,7 @@ }, { "commandType": "aspirate", - "key": "6a74770f-dca5-4819-8af5-4d322616aef9", + "key": "134995c4-0c67-4fbc-be2a-60c9284e30a9", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4697,14 +5003,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 478 } }, { "commandType": "dispense", - "key": "eb283f45-95a1-414a-a125-c98649b2d5ff", + "key": "4db8313b-64f1-499b-9f52-4df29c5d4ca7", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4712,29 +5022,39 @@ "wellName": "G1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 478 } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "a16f16d6-2d46-40c7-a133-4f9abd72cf48", + "key": "f2bbe525-de0c-4309-90c9-d09ca189f8de", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", - "offset": { "x": 0, "y": 0, "z": 0 }, + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, "alternateDropLocation": true } }, { "commandType": "dropTipInPlace", - "key": "fb5846b6-0d7b-4747-b27f-fd6f2d2f1575", - "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } + "key": "56125dae-842e-45c7-af67-ffdeb9fb6869", + "params": { + "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" + } }, { "commandType": "pickUpTip", - "key": "d90d2351-8a74-4912-9e46-5c9635de351d", + "key": "d2b518d3-97d0-4a59-80c7-7a73a64579d3", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4743,7 +5063,7 @@ }, { "commandType": "aspirate", - "key": "e143a895-a495-4e36-899d-ae2ca6d3bda6", + "key": "72198d46-cbfb-4b7a-9a26-d1ea9f7dff77", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4751,14 +5071,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 478 } }, { "commandType": "dispense", - "key": "87c77c51-adb3-49fa-ad44-9288625d4b35", + "key": "138f0bf8-14f1-431b-9db6-8566a9078e83", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4766,29 +5090,39 @@ "wellName": "H1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 478 } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "6f7d9b7e-9483-4611-8017-a16229d0dfe0", + "key": "a6f012e5-f1e3-46fe-8243-4f64987786bf", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", - "offset": { "x": 0, "y": 0, "z": 0 }, + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, "alternateDropLocation": true } }, { "commandType": "dropTipInPlace", - "key": "628753d7-3932-4632-a5ec-a41795c9c774", - "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } + "key": "c3f57ad8-cf7d-42ba-b009-f62e309b9c7c", + "params": { + "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" + } }, { "commandType": "pickUpTip", - "key": "bbbfc586-62ca-40c0-8024-1913916a5ac4", + "key": "6590c871-dbef-474b-86f8-1c4b71388df2", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4797,7 +5131,7 @@ }, { "commandType": "aspirate", - "key": "b6123803-d123-4c3c-a51c-db80ffe80926", + "key": "ce93c608-81b7-4a26-b5fd-b6cfa4004ce4", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4805,14 +5139,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 478 } }, { "commandType": "dispense", - "key": "e17617fc-2e85-43a5-a67b-15f7eff630ee", + "key": "6c20edf3-2d8e-48e1-b872-708e23b71e5d", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4820,29 +5158,39 @@ "wellName": "H1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 478 } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "60b55771-dbf8-460f-88b6-a6511398b61b", + "key": "4ae15bd8-e502-4267-a1ef-844ccd97fe73", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", - "offset": { "x": 0, "y": 0, "z": 0 }, + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, "alternateDropLocation": true } }, { "commandType": "dropTipInPlace", - "key": "2be58694-e996-4547-84d7-47b63b7b5cb7", - "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } + "key": "9358bb52-e112-4ac8-ac27-c75fa3a31129", + "params": { + "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" + } }, { "commandType": "pickUpTip", - "key": "adc4dc42-ed18-4549-a922-186e5d8c8e91", + "key": "1e35aa06-95f7-4073-8f8f-68fdc557e3bc", "params": { "pipetteId": "6d1e53c3-2db3-451b-ad60-3fe13781a193", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4851,7 +5199,7 @@ }, { "commandType": "configureForVolume", - "key": "81502381-d22e-435c-a1c6-a6561abf4c14", + "key": "1953c27c-abd9-4284-80b5-42c1df10bfa9", "params": { "pipetteId": "6d1e53c3-2db3-451b-ad60-3fe13781a193", "volume": 10 @@ -4859,7 +5207,7 @@ }, { "commandType": "aspirate", - "key": "9d0eef4b-26e2-4b6d-bf83-72b57f00247d", + "key": "ae530f5a-e921-4cbb-bea2-8563e38d6966", "params": { "pipetteId": "6d1e53c3-2db3-451b-ad60-3fe13781a193", "volume": 10, @@ -4867,14 +5215,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 0.5, "x": 0, "y": 0 } + "offset": { + "z": 0.5, + "x": 0, + "y": 0 + } }, "flowRate": 35 } }, { "commandType": "dispense", - "key": "b689a855-ff45-46d6-8f99-96f5b3480122", + "key": "756cfa2f-0df6-4d73-8dd0-4869c25aaa00", "params": { "pipetteId": "6d1e53c3-2db3-451b-ad60-3fe13781a193", "volume": 10, @@ -4882,14 +5234,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 0.5, "x": 0, "y": 0 } + "offset": { + "z": 0.5, + "x": 0, + "y": 0 + } }, "flowRate": 57 } }, { "commandType": "aspirate", - "key": "a6567fc7-664e-4d28-861f-8620923fc83f", + "key": "e12837d4-0bc3-454e-80a5-a530a046b03c", "params": { "pipetteId": "6d1e53c3-2db3-451b-ad60-3fe13781a193", "volume": 10, @@ -4897,14 +5253,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 0.5, "x": 0, "y": 0 } + "offset": { + "z": 0.5, + "x": 0, + "y": 0 + } }, "flowRate": 35 } }, { "commandType": "dispense", - "key": "68593075-6c39-485d-8fee-4cea9c3e5eb0", + "key": "1435fcd2-2e3d-480b-9b3c-c606b83e1507", "params": { "pipetteId": "6d1e53c3-2db3-451b-ad60-3fe13781a193", "volume": 10, @@ -4912,66 +5272,83 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 0.5, "x": 0, "y": 0 } + "offset": { + "z": 0.5, + "x": 0, + "y": 0 + } }, "flowRate": 57 } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "4137561c-659a-4d7a-9e8a-c05aa15d4891", + "key": "3e9986af-42fe-4168-b49d-67b25072aedb", "params": { "pipetteId": "6d1e53c3-2db3-451b-ad60-3fe13781a193", "addressableAreaName": "movableTrashA3", - "offset": { "x": 0, "y": 0, "z": 0 }, + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, "alternateDropLocation": true } }, { "commandType": "dropTipInPlace", - "key": "a5389c1e-2544-44ae-9b03-a3464899f971", - "params": { "pipetteId": "6d1e53c3-2db3-451b-ad60-3fe13781a193" } + "key": "c51cf48c-ff9f-4329-b2bb-475589c03cc8", + "params": { + "pipetteId": "6d1e53c3-2db3-451b-ad60-3fe13781a193" + } }, { "commandType": "moveLabware", - "key": "950063e3-0e7c-4859-a513-45e7a39444ab", + "key": "ca2b894f-a4d4-425a-b85b-9954f9b61819", "params": { "labwareId": "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", "strategy": "usingGripper", - "newLocation": { "slotName": "B2" } + "newLocation": { + "slotName": "B2" + } } }, { "commandType": "waitForDuration", - "key": "55dd1085-976e-4145-b4fe-2a6797e0d8be", - "params": { "seconds": 60, "message": "" } + "key": "4f455d59-03a6-4b79-be48-64db49d6ff59", + "params": { + "seconds": 60, + "message": "" + } }, { "commandType": "moveLabware", - "key": "5e1ac5e8-1da6-4fb9-a11c-b078d693afa0", + "key": "4481fc65-451f-4c8f-aa14-2b369a600312", "params": { "labwareId": "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", "strategy": "usingGripper", - "newLocation": { "slotName": "C3" } + "newLocation": { + "slotName": "C3" + } } }, { "commandType": "heaterShaker/closeLabwareLatch", - "key": "c27f07bc-657a-4aae-942a-50df0a2ad167", + "key": "3e22fda8-3a29-4ec1-a8c5-4a1c2311537b", "params": { "moduleId": "c19dffa3-cb34-4702-bcf6-dcea786257d1:heaterShakerModuleType" } }, { "commandType": "heaterShaker/deactivateHeater", - "key": "058c70b9-7a15-4d4b-80f6-f5d8f0437c81", + "key": "68523f3c-f1be-46ec-b235-768fad253de5", "params": { "moduleId": "c19dffa3-cb34-4702-bcf6-dcea786257d1:heaterShakerModuleType" } }, { "commandType": "heaterShaker/setAndWaitForShakeSpeed", - "key": "182690d7-0c0a-4cb7-9022-85cca4761637", + "key": "364c37d4-826a-4d67-ae4a-8c3a4f246577", "params": { "moduleId": "c19dffa3-cb34-4702-bcf6-dcea786257d1:heaterShakerModuleType", "rpm": 500 @@ -4979,28 +5356,28 @@ }, { "commandType": "heaterShaker/deactivateHeater", - "key": "a2e67135-b880-449d-b114-58bd02a3de57", + "key": "d5c426ba-1acc-440c-939b-9c0be548a4a3", "params": { "moduleId": "c19dffa3-cb34-4702-bcf6-dcea786257d1:heaterShakerModuleType" } }, { "commandType": "heaterShaker/deactivateShaker", - "key": "727d5986-def0-4c44-b337-1f327f68f908", + "key": "ff1818d5-6f75-44f5-bfd2-fe5bc202e050", "params": { "moduleId": "c19dffa3-cb34-4702-bcf6-dcea786257d1:heaterShakerModuleType" } }, { "commandType": "heaterShaker/openLabwareLatch", - "key": "6b2ed1dd-3d71-45b0-84f5-fb7153a6f325", + "key": "497f9b04-7d40-47ae-9a87-185280821361", "params": { "moduleId": "c19dffa3-cb34-4702-bcf6-dcea786257d1:heaterShakerModuleType" } }, { "commandType": "moveLabware", - "key": "f2ecdb28-afae-4342-b441-61fe38d9e069", + "key": "1ab82be8-439a-4c7f-ae3d-2421bc2b85a6", "params": { "labwareId": "a793a135-06aa-4ed6-a1d3-c176c7810afa:opentrons/opentrons_24_aluminumblock_nest_1.5ml_snapcap/1", "strategy": "manualMoveWithPause", @@ -5009,11 +5386,13 @@ }, { "commandType": "moveLabware", - "key": "8f88f8b7-69dd-43c2-b3ce-0404a80c13a6", + "key": "6dc1e703-64ee-48ad-a5e5-451ce9eb917a", "params": { "labwareId": "239ceac8-23ec-4900-810a-70aeef880273:opentrons/nest_96_wellplate_200ul_flat/2", "strategy": "manualMoveWithPause", - "newLocation": { "slotName": "C2" } + "newLocation": { + "slotName": "C2" + } } } ], diff --git a/protocol-designer/fixtures/protocol/8/doItAllV8.json b/protocol-designer/fixtures/protocol/8/doItAllV8.json index 9206bdcf267..ce0ea883b0f 100644 --- a/protocol-designer/fixtures/protocol/8/doItAllV8.json +++ b/protocol-designer/fixtures/protocol/8/doItAllV8.json @@ -6,16 +6,16 @@ "author": "", "description": "", "created": 1701659107408, - "lastModified": 1731356308207, + "lastModified": 1738157218097, "category": null, "subcategory": null, "tags": [] }, "designerApplication": { "name": "opentrons/protocol-designer", - "version": "8.2.2", + "version": "8.5.0", "data": { - "_internalAppBuildDate": "Mon, 11 Nov 2024 20:18:16 GMT", + "_internalAppBuildDate": "Wed, 29 Jan 2025 13:23:47 GMT", "defaultValues": { "aspirate_mmFromBottom": 1, "dispense_mmFromBottom": 1, @@ -27,7 +27,10 @@ "opentrons/opentrons_flex_96_tiprack_1000ul/1" ] }, - "dismissedWarnings": { "form": [], "timeline": [] }, + "dismissedWarnings": { + "form": [], + "timeline": [] + }, "ingredients": { "0": { "name": "h20", @@ -46,17 +49,53 @@ }, "ingredLocations": { "8bacda22-9e05-45e8-bef4-cc04414a204f:opentrons/axygen_1_reservoir_90ml/1": { - "A1": { "0": { "volume": 10000 } } + "A1": { + "0": { + "volume": 10000 + } + } }, "54370838-4fca-4a14-b88a-7840e4903649:opentrons/opentrons_96_wellplate_200ul_pcr_full_skirt/2": { - "A1": { "1": { "volume": 100 } }, - "B1": { "1": { "volume": 100 } }, - "C1": { "1": { "volume": 100 } }, - "D1": { "1": { "volume": 100 } }, - "E1": { "1": { "volume": 100 } }, - "F1": { "1": { "volume": 100 } }, - "G1": { "1": { "volume": 100 } }, - "H1": { "1": { "volume": 100 } } + "A1": { + "1": { + "volume": 100 + } + }, + "B1": { + "1": { + "volume": 100 + } + }, + "C1": { + "1": { + "volume": 100 + } + }, + "D1": { + "1": { + "volume": 100 + } + }, + "E1": { + "1": { + "volume": 100 + } + }, + "F1": { + "1": { + "volume": 100 + } + }, + "G1": { + "1": { + "volume": 100 + } + }, + "H1": { + "1": { + "volume": 100 + } + } } }, "savedStepForms": { @@ -121,7 +160,7 @@ "aspirate_mix_volume": null, "aspirate_mmFromBottom": null, "aspirate_touchTip_checkbox": false, - "aspirate_touchTip_mmFromBottom": null, + "aspirate_touchTip_mmFromTop": null, "aspirate_wellOrder_first": "t2b", "aspirate_wellOrder_second": "l2r", "aspirate_wells_grouped": false, @@ -145,7 +184,7 @@ "dispense_mix_volume": null, "dispense_mmFromBottom": null, "dispense_touchTip_checkbox": false, - "dispense_touchTip_mmFromBottom": null, + "dispense_touchTip_mmFromTop": null, "dispense_wellOrder_first": "t2b", "dispense_wellOrder_second": "l2r", "dispense_wells": ["A1", "B1", "C1", "D1", "E1", "F1", "G1", "H1"], @@ -160,10 +199,11 @@ "preWetTip": false, "tipRack": "opentrons/opentrons_flex_96_tiprack_1000ul/1", "volume": "100", - "id": "d2f74144-a7bf-4ba2-aaab-30d70b2b62c7", "stepType": "moveLiquid", "stepName": "transfer", - "stepDetails": "" + "stepDetails": "", + "id": "d2f74144-a7bf-4ba2-aaab-30d70b2b62c7", + "dispense_touchTip_mmfromTop": null }, "240a2c96-3db8-4679-bdac-049306b7b9c4": { "blockIsActive": true, @@ -306,7 +346,10 @@ ] } }, - "robot": { "model": "OT-3 Standard", "deckId": "ot3_standard" }, + "robot": { + "model": "OT-3 Standard", + "deckId": "ot3_standard" + }, "labwareDefinitionSchemaId": "opentronsLabwareSchemaV2", "labwareDefinitions": { "opentrons/opentrons_flex_96_tiprack_1000ul/1": { @@ -324,7 +367,10 @@ ["A11", "B11", "C11", "D11", "E11", "F11", "G11", "H11"], ["A12", "B12", "C12", "D12", "E12", "F12", "G12", "H12"] ], - "brand": { "brand": "Opentrons", "brandId": [] }, + "brand": { + "brand": "Opentrons", + "brandId": [] + }, "metadata": { "displayName": "Opentrons Flex 96 Tip Rack 1000 µL", "displayCategory": "tipRack", @@ -1319,9 +1365,17 @@ "namespace": "opentrons", "version": 1, "schemaVersion": 2, - "cornerOffsetFromSlot": { "x": 0, "y": 0, "z": 0 }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, "stackingOffsetWithLabware": { - "opentrons_flex_96_tiprack_adapter": { "x": 0, "y": 0, "z": 121 } + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121 + } } }, "opentrons/opentrons_96_pcr_adapter/1": { @@ -1339,7 +1393,10 @@ ["A11", "B11", "C11", "D11", "E11", "F11", "G11", "H11"], ["A12", "B12", "C12", "D12", "E12", "F12", "G12", "H12"] ], - "brand": { "brand": "Opentrons", "brandId": [] }, + "brand": { + "brand": "Opentrons", + "brandId": [] + }, "metadata": { "displayName": "Opentrons 96 PCR Heater-Shaker Adapter", "displayCategory": "adapter", @@ -2219,7 +2276,9 @@ }, "groups": [ { - "metadata": { "wellBottomShape": "v" }, + "metadata": { + "wellBottomShape": "v" + }, "wells": [ "A1", "B1", @@ -2331,11 +2390,23 @@ "version": 1, "schemaVersion": 2, "allowedRoles": ["adapter"], - "cornerOffsetFromSlot": { "x": 8.5, "y": 5.5, "z": 0 }, + "cornerOffsetFromSlot": { + "x": 8.5, + "y": 5.5, + "z": 0 + }, "gripperOffsets": { "default": { - "pickUpOffset": { "x": 0, "y": 0, "z": 0 }, - "dropOffset": { "x": 0, "y": 0, "z": 1 } + "pickUpOffset": { + "x": 0, + "y": 0, + "z": 0 + }, + "dropOffset": { + "x": 0, + "y": 0, + "z": 1 + } } } }, @@ -2367,14 +2438,34 @@ "yDimension": 85.48, "zDimension": 16 }, - "cornerOffsetFromSlot": { "x": 0, "y": 0, "z": 0 }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, "stackingOffsetWithLabware": { - "opentrons_96_pcr_adapter": { "x": 0, "y": 0, "z": 10.95 }, - "opentrons_96_well_aluminum_block": { "x": 0, "y": 0, "z": 11.91 } + "opentrons_96_pcr_adapter": { + "x": 0, + "y": 0, + "z": 10.95 + }, + "opentrons_96_well_aluminum_block": { + "x": 0, + "y": 0, + "z": 11.91 + } }, "stackingOffsetWithModule": { - "magneticBlockV1": { "x": 0, "y": 0, "z": 3.54 }, - "thermocyclerModuleV2": { "x": 0, "y": 0, "z": 10.7 } + "magneticBlockV1": { + "x": 0, + "y": 0, + "z": 3.54 + }, + "thermocyclerModuleV2": { + "x": 0, + "y": 0, + "z": 10.7 + } }, "gripForce": 15, "gripHeightFromLabwareBottom": 10, @@ -3260,7 +3351,9 @@ }, "groups": [ { - "metadata": { "wellBottomShape": "v" }, + "metadata": { + "wellBottomShape": "v" + }, "wells": [ "A1", "B1", @@ -3395,7 +3488,12 @@ } }, "groups": [ - { "wells": ["A1"], "metadata": { "wellBottomShape": "flat" } } + { + "wells": ["A1"], + "metadata": { + "wellBottomShape": "flat" + } + } ], "parameters": { "format": "trough", @@ -3407,12 +3505,20 @@ "namespace": "opentrons", "version": 1, "schemaVersion": 2, - "cornerOffsetFromSlot": { "x": 0, "y": 0, "z": 0 } + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + } } }, "liquidSchemaId": "opentronsLiquidSchemaV1", "liquids": { - "0": { "displayName": "h20", "description": "", "displayColor": "#b925ff" }, + "0": { + "displayName": "h20", + "description": "", + "displayColor": "#b925ff" + }, "1": { "displayName": "sample", "description": "", @@ -3422,7 +3528,7 @@ "commandSchemaId": "opentronsCommandSchemaV8", "commands": [ { - "key": "613fa8b3-d474-4588-ac4d-a9a2919258d6", + "key": "fdb1f640-85f6-4bcf-bfff-63e37f55ce27", "commandType": "loadPipette", "params": { "pipetteName": "p1000_single_flex", @@ -3431,25 +3537,29 @@ } }, { - "key": "74941d9f-df2a-481a-bda4-8f8e0cf7c3d3", + "key": "5913deb1-157f-4ac4-bcbc-f8915aa68fa2", "commandType": "loadModule", "params": { "model": "heaterShakerModuleV1", - "location": { "slotName": "D1" }, + "location": { + "slotName": "D1" + }, "moduleId": "23347241-80bb-4a7e-9c91-5d9727a9e483:heaterShakerModuleType" } }, { - "key": "b3efcc42-cf36-478e-855f-02678a436a4f", + "key": "279b491f-78fe-4147-bdbd-31469adf8c01", "commandType": "loadModule", "params": { "model": "thermocyclerModuleV2", - "location": { "slotName": "B1" }, + "location": { + "slotName": "B1" + }, "moduleId": "fd6da9f1-d63b-414b-929e-c646b64790e9:thermocyclerModuleType" } }, { - "key": "a33fd569-8a25-4619-9a46-e415b68fa195", + "key": "d4a96fb9-9d44-444b-8eef-f69bee47b4f7", "commandType": "loadLabware", "params": { "displayName": "Opentrons 96 PCR Heater-Shaker Adapter", @@ -3463,7 +3573,7 @@ } }, { - "key": "e3ecedc5-c7b0-4714-857b-34591cf01b9a", + "key": "c3a137ef-3ecd-44c7-9221-7167c6576d5b", "commandType": "loadLabware", "params": { "displayName": "Opentrons Flex 96 Tip Rack 1000 µL", @@ -3471,11 +3581,13 @@ "loadName": "opentrons_flex_96_tiprack_1000ul", "namespace": "opentrons", "version": 1, - "location": { "slotName": "C2" } + "location": { + "slotName": "C2" + } } }, { - "key": "393baa4d-d46f-4bee-9a32-9899abbaca6b", + "key": "83929c9c-e7b0-49a3-a369-d2061a29af8f", "commandType": "loadLabware", "params": { "displayName": "Opentrons Tough 96 Well Plate 200 µL PCR Full Skirt", @@ -3489,7 +3601,7 @@ } }, { - "key": "34c6b521-6d32-4d46-af48-2d62cb04dd38", + "key": "e16a38b6-1a7a-47e0-bd3f-10f3044813dc", "commandType": "loadLabware", "params": { "displayName": "Axygen 1 Well Reservoir 90 mL", @@ -3497,12 +3609,14 @@ "loadName": "axygen_1_reservoir_90ml", "namespace": "opentrons", "version": 1, - "location": { "addressableAreaName": "A4" } + "location": { + "addressableAreaName": "A4" + } } }, { "commandType": "loadLiquid", - "key": "785d7faf-197a-49c5-889c-a2fbe4cd7901", + "key": "5eef2542-3751-49f9-a83f-cdfbdb3bcd60", "params": { "liquidId": "1", "labwareId": "54370838-4fca-4a14-b88a-7840e4903649:opentrons/opentrons_96_wellplate_200ul_pcr_full_skirt/2", @@ -3520,32 +3634,36 @@ }, { "commandType": "loadLiquid", - "key": "908876b2-ff21-4ad8-ac8a-80b0919bc503", + "key": "347a434b-a0e3-40ab-9821-4bd8b5fa22cd", "params": { "liquidId": "0", "labwareId": "8bacda22-9e05-45e8-bef4-cc04414a204f:opentrons/axygen_1_reservoir_90ml/1", - "volumeByWell": { "A1": 10000 } + "volumeByWell": { + "A1": 10000 + } } }, { "commandType": "thermocycler/openLid", - "key": "729ae36c-e915-4b3d-aaab-68b2d30bc9af", + "key": "bfc09a97-2926-4995-9fb2-0e014373d0e1", "params": { "moduleId": "fd6da9f1-d63b-414b-929e-c646b64790e9:thermocyclerModuleType" } }, { "commandType": "moveLabware", - "key": "fcfc7848-643f-4942-82f3-f2d3a7756312", + "key": "767e876f-0cb7-4d0c-a5ff-a415585d6a62", "params": { "labwareId": "8bacda22-9e05-45e8-bef4-cc04414a204f:opentrons/axygen_1_reservoir_90ml/1", "strategy": "usingGripper", - "newLocation": { "slotName": "C1" } + "newLocation": { + "slotName": "C1" + } } }, { "commandType": "pickUpTip", - "key": "59de9d2e-7188-4aa0-9d28-2d57536ebfd4", + "key": "8d183275-f3e4-4e20-a148-1280a28be7ea", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "labwareId": "f2d371ea-5146-4c89-8200-9c056a7f321a:opentrons/opentrons_flex_96_tiprack_1000ul/1", @@ -3554,7 +3672,7 @@ }, { "commandType": "aspirate", - "key": "7bc2edf1-1931-47cc-a297-e9a96154d758", + "key": "63759336-84a5-4812-b762-1a9aebf34cfe", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, @@ -3562,14 +3680,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 716 } }, { "commandType": "dispense", - "key": "e2a202af-bea8-4471-a3fe-e8b4ea813c12", + "key": "ff8ba56e-1a2c-49d7-852b-9bad8dbf34b0", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, @@ -3577,28 +3699,38 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 716 } }, { "commandType": "moveToAddressableArea", - "key": "78da1188-798f-4bcb-a572-56191f70bf7a", + "key": "1b1844e7-f89f-4594-b76a-e789972a6495", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "addressableAreaName": "1ChannelWasteChute", - "offset": { "x": 0, "y": 0, "z": 0 } + "offset": { + "x": 0, + "y": 0, + "z": 0 + } } }, { "commandType": "dropTipInPlace", - "key": "40daa36b-d58f-4116-97ab-61750d945433", - "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc" } + "key": "0bb4b9ce-c7f1-4436-be9f-682ba654c130", + "params": { + "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc" + } }, { "commandType": "pickUpTip", - "key": "3946b410-290b-4cbb-ae2d-16a89b027951", + "key": "f6ff0fe7-1331-4c28-81ff-a35fed4ad8e5", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "labwareId": "f2d371ea-5146-4c89-8200-9c056a7f321a:opentrons/opentrons_flex_96_tiprack_1000ul/1", @@ -3607,7 +3739,7 @@ }, { "commandType": "aspirate", - "key": "efc2ffce-584d-4e5f-98da-c51879ad40dd", + "key": "c5cd2686-6a09-4b35-b098-c57eac017185", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, @@ -3615,14 +3747,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 716 } }, { "commandType": "dispense", - "key": "e2ba3f45-3c0a-4b2c-b0ff-ee9059b8f636", + "key": "2f187fb7-9fea-4854-9e98-a311d265bcb6", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, @@ -3630,28 +3766,38 @@ "wellName": "B1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 716 } }, { "commandType": "moveToAddressableArea", - "key": "f74b0187-1e0d-480d-a787-31ac9123249c", + "key": "1307485b-cd41-47a5-a044-b028c8224d4f", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "addressableAreaName": "1ChannelWasteChute", - "offset": { "x": 0, "y": 0, "z": 0 } + "offset": { + "x": 0, + "y": 0, + "z": 0 + } } }, { "commandType": "dropTipInPlace", - "key": "e9695c8d-240e-4073-9476-cad8fafb2ac3", - "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc" } + "key": "8ade5883-8117-425e-8a60-4670efeb9883", + "params": { + "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc" + } }, { "commandType": "pickUpTip", - "key": "0b9d824c-b718-46c0-a1dc-cffbdbe282c2", + "key": "cb28e92b-993f-474e-bc73-e72764652c1a", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "labwareId": "f2d371ea-5146-4c89-8200-9c056a7f321a:opentrons/opentrons_flex_96_tiprack_1000ul/1", @@ -3660,7 +3806,7 @@ }, { "commandType": "aspirate", - "key": "230d103e-5ea1-435d-b659-a892d84de899", + "key": "14f97753-b078-482a-bf27-204bc3ce8c61", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, @@ -3668,14 +3814,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 716 } }, { "commandType": "dispense", - "key": "38c76234-14c2-4448-bdfc-66de646cb62c", + "key": "5810d6b0-8e1e-4ee8-b89d-bd298e452fbf", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, @@ -3683,28 +3833,38 @@ "wellName": "C1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 716 } }, { "commandType": "moveToAddressableArea", - "key": "ca97dd08-5b30-412f-922c-ad28deae49bd", + "key": "2e29334d-4195-40ad-a423-f7200177caae", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "addressableAreaName": "1ChannelWasteChute", - "offset": { "x": 0, "y": 0, "z": 0 } + "offset": { + "x": 0, + "y": 0, + "z": 0 + } } }, { "commandType": "dropTipInPlace", - "key": "4712d54c-ba9f-48a4-9dcd-d2c54e09421b", - "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc" } + "key": "d17b7128-1a57-4ef2-b46b-280e97b564c3", + "params": { + "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc" + } }, { "commandType": "pickUpTip", - "key": "9e400b7d-6442-4f60-9a48-af811dd656f7", + "key": "4e957f48-d363-48b3-ab6c-7c32c0d5ab80", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "labwareId": "f2d371ea-5146-4c89-8200-9c056a7f321a:opentrons/opentrons_flex_96_tiprack_1000ul/1", @@ -3713,7 +3873,7 @@ }, { "commandType": "aspirate", - "key": "7f2c3358-ad09-4e5d-ae0c-a09d9c4d32fa", + "key": "1de52706-ab40-48ac-9114-b918de28d0ed", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, @@ -3721,14 +3881,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 716 } }, { "commandType": "dispense", - "key": "ffd130d5-374f-4554-8dee-0d16358a73b2", + "key": "6bdc0516-21ac-48a4-9323-2712e60afe7e", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, @@ -3736,28 +3900,38 @@ "wellName": "D1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 716 } }, { "commandType": "moveToAddressableArea", - "key": "747dd6ab-2a6e-4b7b-a2ee-43d896282ed5", + "key": "c273367a-57a3-4879-9a2d-93d8ab671265", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "addressableAreaName": "1ChannelWasteChute", - "offset": { "x": 0, "y": 0, "z": 0 } + "offset": { + "x": 0, + "y": 0, + "z": 0 + } } }, { "commandType": "dropTipInPlace", - "key": "212a3a1d-6539-496c-905a-dfd918b6524e", - "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc" } + "key": "5e2e4629-426f-41c5-af38-4a252ef544f6", + "params": { + "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc" + } }, { "commandType": "pickUpTip", - "key": "e9dd3348-c92f-40db-89c9-6e761d0d2c17", + "key": "6aa9ea70-9d0c-4c9a-8b26-d168c66edcac", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "labwareId": "f2d371ea-5146-4c89-8200-9c056a7f321a:opentrons/opentrons_flex_96_tiprack_1000ul/1", @@ -3766,7 +3940,7 @@ }, { "commandType": "aspirate", - "key": "25dab6fb-d602-429e-9e36-06e485cee277", + "key": "c1848064-ccac-4488-b658-54765b53c014", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, @@ -3774,14 +3948,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 716 } }, { "commandType": "dispense", - "key": "dd4f4c2d-6d00-4911-8bff-eb0f1c1ce085", + "key": "79622aac-e2ae-4578-8ea8-5288d566b17b", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, @@ -3789,28 +3967,38 @@ "wellName": "E1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 716 } }, { "commandType": "moveToAddressableArea", - "key": "ebfc5f04-1a12-4bd9-996c-3f0525294a05", + "key": "0a2c66b2-97cc-45ae-ad05-d4e644b5d09d", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "addressableAreaName": "1ChannelWasteChute", - "offset": { "x": 0, "y": 0, "z": 0 } + "offset": { + "x": 0, + "y": 0, + "z": 0 + } } }, { "commandType": "dropTipInPlace", - "key": "cd7cbde3-eea8-4243-a970-ca56008c1671", - "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc" } + "key": "88141e29-f3e9-456a-9227-53cc3e4b7306", + "params": { + "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc" + } }, { "commandType": "pickUpTip", - "key": "b57097bb-ddd7-4525-899a-114c2dd4d6ea", + "key": "493734a6-abb9-4e4a-bbd7-9b7b46a18b21", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "labwareId": "f2d371ea-5146-4c89-8200-9c056a7f321a:opentrons/opentrons_flex_96_tiprack_1000ul/1", @@ -3819,7 +4007,7 @@ }, { "commandType": "aspirate", - "key": "f60207d8-728d-469a-a0ef-5d768518f0d2", + "key": "17284684-55c4-477a-a775-33989cccb7a7", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, @@ -3827,14 +4015,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 716 } }, { "commandType": "dispense", - "key": "16836abd-98cc-4e3c-8f0e-6080ca9b3370", + "key": "f1acfe9d-4496-433e-b40f-1a5409ff4094", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, @@ -3842,28 +4034,38 @@ "wellName": "F1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 716 } }, { "commandType": "moveToAddressableArea", - "key": "535110d0-797d-403d-bd73-e1856df31ba2", + "key": "025a6244-db88-4635-95a0-14648468a844", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "addressableAreaName": "1ChannelWasteChute", - "offset": { "x": 0, "y": 0, "z": 0 } + "offset": { + "x": 0, + "y": 0, + "z": 0 + } } }, { "commandType": "dropTipInPlace", - "key": "524c64c3-7148-47af-8644-48fe10b33711", - "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc" } + "key": "8257d866-81f5-4327-8fde-908c2cc58f4b", + "params": { + "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc" + } }, { "commandType": "pickUpTip", - "key": "5ee7191b-933e-4d18-ac03-9327b791020f", + "key": "3f000483-4802-4332-9ed8-7986267d4bf0", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "labwareId": "f2d371ea-5146-4c89-8200-9c056a7f321a:opentrons/opentrons_flex_96_tiprack_1000ul/1", @@ -3872,7 +4074,7 @@ }, { "commandType": "aspirate", - "key": "ce003b5e-eae4-4736-93f5-dedcc4ce3151", + "key": "cc718e17-898c-475e-8213-18a8c4e7de63", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, @@ -3880,14 +4082,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 716 } }, { "commandType": "dispense", - "key": "57fb34af-ec8e-4d4a-b88a-0f61a923c5de", + "key": "9b2d6845-866c-4cbb-85c5-be29f0e59c7f", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, @@ -3895,28 +4101,38 @@ "wellName": "G1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 716 } }, { "commandType": "moveToAddressableArea", - "key": "1ace6a5a-ca8a-434d-9742-d7d9e1e18ade", + "key": "e204cacd-03f9-4f52-a48a-a4fba1f217c4", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "addressableAreaName": "1ChannelWasteChute", - "offset": { "x": 0, "y": 0, "z": 0 } + "offset": { + "x": 0, + "y": 0, + "z": 0 + } } }, { "commandType": "dropTipInPlace", - "key": "b3f98eee-0a07-489d-bdc3-f7c1784a9a15", - "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc" } + "key": "3f3a6583-8548-4e1b-af12-c4157c573aa6", + "params": { + "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc" + } }, { "commandType": "pickUpTip", - "key": "50e1881e-062a-4d76-b7f8-4a38999b4c77", + "key": "3000eef7-2dbb-49b7-8242-b5f71cee8e84", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "labwareId": "f2d371ea-5146-4c89-8200-9c056a7f321a:opentrons/opentrons_flex_96_tiprack_1000ul/1", @@ -3925,7 +4141,7 @@ }, { "commandType": "aspirate", - "key": "38b5468d-0025-4819-aeca-fdd9dfd40f82", + "key": "4e21f8b9-a480-43a5-b3bb-23a0baa99bc4", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, @@ -3933,14 +4149,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 716 } }, { "commandType": "dispense", - "key": "326bb0f6-ec20-442e-9261-e8d00350f70d", + "key": "a4ed53f0-3ba5-4b30-9a8a-a0abf5f558bc", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, @@ -3948,35 +4168,45 @@ "wellName": "H1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 716 } }, { "commandType": "moveToAddressableArea", - "key": "17265bad-0cc9-4274-9fb7-ec6489ef62cb", + "key": "920cc11e-1a35-4a84-ba6b-93f742bd8780", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "addressableAreaName": "1ChannelWasteChute", - "offset": { "x": 0, "y": 0, "z": 0 } + "offset": { + "x": 0, + "y": 0, + "z": 0 + } } }, { "commandType": "dropTipInPlace", - "key": "c9410a23-5d50-429b-8492-f52b68775de4", - "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc" } + "key": "b05b1f55-87ac-4989-a937-c6e63abc04fc", + "params": { + "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc" + } }, { "commandType": "thermocycler/closeLid", - "key": "1f008ad8-fa1a-42d1-a2aa-7c25e1e93bf4", + "key": "f4e356c4-5160-478d-9419-b919f411324a", "params": { "moduleId": "fd6da9f1-d63b-414b-929e-c646b64790e9:thermocyclerModuleType" } }, { "commandType": "thermocycler/setTargetBlockTemperature", - "key": "0cfce686-efe6-4202-9ffd-0ab83069b846", + "key": "bc344e58-dedd-44a1-bcbb-1108852aa188", "params": { "moduleId": "fd6da9f1-d63b-414b-929e-c646b64790e9:thermocyclerModuleType", "celsius": 40 @@ -3984,47 +4214,50 @@ }, { "commandType": "thermocycler/waitForBlockTemperature", - "key": "d900220f-3d2a-437a-93ab-7d2c3c1b3386", + "key": "b573b603-fa89-4213-a1ea-6f6d24f4f372", "params": { "moduleId": "fd6da9f1-d63b-414b-929e-c646b64790e9:thermocyclerModuleType" } }, { "commandType": "waitForDuration", - "key": "fcb103cc-7680-4c88-9476-fa8942ce5f96", - "params": { "seconds": 60, "message": "" } + "key": "1e8e67b6-e2ed-476b-8f5a-f985a68fbd22", + "params": { + "seconds": 60, + "message": "" + } }, { "commandType": "thermocycler/openLid", - "key": "26e5067c-2e91-4eef-8559-101cc1b37d00", + "key": "165eaa13-69df-49b5-965a-83cf19c40fda", "params": { "moduleId": "fd6da9f1-d63b-414b-929e-c646b64790e9:thermocyclerModuleType" } }, { "commandType": "thermocycler/deactivateBlock", - "key": "d0a1146e-96cc-4d19-b6c9-a40e099e53ac", + "key": "d9c25977-9163-472b-b0e6-4840b8135b52", "params": { "moduleId": "fd6da9f1-d63b-414b-929e-c646b64790e9:thermocyclerModuleType" } }, { "commandType": "heaterShaker/deactivateHeater", - "key": "b3ef3daf-2488-4dfa-babf-478d75ad08da", + "key": "a9591c3d-4413-447b-81ed-b10e0b64593a", "params": { "moduleId": "23347241-80bb-4a7e-9c91-5d9727a9e483:heaterShakerModuleType" } }, { "commandType": "heaterShaker/openLabwareLatch", - "key": "c60fd59c-e848-4584-a743-a139ac0c239e", + "key": "8e0d13ac-d6c9-4aee-bf38-8b65cbb23cd3", "params": { "moduleId": "23347241-80bb-4a7e-9c91-5d9727a9e483:heaterShakerModuleType" } }, { "commandType": "moveLabware", - "key": "e27dc8fe-eac6-46bf-96d4-26e20a1eb8d1", + "key": "cdbee473-2621-49d4-b233-99a80d4aa6ea", "params": { "labwareId": "54370838-4fca-4a14-b88a-7840e4903649:opentrons/opentrons_96_wellplate_200ul_pcr_full_skirt/2", "strategy": "usingGripper", @@ -4035,21 +4268,21 @@ }, { "commandType": "heaterShaker/closeLabwareLatch", - "key": "7178af55-644c-40a8-84bb-3eaed0db9e7b", + "key": "90f0a48f-d198-49cc-b985-8b60b9eeb97a", "params": { "moduleId": "23347241-80bb-4a7e-9c91-5d9727a9e483:heaterShakerModuleType" } }, { "commandType": "heaterShaker/deactivateHeater", - "key": "ad7d086b-dfa8-4e76-a309-ab3c3e7a0f52", + "key": "66d3b91c-6a48-4ccc-880f-8f9b00702e47", "params": { "moduleId": "23347241-80bb-4a7e-9c91-5d9727a9e483:heaterShakerModuleType" } }, { "commandType": "heaterShaker/setAndWaitForShakeSpeed", - "key": "c3a210c7-d55a-4a95-97cf-23850b7eda7d", + "key": "f4746eaa-e860-44ec-ba60-27c60a3f251f", "params": { "moduleId": "23347241-80bb-4a7e-9c91-5d9727a9e483:heaterShakerModuleType", "rpm": 200 @@ -4057,53 +4290,59 @@ }, { "commandType": "waitForDuration", - "key": "d1059759-9bf7-4732-b0ae-857672b3adb0", - "params": { "seconds": 60 } + "key": "4f9d6581-3793-4f5e-b29b-a4f59878348b", + "params": { + "seconds": 60 + } }, { "commandType": "heaterShaker/deactivateShaker", - "key": "4bb2747c-481a-42fd-b025-0c536f144dcd", + "key": "9a4026e4-5fb0-4cca-9cc0-09274213418d", "params": { "moduleId": "23347241-80bb-4a7e-9c91-5d9727a9e483:heaterShakerModuleType" } }, { "commandType": "heaterShaker/deactivateHeater", - "key": "c23a2083-3ae9-4a56-b4f8-cc4427efa57b", + "key": "0e0a6e22-6d87-457e-841e-063e74b92bcd", "params": { "moduleId": "23347241-80bb-4a7e-9c91-5d9727a9e483:heaterShakerModuleType" } }, { "commandType": "heaterShaker/deactivateHeater", - "key": "54501c02-54f6-4bcf-bc8e-e3f2753a1638", + "key": "43ef8004-1be7-4eec-9fca-83571590170d", "params": { "moduleId": "23347241-80bb-4a7e-9c91-5d9727a9e483:heaterShakerModuleType" } }, { "commandType": "heaterShaker/openLabwareLatch", - "key": "3a090443-d2bf-422f-9001-97d96f566a7f", + "key": "d3a2cb1e-b4dd-4431-ae89-84d71ed5f900", "params": { "moduleId": "23347241-80bb-4a7e-9c91-5d9727a9e483:heaterShakerModuleType" } }, { "commandType": "moveLabware", - "key": "5cd730a0-a471-4b2f-8ed2-0d192c9fc4e9", + "key": "0554f9d9-5de2-4faa-bde6-a291c503379c", "params": { "labwareId": "54370838-4fca-4a14-b88a-7840e4903649:opentrons/opentrons_96_wellplate_200ul_pcr_full_skirt/2", "strategy": "usingGripper", - "newLocation": { "addressableAreaName": "B4" } + "newLocation": { + "addressableAreaName": "B4" + } } }, { "commandType": "moveLabware", - "key": "833722d2-f2ea-4280-8e8e-d19f3080bd59", + "key": "25d91423-5565-4063-ada0-87692ca2dbbd", "params": { "labwareId": "f2d371ea-5146-4c89-8200-9c056a7f321a:opentrons/opentrons_flex_96_tiprack_1000ul/1", "strategy": "usingGripper", - "newLocation": { "addressableAreaName": "gripperWasteChute" } + "newLocation": { + "addressableAreaName": "gripperWasteChute" + } } } ], diff --git a/protocol-designer/fixtures/protocol/8/example_1_1_0MigratedToV8.json b/protocol-designer/fixtures/protocol/8/example_1_1_0MigratedToV8.json index ca6c9b8f9fc..512e74a6821 100644 --- a/protocol-designer/fixtures/protocol/8/example_1_1_0MigratedToV8.json +++ b/protocol-designer/fixtures/protocol/8/example_1_1_0MigratedToV8.json @@ -6,16 +6,16 @@ "author": "Author name", "description": "Description here", "created": 1560957631666, - "lastModified": 1731344289938, + "lastModified": 1738256741877, "category": null, "subcategory": null, "tags": [] }, "designerApplication": { "name": "opentrons/protocol-designer", - "version": "8.2.0", + "version": "8.5.0", "data": { - "_internalAppBuildDate": "Mon, 11 Nov 2024 16:56:05 GMT", + "_internalAppBuildDate": "Thu, 30 Jan 2025 17:05:24 GMT", "defaultValues": { "aspirate_mmFromBottom": 1, "dispense_mmFromBottom": 1, @@ -30,7 +30,10 @@ "opentrons/tipone_96_tiprack_200ul/1" ] }, - "dismissedWarnings": { "form": [], "timeline": [] }, + "dismissedWarnings": { + "form": [], + "timeline": [] + }, "ingredients": { "0": { "name": "samples", @@ -47,14 +50,46 @@ }, "ingredLocations": { "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well:opentrons/usascientific_96_wellplate_2.4ml_deep/1": { - "A1": { "0": { "volume": 121 } }, - "B1": { "0": { "volume": 121 } }, - "C1": { "0": { "volume": 121 } }, - "D1": { "0": { "volume": 121 } }, - "E1": { "0": { "volume": 121 } }, - "F1": { "1": { "volume": 44 } }, - "G1": { "1": { "volume": 44 } }, - "H1": { "1": { "volume": 44 } } + "A1": { + "0": { + "volume": 121 + } + }, + "B1": { + "0": { + "volume": 121 + } + }, + "C1": { + "0": { + "volume": 121 + } + }, + "D1": { + "0": { + "volume": 121 + } + }, + "E1": { + "0": { + "volume": 121 + } + }, + "F1": { + "1": { + "volume": 44 + } + }, + "G1": { + "1": { + "volume": 44 + } + }, + "H1": { + "1": { + "volume": 44 + } + } } }, "savedStepForms": { @@ -85,7 +120,7 @@ "aspirate_mix_volume": "2", "aspirate_mmFromBottom": 1, "aspirate_touchTip_checkbox": true, - "aspirate_touchTip_mmFromBottom": 28.5, + "aspirate_touchTip_mmFromTop": -12.8, "aspirate_wellOrder_first": "t2b", "aspirate_wellOrder_second": "l2r", "aspirate_wells_grouped": false, @@ -94,7 +129,7 @@ "aspirate_y_position": 0, "blowout_checkbox": true, "blowout_flowRate": 1000, - "blowout_location": "a4ca3966-cd82-4621-897f-b98a3b626c15:trashBin", + "blowout_location": "099f7422-f81c-4188-8fb7-d70f32c574cc:trashBin", "blowout_z_offset": 0, "changeTip": "always", "dispense_airGap_checkbox": false, @@ -109,7 +144,7 @@ "dispense_mix_volume": "3", "dispense_mmFromBottom": 2.5, "dispense_touchTip_checkbox": true, - "dispense_touchTip_mmFromBottom": null, + "dispense_touchTip_mmFromTop": null, "dispense_wellOrder_first": "b2t", "dispense_wellOrder_second": "r2l", "dispense_wells": [ @@ -127,17 +162,18 @@ "dispense_y_position": 0, "disposalVolume_checkbox": true, "disposalVolume_volume": "1", - "dropTip_location": "a4ca3966-cd82-4621-897f-b98a3b626c15:trashBin", + "dropTip_location": "099f7422-f81c-4188-8fb7-d70f32c574cc:trashBin", "nozzles": null, "path": "single", "pipette": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "preWetTip": false, "tipRack": "opentrons/opentrons_96_tiprack_10ul/1", "volume": "6", - "id": "e7d36200-92a5-11e9-ac62-1b173f839d9e", "stepType": "moveLiquid", "stepName": "transfer things", - "stepDetails": "yeah notes" + "stepDetails": "yeah notes", + "id": "e7d36200-92a5-11e9-ac62-1b173f839d9e", + "dispense_touchTip_mmfromTop": null }, "18113c80-92a6-11e9-ac62-1b173f839d9e": { "aspirate_delay_checkbox": false, @@ -151,11 +187,11 @@ "dispense_delay_checkbox": false, "dispense_delay_seconds": "1", "dispense_flowRate": 7, - "dropTip_location": "a4ca3966-cd82-4621-897f-b98a3b626c15:trashBin", + "dropTip_location": "099f7422-f81c-4188-8fb7-d70f32c574cc:trashBin", "labware": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well:opentrons/usascientific_96_wellplate_2.4ml_deep/1", "mix_mmFromBottom": 0.5, "mix_touchTip_checkbox": true, - "mix_touchTip_mmFromBottom": 30.5, + "mix_touchTip_mmFromTop": -10.8, "mix_wellOrder_first": "t2b", "mix_wellOrder_second": "l2r", "mix_x_position": 0, @@ -166,10 +202,10 @@ "tipRack": "opentrons/opentrons_96_tiprack_10ul/1", "volume": "5.5", "wells": ["F1"], - "id": "18113c80-92a6-11e9-ac62-1b173f839d9e", "stepType": "mix", "stepName": "mix", - "stepDetails": "" + "stepDetails": "", + "id": "18113c80-92a6-11e9-ac62-1b173f839d9e" }, "2e622080-92a6-11e9-ac62-1b173f839d9e": { "moduleId": null, @@ -190,7 +226,10 @@ ] } }, - "robot": { "model": "OT-2 Standard", "deckId": "ot2_standard" }, + "robot": { + "model": "OT-2 Standard", + "deckId": "ot2_standard" + }, "labwareDefinitionSchemaId": "opentronsLabwareSchemaV2", "labwareDefinitions": { "opentrons/opentrons_96_tiprack_10ul/1": { @@ -1206,7 +1245,11 @@ "namespace": "opentrons", "version": 1, "schemaVersion": 2, - "cornerOffsetFromSlot": { "x": 0, "y": 0, "z": 0 } + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + } }, "opentrons/tipone_96_tiprack_200ul/1": { "ordering": [ @@ -2219,7 +2262,11 @@ "metadata": {} } ], - "cornerOffsetFromSlot": { "x": 0, "y": 0, "z": 0 } + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + } }, "opentrons/usascientific_96_wellplate_2.4ml_deep/1": { "ordering": [ @@ -3316,7 +3363,9 @@ "G12", "H12" ], - "metadata": { "wellBottomShape": "u" } + "metadata": { + "wellBottomShape": "u" + } } ], "parameters": { @@ -3329,7 +3378,11 @@ "namespace": "opentrons", "version": 1, "schemaVersion": 2, - "cornerOffsetFromSlot": { "x": 0, "y": 0, "z": 0 } + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + } } }, "liquidSchemaId": "opentronsLiquidSchemaV1", @@ -3339,12 +3392,16 @@ "description": "", "displayColor": "#b925ff" }, - "1": { "displayName": "dna", "description": "", "displayColor": "#ffd600" } + "1": { + "displayName": "dna", + "description": "", + "displayColor": "#ffd600" + } }, "commandSchemaId": "opentronsCommandSchemaV8", "commands": [ { - "key": "f9ad5d77-d29a-420b-bd45-fe1d86b6cceb", + "key": "653466a2-8020-453e-ab02-c005028a2f85", "commandType": "loadPipette", "params": { "pipetteName": "p10_single", @@ -3353,7 +3410,7 @@ } }, { - "key": "3ac7ecd1-eb76-4498-bd39-de566febd5a6", + "key": "e7c4cb6c-5fb9-4657-ac3e-d88fc0d22504", "commandType": "loadPipette", "params": { "pipetteName": "p50_single", @@ -3362,7 +3419,7 @@ } }, { - "key": "844cd642-ac57-4311-b966-4622527adb5d", + "key": "88a0549f-4dc9-4ff2-8224-0840707768de", "commandType": "loadLabware", "params": { "displayName": "tiprack 10ul (1)", @@ -3370,11 +3427,13 @@ "loadName": "opentrons_96_tiprack_10ul", "namespace": "opentrons", "version": 1, - "location": { "slotName": "1" } + "location": { + "slotName": "1" + } } }, { - "key": "5a3a4baf-6b23-4cd8-897d-9aed90cbc25b", + "key": "f8177762-b4d6-4c64-829c-86c43c890013", "commandType": "loadLabware", "params": { "displayName": "tiprack 200ul (1)", @@ -3382,11 +3441,13 @@ "loadName": "tipone_96_tiprack_200ul", "namespace": "opentrons", "version": 1, - "location": { "slotName": "2" } + "location": { + "slotName": "2" + } } }, { - "key": "75de19d2-476a-4dbc-88e3-6e50d3c8a638", + "key": "dc5b0ab1-d6d8-422e-b329-6d450ed47606", "commandType": "loadLabware", "params": { "displayName": "96 deep well (1)", @@ -3394,21 +3455,27 @@ "loadName": "usascientific_96_wellplate_2.4ml_deep", "namespace": "opentrons", "version": 1, - "location": { "slotName": "10" } + "location": { + "slotName": "10" + } } }, { "commandType": "loadLiquid", - "key": "11ece455-7552-4285-83ac-60ed9cc78cd2", + "key": "029fb680-4e9c-4751-9f46-63bb351213b9", "params": { "liquidId": "1", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well:opentrons/usascientific_96_wellplate_2.4ml_deep/1", - "volumeByWell": { "F1": 44, "G1": 44, "H1": 44 } + "volumeByWell": { + "F1": 44, + "G1": 44, + "H1": 44 + } } }, { "commandType": "loadLiquid", - "key": "94a1fd44-b63d-468f-b44f-94b55c92c349", + "key": "c528eb17-0030-4047-a762-160ca37128e9", "params": { "liquidId": "0", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well:opentrons/usascientific_96_wellplate_2.4ml_deep/1", @@ -3423,7 +3490,7 @@ }, { "commandType": "pickUpTip", - "key": "61814730-08e5-4682-b8c0-659cea03545c", + "key": "df727ce4-87e9-4ec5-bea2-6b95b046c939", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "c6f4ec70-92a5-11e9-ac62-1b173f839d9e:tiprack-10ul:opentrons/opentrons_96_tiprack_10ul/1", @@ -3432,7 +3499,7 @@ }, { "commandType": "aspirate", - "key": "5a7b0dd8-de27-438c-bf1a-32a4c244a594", + "key": "11775a09-4adc-41aa-a8e9-7c9ce4be9e27", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -3440,14 +3507,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "d8da80e3-e9d9-4422-9575-932a31617cd6", + "key": "28f64155-ed7b-4b7d-b28b-15a225f67256", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -3455,14 +3526,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "448098e2-e8a3-47bf-83ac-6c1954185312", + "key": "85694006-ab52-4adb-8442-ddb909a00859", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -3470,14 +3545,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "8baa0d1d-27c3-4478-be06-c631177c467e", + "key": "7bf0394c-1b42-477a-b342-9c692340e3c9", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -3485,14 +3564,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "5d1b4443-5ceb-4947-8b0c-e6b09bfcf16a", + "key": "e4fae21c-fb4d-4d37-a95d-eae6122058b8", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -3500,14 +3583,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "df36d543-19b8-4aa5-87c1-d43c408ca96d", + "key": "bba3e2c7-abae-4c26-905a-c5bdc377563d", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -3515,14 +3602,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "7fac5fce-542f-4283-9410-b7fdda367405", + "key": "44baadee-dbe5-42ba-91dc-789a37f095ec", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, @@ -3530,24 +3621,33 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 0.6 } }, { "commandType": "touchTip", - "key": "723b76f8-28e2-4d1b-9d9e-e0ca6984460c", + "key": "e5f76399-cd91-4e7b-90e2-9f67b51835ff", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well:opentrons/usascientific_96_wellplate_2.4ml_deep/1", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 28.5 } } + "wellLocation": { + "origin": "top", + "offset": { + "z": -12.8 + } + } } }, { "commandType": "dispense", - "key": "6d36fda0-e7c4-4f78-b98c-89bedfe78acf", + "key": "191ca16f-1556-4c99-97c4-44a1a6ffcf69", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, @@ -3555,14 +3655,18 @@ "wellName": "E8", "wellLocation": { "origin": "bottom", - "offset": { "z": 2.5, "x": 0, "y": 0 } + "offset": { + "z": 2.5, + "x": 0, + "y": 0 + } }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "65556335-876a-43bd-a699-18491577cd21", + "key": "424d1f8d-2372-484a-bf34-51a49b4f8c1a", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -3570,14 +3674,18 @@ "wellName": "E8", "wellLocation": { "origin": "bottom", - "offset": { "z": 2.5, "x": 0, "y": 0 } + "offset": { + "z": 2.5, + "x": 0, + "y": 0 + } }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "dc3ff54b-0925-4ee5-adc2-fb72c768c847", + "key": "940b80b5-eda9-4fbb-a3f2-dd89ad874b0f", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -3585,14 +3693,18 @@ "wellName": "E8", "wellLocation": { "origin": "bottom", - "offset": { "z": 2.5, "x": 0, "y": 0 } + "offset": { + "z": 2.5, + "x": 0, + "y": 0 + } }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "460ae203-08ba-4e99-bb10-c578e1f44c77", + "key": "586dffd7-11a0-49cc-a768-842e80f7a083", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -3600,14 +3712,18 @@ "wellName": "E8", "wellLocation": { "origin": "bottom", - "offset": { "z": 2.5, "x": 0, "y": 0 } + "offset": { + "z": 2.5, + "x": 0, + "y": 0 + } }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "637a258d-f782-4264-bf93-8e2e92c2653e", + "key": "babc33bb-2642-4c1d-9142-5ba7e58f3219", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -3615,23 +3731,31 @@ "wellName": "E8", "wellLocation": { "origin": "bottom", - "offset": { "z": 2.5, "x": 0, "y": 0 } + "offset": { + "z": 2.5, + "x": 0, + "y": 0 + } }, "flowRate": 10 } }, { "commandType": "moveToAddressableArea", - "key": "01cca54a-a392-45f4-a6d1-3b96e6baba23", + "key": "417d2cad-ae9d-44ef-8ceb-ad2d68e379cd", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", - "offset": { "x": 0, "y": 0, "z": 0 } + "offset": { + "x": 0, + "y": 0, + "z": 0 + } } }, { "commandType": "blowOutInPlace", - "key": "aaff6d55-5690-4b78-a761-5db62bf3ea51", + "key": "8bc64b78-501e-416a-91d1-4ee65a3744d8", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "flowRate": 1000 @@ -3639,32 +3763,43 @@ }, { "commandType": "touchTip", - "key": "d18e914b-9cdb-41b2-ace6-994ce5815f3c", + "key": "b84bf61c-2878-48da-8910-de9cd9b64fde", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well:opentrons/usascientific_96_wellplate_2.4ml_deep/1", "wellName": "E8", - "wellLocation": { "origin": "bottom", "offset": { "z": 40.3 } } + "wellLocation": { + "origin": "top", + "offset": { + "z": -1 + } + } } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "631dd21c-070b-4a11-bc47-16bb3a93ea72", + "key": "20d90f09-623d-4c7b-b19a-d4afea3437ab", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", - "offset": { "x": 0, "y": 0, "z": 0 }, + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, "alternateDropLocation": true } }, { "commandType": "dropTipInPlace", - "key": "fb5ad531-ee23-42d9-8665-510fc3c5f6d6", - "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e" } + "key": "6bdd2267-a54f-4f0b-b3a9-a29fc6facd48", + "params": { + "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e" + } }, { "commandType": "pickUpTip", - "key": "b5f28d66-de3c-409d-b477-31dc923cde80", + "key": "778e0f97-7810-4392-8816-3390e773c402", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "c6f4ec70-92a5-11e9-ac62-1b173f839d9e:tiprack-10ul:opentrons/opentrons_96_tiprack_10ul/1", @@ -3673,7 +3808,7 @@ }, { "commandType": "aspirate", - "key": "0bac2ef5-3701-403f-bff3-271689657708", + "key": "488ed1c9-5e31-4abf-ac13-7739170f7055", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -3681,14 +3816,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "ba65084b-ec42-458b-9316-c344f6b61117", + "key": "8fffd70f-f145-4550-8a8b-75ef67c62713", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -3696,14 +3835,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "131f2a49-bc75-41c7-8128-599086402c30", + "key": "53a14ffd-8bcd-4478-a175-c6ccbbc99138", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -3711,14 +3854,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "4144093b-aa0c-4b31-953b-68f279a533ae", + "key": "d6f5bfc6-b873-4d72-8b23-ff761a428189", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -3726,14 +3873,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "a0c2d152-6b90-4fa4-be5d-374b0ce7442e", + "key": "8c27405f-c328-419a-889d-9045d58e4e33", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -3741,14 +3892,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "ffd9e758-79ba-4b41-9dae-e59d78b33185", + "key": "1bb1272d-ce76-41f2-9d53-c1273303880e", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -3756,14 +3911,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "e493e69a-bf86-4c1c-b136-d280ecaf98cb", + "key": "b941dbde-54a4-445e-a29d-543e159bedbf", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, @@ -3771,24 +3930,33 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 0.6 } }, { "commandType": "touchTip", - "key": "6ff3daed-289a-48a5-a0c8-dac4b5960f91", + "key": "ff5bb79b-e077-4d94-9475-d1ca50852284", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well:opentrons/usascientific_96_wellplate_2.4ml_deep/1", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 28.5 } } + "wellLocation": { + "origin": "top", + "offset": { + "z": -12.8 + } + } } }, { "commandType": "dispense", - "key": "95861712-03ec-4bb2-9bcd-c89542af9676", + "key": "14bf5fb9-d05b-4e51-b74a-ef627109d257", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, @@ -3796,14 +3964,18 @@ "wellName": "D8", "wellLocation": { "origin": "bottom", - "offset": { "z": 2.5, "x": 0, "y": 0 } + "offset": { + "z": 2.5, + "x": 0, + "y": 0 + } }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "a739b56c-b847-4c2f-9658-da5b7c58ad76", + "key": "dfba6f40-6a41-4a3e-bf7e-49f63414e6ef", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -3811,14 +3983,18 @@ "wellName": "D8", "wellLocation": { "origin": "bottom", - "offset": { "z": 2.5, "x": 0, "y": 0 } + "offset": { + "z": 2.5, + "x": 0, + "y": 0 + } }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "4e47ea99-eb46-4099-a27a-b405805af6c1", + "key": "73686f51-4623-488c-ae1d-cf954e67ac2a", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -3826,14 +4002,18 @@ "wellName": "D8", "wellLocation": { "origin": "bottom", - "offset": { "z": 2.5, "x": 0, "y": 0 } + "offset": { + "z": 2.5, + "x": 0, + "y": 0 + } }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "a2593cea-5291-4cc5-9c37-9cad891eb8ac", + "key": "87b23803-be29-44ff-b464-53bc9e7ec9d4", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -3841,14 +4021,18 @@ "wellName": "D8", "wellLocation": { "origin": "bottom", - "offset": { "z": 2.5, "x": 0, "y": 0 } + "offset": { + "z": 2.5, + "x": 0, + "y": 0 + } }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "9ebc32bd-8f9e-44d0-b3e3-b9ab21c0671d", + "key": "01d936c2-c68f-4da4-9e58-47c505a479c7", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -3856,23 +4040,31 @@ "wellName": "D8", "wellLocation": { "origin": "bottom", - "offset": { "z": 2.5, "x": 0, "y": 0 } + "offset": { + "z": 2.5, + "x": 0, + "y": 0 + } }, "flowRate": 10 } }, { "commandType": "moveToAddressableArea", - "key": "30af2362-11e5-4241-9f96-a44cee7d48e1", + "key": "e575881c-12c0-4291-aee7-a9838ae46669", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", - "offset": { "x": 0, "y": 0, "z": 0 } + "offset": { + "x": 0, + "y": 0, + "z": 0 + } } }, { "commandType": "blowOutInPlace", - "key": "cf07e58d-4500-403d-b89c-2a40b0d06696", + "key": "3208e8c0-5a0f-457c-9344-7f2966b44d47", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "flowRate": 1000 @@ -3880,32 +4072,43 @@ }, { "commandType": "touchTip", - "key": "22e10e85-c818-4cee-8947-1b8e51a59cb5", + "key": "c356873a-300c-4e28-855a-b265ced0e7f2", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well:opentrons/usascientific_96_wellplate_2.4ml_deep/1", "wellName": "D8", - "wellLocation": { "origin": "bottom", "offset": { "z": 40.3 } } + "wellLocation": { + "origin": "top", + "offset": { + "z": -1 + } + } } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "9e70258f-eeb1-4bdd-913e-e3af13db97a4", + "key": "0377b295-3529-4f46-8e16-c368ab6ebe49", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", - "offset": { "x": 0, "y": 0, "z": 0 }, + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, "alternateDropLocation": true } }, { "commandType": "dropTipInPlace", - "key": "1662223e-d4fe-46b6-9ce6-b422e38f10df", - "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e" } + "key": "07e93710-93cc-4dde-9e14-9ae43d132da3", + "params": { + "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e" + } }, { "commandType": "pickUpTip", - "key": "8c260e0e-5f2d-4e97-afdc-66b3b623a8e4", + "key": "12083522-572b-42ae-8e29-cc269f844dda", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "c6f4ec70-92a5-11e9-ac62-1b173f839d9e:tiprack-10ul:opentrons/opentrons_96_tiprack_10ul/1", @@ -3914,7 +4117,7 @@ }, { "commandType": "aspirate", - "key": "79903b09-e87f-4fa2-aedd-dd77ad9a651e", + "key": "b44b017d-8793-4916-ba75-a0fcf17941a6", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -3922,14 +4125,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "6212380a-b25e-4cbf-a3c8-8f29bbcb2b0b", + "key": "71ee0966-e142-4748-b9ed-c222e9240495", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -3937,14 +4144,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "e8a9183f-3121-422b-9ba7-695d0f4a9736", + "key": "52b3c2fd-fb1f-4ed8-8a55-cef464e285c8", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -3952,14 +4163,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "706123a0-fca4-4d28-836c-9b76874c1138", + "key": "09e89c72-abf8-4763-a17e-f0b68451e4bb", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -3967,14 +4182,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "8248501f-5871-49a2-98c6-b32bf1da0dea", + "key": "b5a4c0be-90a7-44de-9471-81e0057718bb", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -3982,14 +4201,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "0df942df-9354-4e54-8206-cf4f8ba11cb9", + "key": "a1ee83f2-5933-4d3e-98b6-84aa33b24e5b", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -3997,14 +4220,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "c8f8eaed-4014-4879-86d2-435008868ec8", + "key": "8ba0eb8b-3090-41b4-a1b3-aad2f50187ff", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, @@ -4012,24 +4239,33 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 0.6 } }, { "commandType": "touchTip", - "key": "361114f4-38dd-40b9-b9fa-2fdf8a4b091a", + "key": "86d7ea41-8ecf-402a-8b4d-25809005e4ba", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well:opentrons/usascientific_96_wellplate_2.4ml_deep/1", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 28.5 } } + "wellLocation": { + "origin": "top", + "offset": { + "z": -12.8 + } + } } }, { "commandType": "dispense", - "key": "aefc2b07-ac5c-4411-a4db-12c83269d714", + "key": "577ce715-206f-4a51-b121-cacdb1160ec3", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, @@ -4037,14 +4273,18 @@ "wellName": "C8", "wellLocation": { "origin": "bottom", - "offset": { "z": 2.5, "x": 0, "y": 0 } + "offset": { + "z": 2.5, + "x": 0, + "y": 0 + } }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "813ed0eb-f29d-40e6-b6b4-85018049b8b4", + "key": "4e900e98-c62e-49b7-b617-298684c919f0", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -4052,14 +4292,18 @@ "wellName": "C8", "wellLocation": { "origin": "bottom", - "offset": { "z": 2.5, "x": 0, "y": 0 } + "offset": { + "z": 2.5, + "x": 0, + "y": 0 + } }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "507896df-a5d5-4cc9-a97f-e68df127a693", + "key": "7e39af6a-1a82-435a-98d8-c652bb734836", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -4067,14 +4311,18 @@ "wellName": "C8", "wellLocation": { "origin": "bottom", - "offset": { "z": 2.5, "x": 0, "y": 0 } + "offset": { + "z": 2.5, + "x": 0, + "y": 0 + } }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "79c24dd7-b26d-4964-86c3-40eafa0fb5a7", + "key": "6a4d013b-e5ae-4c00-ab32-d255cbe3199c", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -4082,14 +4330,18 @@ "wellName": "C8", "wellLocation": { "origin": "bottom", - "offset": { "z": 2.5, "x": 0, "y": 0 } + "offset": { + "z": 2.5, + "x": 0, + "y": 0 + } }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "d5ac4971-c5e5-4618-933e-6b3d9c17c3db", + "key": "50bc592a-7d11-44db-87d1-c1fac3f33aca", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -4097,23 +4349,31 @@ "wellName": "C8", "wellLocation": { "origin": "bottom", - "offset": { "z": 2.5, "x": 0, "y": 0 } + "offset": { + "z": 2.5, + "x": 0, + "y": 0 + } }, "flowRate": 10 } }, { "commandType": "moveToAddressableArea", - "key": "16dad174-d9da-4fe2-a4c0-da333a7a02bf", + "key": "b07dc9b0-ae2b-4e6d-a2f2-7689c53c3865", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", - "offset": { "x": 0, "y": 0, "z": 0 } + "offset": { + "x": 0, + "y": 0, + "z": 0 + } } }, { "commandType": "blowOutInPlace", - "key": "be621005-7da5-4b98-88a1-4f784bef7b59", + "key": "99375975-5737-4632-acf3-a1e4ea1034ca", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "flowRate": 1000 @@ -4121,32 +4381,43 @@ }, { "commandType": "touchTip", - "key": "241e0284-b4cd-42f8-87c3-9f6e76878481", + "key": "e643590b-d941-4660-972f-e73f013cf923", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well:opentrons/usascientific_96_wellplate_2.4ml_deep/1", "wellName": "C8", - "wellLocation": { "origin": "bottom", "offset": { "z": 40.3 } } + "wellLocation": { + "origin": "top", + "offset": { + "z": -1 + } + } } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "7882f2ed-6767-4b0a-b1f1-14acbe907042", + "key": "33f25151-526c-400e-9c36-02257a6b02b9", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", - "offset": { "x": 0, "y": 0, "z": 0 }, + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, "alternateDropLocation": true } }, { "commandType": "dropTipInPlace", - "key": "7838e599-70b3-4fca-be2a-792c8c4fdc71", - "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e" } + "key": "0f621a52-7ac3-49b1-a732-4a4547737217", + "params": { + "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e" + } }, { "commandType": "pickUpTip", - "key": "7292e57a-2dd6-4906-9e3f-eefca3e2a3d4", + "key": "25ecc88a-bb2d-40aa-b03d-8c070b64bcfc", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "c6f4ec70-92a5-11e9-ac62-1b173f839d9e:tiprack-10ul:opentrons/opentrons_96_tiprack_10ul/1", @@ -4155,7 +4426,7 @@ }, { "commandType": "aspirate", - "key": "e8e16545-f2b0-4cc8-a69e-9d1235495a4a", + "key": "1bec23d2-cf63-4e75-a758-c8035f509adc", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4163,14 +4434,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "5dbe7aef-ced4-4f28-a524-6de1f2bddcb0", + "key": "84b0d168-b6e6-4bdd-a1b2-714bc49a92b6", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4178,14 +4453,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "2fab0223-fc41-476b-b82b-b6bf0bd266b3", + "key": "75c1c612-a887-4f27-87da-0f43823d416a", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4193,14 +4472,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "2b8c6aa1-1a87-4193-9688-03303eeead9d", + "key": "d168f003-f78d-46fd-9e5a-4f9eda0b3118", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4208,14 +4491,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "1638392f-6776-4523-b0d9-b4d16d21f97d", + "key": "b78fd127-21c8-49b0-aed2-0805c8be3e86", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4223,14 +4510,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "61070197-8d23-4002-ba49-379bd79d832e", + "key": "344402c1-a8fd-43e1-ac66-9432edb241f5", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4238,14 +4529,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "1a855177-cc35-433d-8bbb-eb024f020cb5", + "key": "02347dbb-2094-4e01-b8b6-d01581dde145", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, @@ -4253,24 +4548,33 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 0.6 } }, { "commandType": "touchTip", - "key": "22c26f9b-3b2c-4e3a-8d9c-de465c5b265e", + "key": "975cd29b-7803-4784-afb4-803f0f0d423e", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well:opentrons/usascientific_96_wellplate_2.4ml_deep/1", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 28.5 } } + "wellLocation": { + "origin": "top", + "offset": { + "z": -12.8 + } + } } }, { "commandType": "dispense", - "key": "08159fe2-379b-49e2-8477-773eebf0c8c6", + "key": "b7f1a73a-8831-4a44-9ba7-b5cb519bb215", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, @@ -4278,14 +4582,18 @@ "wellName": "E7", "wellLocation": { "origin": "bottom", - "offset": { "z": 2.5, "x": 0, "y": 0 } + "offset": { + "z": 2.5, + "x": 0, + "y": 0 + } }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "ab49ac5b-31c7-4873-81d9-9ce6016f921b", + "key": "4cc4dd8d-096e-46c1-b679-5350affd8b8a", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -4293,14 +4601,18 @@ "wellName": "E7", "wellLocation": { "origin": "bottom", - "offset": { "z": 2.5, "x": 0, "y": 0 } + "offset": { + "z": 2.5, + "x": 0, + "y": 0 + } }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "f09a9272-eadb-48bf-bf2e-11b2747dbd31", + "key": "53c53d98-c333-4071-8b9c-7ddd30af9156", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -4308,14 +4620,18 @@ "wellName": "E7", "wellLocation": { "origin": "bottom", - "offset": { "z": 2.5, "x": 0, "y": 0 } + "offset": { + "z": 2.5, + "x": 0, + "y": 0 + } }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "78273742-bc66-470c-a727-ddedd08d1b69", + "key": "99bf4d65-85f8-4759-9ba9-97e2aa2e7c0d", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -4323,14 +4639,18 @@ "wellName": "E7", "wellLocation": { "origin": "bottom", - "offset": { "z": 2.5, "x": 0, "y": 0 } + "offset": { + "z": 2.5, + "x": 0, + "y": 0 + } }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "a17cef64-c5e7-4893-9288-222a507f2421", + "key": "aca6fcb1-3f17-444c-9ec8-f15a8abfcfc0", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -4338,23 +4658,31 @@ "wellName": "E7", "wellLocation": { "origin": "bottom", - "offset": { "z": 2.5, "x": 0, "y": 0 } + "offset": { + "z": 2.5, + "x": 0, + "y": 0 + } }, "flowRate": 10 } }, { "commandType": "moveToAddressableArea", - "key": "e7015888-4542-4287-bf5d-54c3d7af1790", + "key": "03e1fe26-33b6-44b6-be58-0287e71c28f3", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", - "offset": { "x": 0, "y": 0, "z": 0 } + "offset": { + "x": 0, + "y": 0, + "z": 0 + } } }, { "commandType": "blowOutInPlace", - "key": "9d125170-0c77-410e-80dc-c48a0dc89610", + "key": "5a2c56e4-bc46-4855-8c5e-9bfce14ae3b9", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "flowRate": 1000 @@ -4362,32 +4690,43 @@ }, { "commandType": "touchTip", - "key": "21d3d90c-e2f0-4d94-ae10-064b218e4a71", + "key": "6d85e783-0eca-4bb3-a3a2-166d2071ebe8", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well:opentrons/usascientific_96_wellplate_2.4ml_deep/1", "wellName": "E7", - "wellLocation": { "origin": "bottom", "offset": { "z": 40.3 } } + "wellLocation": { + "origin": "top", + "offset": { + "z": -1 + } + } } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "978cd7b1-fe78-4982-813c-e350ce72089b", + "key": "41c7dd1d-0e8a-4586-8ba1-f1daf5e749e6", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", - "offset": { "x": 0, "y": 0, "z": 0 }, + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, "alternateDropLocation": true } }, { "commandType": "dropTipInPlace", - "key": "3753055c-cded-4904-bd26-59f65fe67365", - "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e" } + "key": "eb5b780c-0a3e-411e-b596-0e32558910a0", + "params": { + "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e" + } }, { "commandType": "pickUpTip", - "key": "909fb7ce-c2a8-4fa1-aabc-904a55f506dd", + "key": "d797963b-39f7-4720-a4c1-8d81f4f9c472", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "c6f4ec70-92a5-11e9-ac62-1b173f839d9e:tiprack-10ul:opentrons/opentrons_96_tiprack_10ul/1", @@ -4396,7 +4735,7 @@ }, { "commandType": "aspirate", - "key": "6530a82f-60be-495b-9c83-9345f31dcba2", + "key": "5c224719-928e-4af8-b7aa-f10b65946c11", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4404,14 +4743,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "77ecf614-b1db-4a97-90e0-835d80b92115", + "key": "1aba110d-735e-46ad-a5e6-020663d29ebc", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4419,14 +4762,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "3bececfa-3a05-412a-8be0-4212cbaa45a6", + "key": "7254a835-c333-43a6-b9e1-25ef28edbad5", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4434,14 +4781,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "74394c64-f987-467b-9572-b7bc30ea07c6", + "key": "0450994c-9de9-4f5e-9c26-710421e396d6", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4449,14 +4800,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "880891f1-58d4-45cc-b511-4492fa0a05a1", + "key": "d1b342f4-62d8-49a8-be58-2dd480edd145", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4464,14 +4819,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "7d0a5ff2-9bec-4fe9-933d-829d6490aa23", + "key": "032db156-a716-4fa2-8683-99cd424483c6", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4479,14 +4838,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "22e4b34c-a57e-427c-96ad-e9394a06b06d", + "key": "0c4b6581-62ce-49f2-8916-1086071c579b", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, @@ -4494,24 +4857,33 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 0.6 } }, { "commandType": "touchTip", - "key": "391d6c31-bc93-494b-8125-73ecbed2c870", + "key": "b4a66d40-394a-4350-ad29-0a3b7bbde31b", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well:opentrons/usascientific_96_wellplate_2.4ml_deep/1", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 28.5 } } + "wellLocation": { + "origin": "top", + "offset": { + "z": -12.8 + } + } } }, { "commandType": "dispense", - "key": "2297ef01-9ad7-4b4a-ae78-ae6c052e8ad3", + "key": "8409f328-898c-48d5-b2f0-14334072d2a2", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, @@ -4519,14 +4891,18 @@ "wellName": "D7", "wellLocation": { "origin": "bottom", - "offset": { "z": 2.5, "x": 0, "y": 0 } + "offset": { + "z": 2.5, + "x": 0, + "y": 0 + } }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "ace95699-e77a-4f9c-9191-32deb8e50cee", + "key": "3f6459ee-02d6-499e-ba89-f0ebffb48d88", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -4534,14 +4910,18 @@ "wellName": "D7", "wellLocation": { "origin": "bottom", - "offset": { "z": 2.5, "x": 0, "y": 0 } + "offset": { + "z": 2.5, + "x": 0, + "y": 0 + } }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "52c092b8-4ee1-40c8-afa1-558e67754527", + "key": "1bf54eb3-f3ba-43f7-9ccc-43c83b1fcf13", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -4549,14 +4929,18 @@ "wellName": "D7", "wellLocation": { "origin": "bottom", - "offset": { "z": 2.5, "x": 0, "y": 0 } + "offset": { + "z": 2.5, + "x": 0, + "y": 0 + } }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "c9119064-bab6-4445-b2eb-a555d6a167d7", + "key": "8166d4a6-0a41-4a2c-bccb-043859a9f1d8", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -4564,14 +4948,18 @@ "wellName": "D7", "wellLocation": { "origin": "bottom", - "offset": { "z": 2.5, "x": 0, "y": 0 } + "offset": { + "z": 2.5, + "x": 0, + "y": 0 + } }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "e31f30a3-0741-4beb-a30f-aff8b950f291", + "key": "47d7fd68-05b0-41f6-9c4c-7a37aa7bcb13", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -4579,23 +4967,31 @@ "wellName": "D7", "wellLocation": { "origin": "bottom", - "offset": { "z": 2.5, "x": 0, "y": 0 } + "offset": { + "z": 2.5, + "x": 0, + "y": 0 + } }, "flowRate": 10 } }, { "commandType": "moveToAddressableArea", - "key": "ddddff22-6c24-4ead-bbe5-57ac119545ce", + "key": "3809644f-92fa-4da0-9db5-542c0a181e8c", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", - "offset": { "x": 0, "y": 0, "z": 0 } + "offset": { + "x": 0, + "y": 0, + "z": 0 + } } }, { "commandType": "blowOutInPlace", - "key": "ecf9066a-aea2-457f-a9cd-dd7d7f8f5902", + "key": "929ce1cb-82cb-4c39-92a3-39c628b019c9", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "flowRate": 1000 @@ -4603,32 +4999,43 @@ }, { "commandType": "touchTip", - "key": "0c8c0b40-dd64-4d38-a833-0b595be028eb", + "key": "6d135454-0d51-49df-bf4c-4e2bb813f1d2", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well:opentrons/usascientific_96_wellplate_2.4ml_deep/1", "wellName": "D7", - "wellLocation": { "origin": "bottom", "offset": { "z": 40.3 } } + "wellLocation": { + "origin": "top", + "offset": { + "z": -1 + } + } } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "837c34b1-09e0-4151-973e-71978f71797a", + "key": "349625a9-aa2b-4d35-b40b-8ef14e586a51", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", - "offset": { "x": 0, "y": 0, "z": 0 }, + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, "alternateDropLocation": true } }, { "commandType": "dropTipInPlace", - "key": "3c7c4d44-d1b9-43ce-9164-fd7d938cfb33", - "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e" } + "key": "444440c9-00d5-4348-99a9-1a3cb1f742fd", + "params": { + "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e" + } }, { "commandType": "pickUpTip", - "key": "56d7d95b-5fd4-4dcc-9b58-afbb11df5803", + "key": "4c52ae1d-70b1-4dc9-83e7-02b3af2c200e", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "c6f4ec70-92a5-11e9-ac62-1b173f839d9e:tiprack-10ul:opentrons/opentrons_96_tiprack_10ul/1", @@ -4637,7 +5044,7 @@ }, { "commandType": "aspirate", - "key": "0e53a9ea-f3e5-414b-a43d-6d2a9a691e07", + "key": "5640b654-9339-4845-9b40-a6beba046904", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4645,14 +5052,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "7f0ccabc-38e2-4e3b-87c2-0a0b0d0a9cb0", + "key": "592654fb-22db-4ace-b2a7-f68f56a9967b", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4660,14 +5071,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "17cf96fd-15c4-45ec-a761-539855aa4467", + "key": "3d039399-6e83-4a41-a3d1-2ab1c5482824", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4675,14 +5090,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "00df1eee-e233-4db3-b194-922635c24055", + "key": "d0fe6ba1-5037-4b30-a5c5-22efa87fa431", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4690,14 +5109,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "85725880-3603-496d-8971-475b656e25e3", + "key": "df2ba6f0-4d77-430b-97fc-5ce88b1f3947", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4705,14 +5128,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "3dd79bca-76f6-4b85-af9a-b4e5b5fad56c", + "key": "85078a16-bdf9-471d-9b07-4938634c49c9", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4720,14 +5147,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "6dca2dbc-fd19-4719-a6af-5172b08e7052", + "key": "bc04ada5-ca7f-4bc5-bf00-d85e82360ab8", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, @@ -4735,24 +5166,33 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 0.6 } }, { "commandType": "touchTip", - "key": "a3a82297-8954-4db3-8124-98c75ff1d291", + "key": "2cc0af02-6209-4482-9436-4a3cbf4e52d6", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well:opentrons/usascientific_96_wellplate_2.4ml_deep/1", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 28.5 } } + "wellLocation": { + "origin": "top", + "offset": { + "z": -12.8 + } + } } }, { "commandType": "dispense", - "key": "3fa90905-3c11-4831-9eb0-bb8401c7b57f", + "key": "6d084361-fbed-49c1-af3e-28e58e8e60b7", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, @@ -4760,14 +5200,18 @@ "wellName": "C7", "wellLocation": { "origin": "bottom", - "offset": { "z": 2.5, "x": 0, "y": 0 } + "offset": { + "z": 2.5, + "x": 0, + "y": 0 + } }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "fd7f4b56-c287-45ff-8e75-ddf57cfd9d53", + "key": "dd665ee5-3242-4c63-afe0-e2083810ee37", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -4775,14 +5219,18 @@ "wellName": "C7", "wellLocation": { "origin": "bottom", - "offset": { "z": 2.5, "x": 0, "y": 0 } + "offset": { + "z": 2.5, + "x": 0, + "y": 0 + } }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "4b84949e-accd-45e5-bf9a-758dcd482bb9", + "key": "7ef70d87-4be3-4260-8098-39599f8a1fb0", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -4790,14 +5238,18 @@ "wellName": "C7", "wellLocation": { "origin": "bottom", - "offset": { "z": 2.5, "x": 0, "y": 0 } + "offset": { + "z": 2.5, + "x": 0, + "y": 0 + } }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "6ec22efa-a14a-4694-95e6-f0ea4328e461", + "key": "588334ee-930e-4a6d-a1ab-69c145197023", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -4805,14 +5257,18 @@ "wellName": "C7", "wellLocation": { "origin": "bottom", - "offset": { "z": 2.5, "x": 0, "y": 0 } + "offset": { + "z": 2.5, + "x": 0, + "y": 0 + } }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "3ed05672-7bc9-4c64-9701-c45201db825b", + "key": "857d9f81-2181-4ca2-9389-cad3fa9aee70", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -4820,23 +5276,31 @@ "wellName": "C7", "wellLocation": { "origin": "bottom", - "offset": { "z": 2.5, "x": 0, "y": 0 } + "offset": { + "z": 2.5, + "x": 0, + "y": 0 + } }, "flowRate": 10 } }, { "commandType": "moveToAddressableArea", - "key": "3214674c-48d4-49c5-a4e7-1a3314087fad", + "key": "ad2d67a4-625c-437b-96c8-e48fd7918577", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", - "offset": { "x": 0, "y": 0, "z": 0 } + "offset": { + "x": 0, + "y": 0, + "z": 0 + } } }, { "commandType": "blowOutInPlace", - "key": "f2410019-bafd-4d21-aec1-118a61e7db16", + "key": "2d154de5-d3e3-4641-a1e3-5c006d810006", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "flowRate": 1000 @@ -4844,32 +5308,43 @@ }, { "commandType": "touchTip", - "key": "88ecb703-7c28-46ca-8f7d-d41ef09ddce7", + "key": "6b0659e9-1856-4550-8279-fb82fc2e94a7", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well:opentrons/usascientific_96_wellplate_2.4ml_deep/1", "wellName": "C7", - "wellLocation": { "origin": "bottom", "offset": { "z": 40.3 } } + "wellLocation": { + "origin": "top", + "offset": { + "z": -1 + } + } } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "1b2e7055-e56f-44db-a093-3ffe91d7af2e", + "key": "cec99b96-c228-4e2a-a143-fbbbfb50901e", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", - "offset": { "x": 0, "y": 0, "z": 0 }, + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, "alternateDropLocation": true } }, { "commandType": "dropTipInPlace", - "key": "887afac4-2afc-420d-af33-20f4d049ef83", - "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e" } + "key": "15825029-3fab-4e68-9469-560e148e7ced", + "params": { + "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e" + } }, { "commandType": "pickUpTip", - "key": "99c83784-aac8-49b8-a325-ca59a77a2d39", + "key": "161b384c-5c92-4056-8015-2719ee427475", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "c6f4ec70-92a5-11e9-ac62-1b173f839d9e:tiprack-10ul:opentrons/opentrons_96_tiprack_10ul/1", @@ -4878,7 +5353,7 @@ }, { "commandType": "aspirate", - "key": "032204ef-7200-4162-88ce-8979712b73b6", + "key": "08f3fb64-eaf8-4416-aa23-baba231efed0", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4886,14 +5361,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "efac47fc-8368-41e6-976f-e365ae5e27c3", + "key": "651d97ff-dc34-41cd-8dd4-c0b94f21c674", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4901,14 +5380,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "ba869fd1-338e-4a36-b92b-1cbfa10e0e6b", + "key": "ca22a85d-6732-4c43-a8ea-4a857065ddd2", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4916,14 +5399,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "65d6e8bf-7045-49cf-879c-638d7afbef6e", + "key": "f16da0ca-bba1-4ee1-a2ed-f68fdbeee204", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4931,14 +5418,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "51d7a3d8-f604-48f4-9815-0b2a482dc099", + "key": "c91c5044-4c23-420e-9892-a4067215d78d", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4946,14 +5437,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "d49b79f2-e775-4f2d-a7a1-078f4f462c6a", + "key": "47346096-1081-4817-96c9-77d799327011", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4961,14 +5456,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "258c84fb-2554-418f-bb48-2c5dd0113e6d", + "key": "35813192-b966-4cbd-95a9-9d87cae07adc", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, @@ -4976,24 +5475,33 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 0.6 } }, { "commandType": "touchTip", - "key": "a400dae9-231d-442e-b9be-6b6740a6d1ff", + "key": "eac2a4b2-65cc-4c8d-b8d8-01b2c9bf2a20", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well:opentrons/usascientific_96_wellplate_2.4ml_deep/1", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 28.5 } } + "wellLocation": { + "origin": "top", + "offset": { + "z": -12.8 + } + } } }, { "commandType": "dispense", - "key": "996547db-dc17-46fe-80fd-7b3760e2a710", + "key": "194be867-02d5-48d1-a19f-9c01fb832068", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, @@ -5001,14 +5509,18 @@ "wellName": "E6", "wellLocation": { "origin": "bottom", - "offset": { "z": 2.5, "x": 0, "y": 0 } + "offset": { + "z": 2.5, + "x": 0, + "y": 0 + } }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "fce348a2-d9ab-47d9-a23f-5ad5afbe6213", + "key": "99ffbb3c-e5a2-48f4-a4a4-811b6839aeea", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -5016,14 +5528,18 @@ "wellName": "E6", "wellLocation": { "origin": "bottom", - "offset": { "z": 2.5, "x": 0, "y": 0 } + "offset": { + "z": 2.5, + "x": 0, + "y": 0 + } }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "bd691e8d-5a43-4630-bd2f-d15a5cac84ba", + "key": "78a477c6-5414-480e-8953-0ba4bb94f220", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -5031,14 +5547,18 @@ "wellName": "E6", "wellLocation": { "origin": "bottom", - "offset": { "z": 2.5, "x": 0, "y": 0 } + "offset": { + "z": 2.5, + "x": 0, + "y": 0 + } }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "47363021-51c0-46b3-bdaf-b22e8017e603", + "key": "1f7e8e1b-8f71-4782-b731-266da9db63ff", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -5046,14 +5566,18 @@ "wellName": "E6", "wellLocation": { "origin": "bottom", - "offset": { "z": 2.5, "x": 0, "y": 0 } + "offset": { + "z": 2.5, + "x": 0, + "y": 0 + } }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "5adf5988-06f9-429f-bf9a-636a8ff7fdc2", + "key": "7e06c384-46d3-40af-b820-96c86d8a5da5", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -5061,23 +5585,31 @@ "wellName": "E6", "wellLocation": { "origin": "bottom", - "offset": { "z": 2.5, "x": 0, "y": 0 } + "offset": { + "z": 2.5, + "x": 0, + "y": 0 + } }, "flowRate": 10 } }, { "commandType": "moveToAddressableArea", - "key": "cd7d35ea-8c31-4120-8060-479cc8870a5c", + "key": "fca397e0-65a0-48d6-83fe-05132b2ddc24", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", - "offset": { "x": 0, "y": 0, "z": 0 } + "offset": { + "x": 0, + "y": 0, + "z": 0 + } } }, { "commandType": "blowOutInPlace", - "key": "e29427fb-9b59-4a8c-ac2f-8b0acbbf0e47", + "key": "8f53ee29-11fb-441b-9719-97c132f275b5", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "flowRate": 1000 @@ -5085,32 +5617,43 @@ }, { "commandType": "touchTip", - "key": "055db5bf-e418-426a-842f-f07e9dfa8510", + "key": "0699658d-fb6c-4b56-b803-00dd96940cc4", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well:opentrons/usascientific_96_wellplate_2.4ml_deep/1", "wellName": "E6", - "wellLocation": { "origin": "bottom", "offset": { "z": 40.3 } } + "wellLocation": { + "origin": "top", + "offset": { + "z": -1 + } + } } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "6ebb374e-7108-4ddf-92a0-512dc2e60530", + "key": "9b306194-770b-49ef-bcd3-95c64244679e", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", - "offset": { "x": 0, "y": 0, "z": 0 }, + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, "alternateDropLocation": true } }, { "commandType": "dropTipInPlace", - "key": "6c5de725-903a-451f-932a-2f8380204b07", - "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e" } + "key": "0c9714a3-0018-44fa-a531-8dcf9c168d1a", + "params": { + "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e" + } }, { "commandType": "pickUpTip", - "key": "f4d2c29a-8814-4af1-b120-3df7802369bd", + "key": "e13d0327-a840-4de7-b7ce-fbde43257c34", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "c6f4ec70-92a5-11e9-ac62-1b173f839d9e:tiprack-10ul:opentrons/opentrons_96_tiprack_10ul/1", @@ -5119,7 +5662,7 @@ }, { "commandType": "aspirate", - "key": "8d578f42-5a41-41bc-9df1-c4a244810ad8", + "key": "2a19acac-8b2f-4f28-8eee-826a8d6bff15", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -5127,14 +5670,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "172cdb6c-6d8b-4668-9608-5a3b362687e3", + "key": "88afadcf-1256-437e-856c-4f615ccb4a72", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -5142,14 +5689,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "07192ce9-231f-4eaf-a698-59f7e599a5e1", + "key": "d8319c46-7fd0-4f68-82d1-6a761556ec85", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -5157,14 +5708,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "2477ea35-fd4a-4c0e-b470-a0c1d4f11916", + "key": "5e18da13-4b92-4733-9e9c-26f57a5eb5b4", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -5172,14 +5727,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "cbfd20c0-260e-4cb0-98f9-e816cf8583a5", + "key": "18fb939f-0390-4741-9fee-50b1911936c0", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -5187,14 +5746,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "5a975240-eedd-426a-8b6b-f8cdcb3d75df", + "key": "40da27db-1412-440d-bbd0-5148b6f64ed7", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -5202,14 +5765,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "1d313faa-21c1-47ab-ba1e-3c68c08d6682", + "key": "9f504ffd-465d-495b-a656-109d35cfe9b1", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, @@ -5217,24 +5784,33 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 0.6 } }, { "commandType": "touchTip", - "key": "7fb499b3-a3ee-45c8-b7d4-f6c5b51724a7", + "key": "394d2f74-5e28-4e6f-b815-c97087c89691", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well:opentrons/usascientific_96_wellplate_2.4ml_deep/1", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 28.5 } } + "wellLocation": { + "origin": "top", + "offset": { + "z": -12.8 + } + } } }, { "commandType": "dispense", - "key": "fdb1ebdf-4f40-4107-bc38-b27d6e256168", + "key": "8cb558bd-2ea6-497c-b070-af6e41664a26", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, @@ -5242,14 +5818,18 @@ "wellName": "D6", "wellLocation": { "origin": "bottom", - "offset": { "z": 2.5, "x": 0, "y": 0 } + "offset": { + "z": 2.5, + "x": 0, + "y": 0 + } }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "5588de92-8c5c-4c96-9130-e846c2141cb5", + "key": "3274dd59-0600-4c2a-890a-fecfac8b5862", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -5257,14 +5837,18 @@ "wellName": "D6", "wellLocation": { "origin": "bottom", - "offset": { "z": 2.5, "x": 0, "y": 0 } + "offset": { + "z": 2.5, + "x": 0, + "y": 0 + } }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "553f79bb-469d-40f8-82e7-0525a157a515", + "key": "21d4fc28-b92e-4e45-a1ef-cccee395e3ec", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -5272,14 +5856,18 @@ "wellName": "D6", "wellLocation": { "origin": "bottom", - "offset": { "z": 2.5, "x": 0, "y": 0 } + "offset": { + "z": 2.5, + "x": 0, + "y": 0 + } }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "d9ac760b-6f17-4a99-95d8-d0ff36a3ef7d", + "key": "7d9b7d52-8963-41bd-869a-afb3273ad34e", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -5287,14 +5875,18 @@ "wellName": "D6", "wellLocation": { "origin": "bottom", - "offset": { "z": 2.5, "x": 0, "y": 0 } + "offset": { + "z": 2.5, + "x": 0, + "y": 0 + } }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "20cd8b27-c1ac-4d31-8a11-584721bde3a4", + "key": "35a3b1ab-efa8-4f6b-b074-b5bedb66f827", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -5302,23 +5894,31 @@ "wellName": "D6", "wellLocation": { "origin": "bottom", - "offset": { "z": 2.5, "x": 0, "y": 0 } + "offset": { + "z": 2.5, + "x": 0, + "y": 0 + } }, "flowRate": 10 } }, { "commandType": "moveToAddressableArea", - "key": "dd41fb74-88d2-4aa9-b6f7-86e18ca5afbf", + "key": "9acfc10b-c99c-4f11-a270-0f5eec661be5", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", - "offset": { "x": 0, "y": 0, "z": 0 } + "offset": { + "x": 0, + "y": 0, + "z": 0 + } } }, { "commandType": "blowOutInPlace", - "key": "5d2b2fa4-f9e0-4d09-b606-c67ff286e82e", + "key": "e3135725-cb6f-45a1-9fe0-d19f04f27656", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "flowRate": 1000 @@ -5326,32 +5926,43 @@ }, { "commandType": "touchTip", - "key": "5524711b-b289-453c-a9b5-9d6e0760448a", + "key": "96673cd7-fd03-4c0a-bb2a-b14a0ffb0ccb", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well:opentrons/usascientific_96_wellplate_2.4ml_deep/1", "wellName": "D6", - "wellLocation": { "origin": "bottom", "offset": { "z": 40.3 } } + "wellLocation": { + "origin": "top", + "offset": { + "z": -1 + } + } } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "ae31c5da-59cf-4b17-a30b-b712cd892995", + "key": "2132f0ae-ea2e-443b-a971-5c79ee30f789", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", - "offset": { "x": 0, "y": 0, "z": 0 }, + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, "alternateDropLocation": true } }, { "commandType": "dropTipInPlace", - "key": "06c8ba10-b4b4-461b-8381-731d159e8509", - "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e" } + "key": "9c328923-a752-40b1-9270-ed97a3a0c553", + "params": { + "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e" + } }, { "commandType": "pickUpTip", - "key": "560e6912-0b9d-4561-97ac-196f47dfe375", + "key": "988563f5-56c4-4e21-a92b-b6e2dfb8bde5", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "c6f4ec70-92a5-11e9-ac62-1b173f839d9e:tiprack-10ul:opentrons/opentrons_96_tiprack_10ul/1", @@ -5360,7 +5971,7 @@ }, { "commandType": "aspirate", - "key": "87a77e2e-7c20-4bd9-9b7b-2f8ed718d8d4", + "key": "c98f3b96-fd38-40f2-9794-828ff525969c", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -5368,14 +5979,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "dbfac2d3-a21f-4018-b519-11099d3bb60e", + "key": "576cd475-ef5a-4016-a705-efd349d2e442", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -5383,14 +5998,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "9d900527-0693-47a3-96e8-6f0a84c7136d", + "key": "e7ee52ac-8fcf-44ba-82a2-1db637e376be", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -5398,14 +6017,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "7c47f5c3-600f-45a6-85e8-198b08ce8ca3", + "key": "77016b31-a245-40fc-a52e-c83b3004b81f", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -5413,14 +6036,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "be4c39f4-a573-48cc-b67a-8195876a9434", + "key": "7db3ab8a-5903-4960-bbdc-26497da191ad", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -5428,14 +6055,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "63df05b9-c646-449e-8c78-4ab053fc7236", + "key": "910d7439-52d6-4a16-a6a5-0b71e3c32696", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -5443,14 +6074,18 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "66ea2943-615f-4e05-b695-ea94afd3c322", + "key": "39bfaad3-fdc2-42d1-8f12-d2684d0a9bbf", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, @@ -5458,24 +6093,33 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 0.6 } }, { "commandType": "touchTip", - "key": "961aa4da-95ef-486b-8c13-f662a4ec90ed", + "key": "44f4d1a4-26c3-435e-810c-ecaad59a55ab", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well:opentrons/usascientific_96_wellplate_2.4ml_deep/1", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 28.5 } } + "wellLocation": { + "origin": "top", + "offset": { + "z": -12.8 + } + } } }, { "commandType": "dispense", - "key": "d2f4161e-c8da-4bd5-90e7-b28925b34712", + "key": "ddc2756d-38e4-4d42-81a1-ad531797ec79", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, @@ -5483,14 +6127,18 @@ "wellName": "C6", "wellLocation": { "origin": "bottom", - "offset": { "z": 2.5, "x": 0, "y": 0 } + "offset": { + "z": 2.5, + "x": 0, + "y": 0 + } }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "bb6c6910-1ba0-4b97-9eca-3ebbd2cb59fd", + "key": "23ecb712-813c-4221-92b5-b7ad0df7c91e", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -5498,14 +6146,18 @@ "wellName": "C6", "wellLocation": { "origin": "bottom", - "offset": { "z": 2.5, "x": 0, "y": 0 } + "offset": { + "z": 2.5, + "x": 0, + "y": 0 + } }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "7d0b6237-00a2-4ad2-9f68-810c340500d0", + "key": "020d2f92-da37-4230-9041-0d746dbc81c8", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -5513,14 +6165,18 @@ "wellName": "C6", "wellLocation": { "origin": "bottom", - "offset": { "z": 2.5, "x": 0, "y": 0 } + "offset": { + "z": 2.5, + "x": 0, + "y": 0 + } }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "b238433e-3255-437b-8908-d621c9b36010", + "key": "9493caea-f0ee-459a-b286-b656c540fa19", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -5528,14 +6184,18 @@ "wellName": "C6", "wellLocation": { "origin": "bottom", - "offset": { "z": 2.5, "x": 0, "y": 0 } + "offset": { + "z": 2.5, + "x": 0, + "y": 0 + } }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "25fdfced-9695-4f87-ba20-258f4168235c", + "key": "2fd36c9a-4387-4e0d-b96b-c095c325450c", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -5543,23 +6203,31 @@ "wellName": "C6", "wellLocation": { "origin": "bottom", - "offset": { "z": 2.5, "x": 0, "y": 0 } + "offset": { + "z": 2.5, + "x": 0, + "y": 0 + } }, "flowRate": 10 } }, { "commandType": "moveToAddressableArea", - "key": "484d5412-4981-46a9-aa9d-fc237de669c1", + "key": "c5c15d57-b094-4344-8a9d-ef55442e587c", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", - "offset": { "x": 0, "y": 0, "z": 0 } + "offset": { + "x": 0, + "y": 0, + "z": 0 + } } }, { "commandType": "blowOutInPlace", - "key": "960ad7f1-4740-4af5-883a-51e5d387f768", + "key": "9f3a5bc5-d27e-47f3-996c-873edee7e793", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "flowRate": 1000 @@ -5567,32 +6235,43 @@ }, { "commandType": "touchTip", - "key": "6ea95c68-c58f-4036-906b-7c72a5c01adf", + "key": "817158fe-bf57-4d1e-a6a4-020cfd8d79ab", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well:opentrons/usascientific_96_wellplate_2.4ml_deep/1", "wellName": "C6", - "wellLocation": { "origin": "bottom", "offset": { "z": 40.3 } } + "wellLocation": { + "origin": "top", + "offset": { + "z": -1 + } + } } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "3ba5513e-5a3f-4423-a4ed-cebb8b4c4e64", + "key": "30538d0c-d451-46fe-a19d-56f564b351e5", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", - "offset": { "x": 0, "y": 0, "z": 0 }, + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, "alternateDropLocation": true } }, { "commandType": "dropTipInPlace", - "key": "718269ea-ade8-4059-b891-740e1a430d26", - "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e" } + "key": "08f1c64b-09d5-4ac2-a5c3-3d152da7cad2", + "params": { + "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e" + } }, { "commandType": "pickUpTip", - "key": "17931110-50d0-4a12-894c-28227d345619", + "key": "45323d95-f2a6-47a2-8854-62e54e92585b", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "c6f4ec70-92a5-11e9-ac62-1b173f839d9e:tiprack-10ul:opentrons/opentrons_96_tiprack_10ul/1", @@ -5601,7 +6280,7 @@ }, { "commandType": "aspirate", - "key": "36a8b6c7-154b-4aea-ab30-f7a345be28a5", + "key": "befaaff7-d4e1-4b3c-9c0c-d40c2b956962", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 5.5, @@ -5609,14 +6288,18 @@ "wellName": "F1", "wellLocation": { "origin": "bottom", - "offset": { "z": 0.5, "x": 0, "y": 0 } + "offset": { + "z": 0.5, + "x": 0, + "y": 0 + } }, "flowRate": 8 } }, { "commandType": "dispense", - "key": "e7846997-ae31-467a-b77e-b858b9d0a9f0", + "key": "bac1ea10-10c5-41ca-96ce-781304f8675e", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 5.5, @@ -5624,14 +6307,18 @@ "wellName": "F1", "wellLocation": { "origin": "bottom", - "offset": { "z": 0.5, "x": 0, "y": 0 } + "offset": { + "z": 0.5, + "x": 0, + "y": 0 + } }, "flowRate": 7 } }, { "commandType": "aspirate", - "key": "886f51e9-f580-477a-a333-f9d03085b96c", + "key": "f37e217e-4939-44e2-9671-9b05ad14786d", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 5.5, @@ -5639,14 +6326,18 @@ "wellName": "F1", "wellLocation": { "origin": "bottom", - "offset": { "z": 0.5, "x": 0, "y": 0 } + "offset": { + "z": 0.5, + "x": 0, + "y": 0 + } }, "flowRate": 8 } }, { "commandType": "dispense", - "key": "ad41bba6-ce89-4eae-ad93-b1c1dc6bfb01", + "key": "c159f36c-e926-4875-b99b-4add3525c4e3", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 5.5, @@ -5654,14 +6345,18 @@ "wellName": "F1", "wellLocation": { "origin": "bottom", - "offset": { "z": 0.5, "x": 0, "y": 0 } + "offset": { + "z": 0.5, + "x": 0, + "y": 0 + } }, "flowRate": 7 } }, { "commandType": "aspirate", - "key": "7a8f74a2-108a-45d2-91e5-f53c57402612", + "key": "25ae2b7c-b305-4e87-840d-42de7ded3b4b", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 5.5, @@ -5669,14 +6364,18 @@ "wellName": "F1", "wellLocation": { "origin": "bottom", - "offset": { "z": 0.5, "x": 0, "y": 0 } + "offset": { + "z": 0.5, + "x": 0, + "y": 0 + } }, "flowRate": 8 } }, { "commandType": "dispense", - "key": "d06aee21-cccb-468d-9342-95ae2d6cdb5b", + "key": "23397b4a-4383-42ed-b8f4-e44f3a010a71", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 5.5, @@ -5684,23 +6383,31 @@ "wellName": "F1", "wellLocation": { "origin": "bottom", - "offset": { "z": 0.5, "x": 0, "y": 0 } + "offset": { + "z": 0.5, + "x": 0, + "y": 0 + } }, "flowRate": 7 } }, { "commandType": "moveToAddressableArea", - "key": "34463a2c-f0bd-414a-b4c4-190f1914da80", + "key": "890a6535-a85d-466f-8505-64405697b5a0", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", - "offset": { "x": 0, "y": 0, "z": 0 } + "offset": { + "x": 0, + "y": 0, + "z": 0 + } } }, { "commandType": "blowOutInPlace", - "key": "6ae059c8-3e79-4444-9453-dd63e6fc013a", + "key": "c8253121-dac9-4f54-93f9-f5db77f7c879", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "flowRate": 1000 @@ -5708,33 +6415,47 @@ }, { "commandType": "touchTip", - "key": "ee56d8f7-e42e-412e-aa17-5512ee6a7dd6", + "key": "57b65cb0-810c-44f2-b3bb-9a4c9d7e829d", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well:opentrons/usascientific_96_wellplate_2.4ml_deep/1", "wellName": "F1", - "wellLocation": { "origin": "bottom", "offset": { "z": 30.5 } } + "wellLocation": { + "origin": "top", + "offset": { + "z": -10.8 + } + } } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "83d1b62e-b229-47c9-870b-c8ab13783a23", + "key": "0d13cd12-8ca0-4ead-bfbd-debe41d9a00e", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", - "offset": { "x": 0, "y": 0, "z": 0 }, + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, "alternateDropLocation": true } }, { "commandType": "dropTipInPlace", - "key": "a38630c2-540e-409a-a279-3ea9f160f8f4", - "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e" } + "key": "087b6b54-6e37-48c3-aeda-91ee0b43febc", + "params": { + "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e" + } }, { "commandType": "waitForDuration", - "key": "05eaeafe-5354-48fb-b511-558342b7ed25", - "params": { "seconds": 3723, "message": "Delay plz" } + "key": "f1e0270b-15e2-4ba6-adaa-4369bd92c271", + "params": { + "seconds": 3723, + "message": "Delay plz" + } } ], "commandAnnotationSchemaId": "opentronsCommandAnnotationSchemaV1", diff --git a/protocol-designer/fixtures/protocol/8/newAdvancedSettingsAndMultiTemp.json b/protocol-designer/fixtures/protocol/8/newAdvancedSettingsAndMultiTemp.json index 8b8d129418f..bf2f4da7476 100644 --- a/protocol-designer/fixtures/protocol/8/newAdvancedSettingsAndMultiTemp.json +++ b/protocol-designer/fixtures/protocol/8/newAdvancedSettingsAndMultiTemp.json @@ -6,16 +6,16 @@ "author": "", "description": "", "created": 1714565695341, - "lastModified": 1731355906825, + "lastModified": 1738157367073, "category": null, "subcategory": null, "tags": [] }, "designerApplication": { "name": "opentrons/protocol-designer", - "version": "8.2.2", + "version": "8.5.0", "data": { - "_internalAppBuildDate": "Mon, 11 Nov 2024 20:10:44 GMT", + "_internalAppBuildDate": "Wed, 29 Jan 2025 13:23:47 GMT", "defaultValues": { "aspirate_mmFromBottom": 1, "dispense_mmFromBottom": 1, @@ -27,7 +27,10 @@ "opentrons/opentrons_flex_96_tiprack_50ul/1" ] }, - "dismissedWarnings": { "form": [], "timeline": [] }, + "dismissedWarnings": { + "form": [], + "timeline": [] + }, "ingredients": {}, "ingredLocations": {}, "savedStepForms": { @@ -61,7 +64,7 @@ "aspirate_mix_volume": null, "aspirate_mmFromBottom": 29, "aspirate_touchTip_checkbox": false, - "aspirate_touchTip_mmFromBottom": null, + "aspirate_touchTip_mmFromTop": null, "aspirate_wellOrder_first": "t2b", "aspirate_wellOrder_second": "l2r", "aspirate_wells_grouped": false, @@ -85,7 +88,7 @@ "dispense_mix_volume": null, "dispense_mmFromBottom": null, "dispense_touchTip_checkbox": false, - "dispense_touchTip_mmFromBottom": null, + "dispense_touchTip_mmFromTop": null, "dispense_wellOrder_first": "t2b", "dispense_wellOrder_second": "l2r", "dispense_wells": ["B3"], @@ -100,10 +103,11 @@ "preWetTip": false, "tipRack": "opentrons/opentrons_flex_96_tiprack_50ul/1", "volume": "10", - "id": "292e8b18-f59e-4c63-b0f3-e242bf50094b", "stepType": "moveLiquid", "stepName": "transfer", - "stepDetails": "" + "stepDetails": "", + "id": "292e8b18-f59e-4c63-b0f3-e242bf50094b", + "dispense_touchTip_mmfromTop": null }, "960c2d3b-9cf9-49b0-ab4c-af4113f6671a": { "moduleId": "d6966555-6c0e-45e0-8056-428d7c486401:temperatureModuleType", @@ -175,7 +179,10 @@ ] } }, - "robot": { "model": "OT-3 Standard", "deckId": "ot3_standard" }, + "robot": { + "model": "OT-3 Standard", + "deckId": "ot3_standard" + }, "labwareDefinitionSchemaId": "opentronsLabwareSchemaV2", "labwareDefinitions": { "opentrons/opentrons_flex_96_tiprack_50ul/1": { @@ -193,7 +200,10 @@ ["A11", "B11", "C11", "D11", "E11", "F11", "G11", "H11"], ["A12", "B12", "C12", "D12", "E12", "F12", "G12", "H12"] ], - "brand": { "brand": "Opentrons", "brandId": [] }, + "brand": { + "brand": "Opentrons", + "brandId": [] + }, "metadata": { "displayName": "Opentrons Flex 96 Tip Rack 50 µL", "displayCategory": "tipRack", @@ -1188,9 +1198,17 @@ "namespace": "opentrons", "version": 1, "schemaVersion": 2, - "cornerOffsetFromSlot": { "x": 0, "y": 0, "z": 0 }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, "stackingOffsetWithLabware": { - "opentrons_flex_96_tiprack_adapter": { "x": 0, "y": 0, "z": 121 } + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121 + } } }, "opentrons/opentrons_96_well_aluminum_block/1": { @@ -1208,7 +1226,10 @@ ["A11", "B11", "C11", "D11", "E11", "F11", "G11", "H11"], ["A12", "B12", "C12", "D12", "E12", "F12", "G12", "H12"] ], - "brand": { "brand": "Opentrons", "brandId": [] }, + "brand": { + "brand": "Opentrons", + "brandId": [] + }, "metadata": { "displayName": "Opentrons 96 Well Aluminum Block", "displayCategory": "aluminumBlock", @@ -2088,7 +2109,9 @@ }, "groups": [ { - "metadata": { "wellBottomShape": "v" }, + "metadata": { + "wellBottomShape": "v" + }, "wells": [ "A1", "B1", @@ -2200,11 +2223,23 @@ "version": 1, "schemaVersion": 2, "allowedRoles": ["adapter"], - "cornerOffsetFromSlot": { "x": 0, "y": 0, "z": 0 }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, "gripperOffsets": { "default": { - "pickUpOffset": { "x": 0, "y": 0, "z": 0 }, - "dropOffset": { "x": 0, "y": 0, "z": 1 } + "pickUpOffset": { + "x": 0, + "y": 0, + "z": 0 + }, + "dropOffset": { + "x": 0, + "y": 0, + "z": 1 + } } } }, @@ -2501,7 +2536,11 @@ "namespace": "opentrons", "version": 1, "schemaVersion": 2, - "cornerOffsetFromSlot": { "x": 0, "y": 0, "z": 0 } + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + } }, "opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2": { "ordering": [ @@ -3404,7 +3443,9 @@ }, "groups": [ { - "metadata": { "wellBottomShape": "v" }, + "metadata": { + "wellBottomShape": "v" + }, "wells": [ "A1", "B1", @@ -3515,13 +3556,29 @@ "namespace": "opentrons", "version": 2, "schemaVersion": 2, - "cornerOffsetFromSlot": { "x": 0, "y": 0, "z": 0 }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, "stackingOffsetWithLabware": { - "opentrons_96_pcr_adapter": { "x": 0, "y": 0, "z": 10.2 }, - "opentrons_96_well_aluminum_block": { "x": 0, "y": 0, "z": 12.66 } + "opentrons_96_pcr_adapter": { + "x": 0, + "y": 0, + "z": 10.2 + }, + "opentrons_96_well_aluminum_block": { + "x": 0, + "y": 0, + "z": 12.66 + } }, "stackingOffsetWithModule": { - "thermocyclerModuleV2": { "x": 0, "y": 0, "z": 10.8 } + "thermocyclerModuleV2": { + "x": 0, + "y": 0, + "z": 10.8 + } } } }, @@ -3530,7 +3587,7 @@ "commandSchemaId": "opentronsCommandSchemaV8", "commands": [ { - "key": "8ba6b5e2-1555-4259-bd70-275c02af22f6", + "key": "bc9f6354-a7a7-407a-86fa-d764fed37892", "commandType": "loadPipette", "params": { "pipetteName": "p50_single_flex", @@ -3539,25 +3596,29 @@ } }, { - "key": "b786c5b3-97d1-4deb-ab20-1b7ae2a92e96", + "key": "5653381b-77ed-49c5-b13a-a897108e25b2", "commandType": "loadModule", "params": { "model": "temperatureModuleV2", - "location": { "slotName": "D3" }, + "location": { + "slotName": "D3" + }, "moduleId": "d6966555-6c0e-45e0-8056-428d7c486401:temperatureModuleType" } }, { - "key": "d2f656f7-bb89-4430-8443-01c4f5d558c7", + "key": "9b05da10-4b23-4e6b-82f0-03d078c0aafc", "commandType": "loadModule", "params": { "model": "temperatureModuleV2", - "location": { "slotName": "C3" }, + "location": { + "slotName": "C3" + }, "moduleId": "b9c56153-9026-42d1-8113-949e15254571:temperatureModuleType" } }, { - "key": "4295d596-2722-4575-97fe-615528c84168", + "key": "c195d07a-ca33-4a3c-a33d-1f5df2f3b906", "commandType": "loadLabware", "params": { "displayName": "Opentrons 96 Well Aluminum Block", @@ -3571,7 +3632,7 @@ } }, { - "key": "858ef51a-50ac-49d9-81d8-3ab0b9d195c2", + "key": "cad83091-9a60-4df4-aaa8-86316b44e6b4", "commandType": "loadLabware", "params": { "displayName": "Opentrons Flex 96 Tip Rack 50 µL", @@ -3579,11 +3640,13 @@ "loadName": "opentrons_flex_96_tiprack_50ul", "namespace": "opentrons", "version": 1, - "location": { "slotName": "C2" } + "location": { + "slotName": "C2" + } } }, { - "key": "461afa60-d04a-40c1-bd25-0dae844c29b9", + "key": "3128ec57-5aed-4824-8b91-f9a3f7a9ea1f", "commandType": "loadLabware", "params": { "displayName": "Opentrons 24 Well Aluminum Block with NEST 1.5 mL Screwcap", @@ -3597,7 +3660,7 @@ } }, { - "key": "f0fd22f2-6318-4a78-9fe4-f28b97ea1bc3", + "key": "d70bb67b-f388-4eda-84a5-51accd89c534", "commandType": "loadLabware", "params": { "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", @@ -3612,7 +3675,7 @@ }, { "commandType": "pickUpTip", - "key": "5c52fcb4-a8a9-47b4-8b0f-2a7ef9aea904", + "key": "5535c00b-3931-43b4-bd39-6f7498ac3739", "params": { "pipetteId": "21087f15-4c03-4587-8a2b-1ba0b5a501a0", "labwareId": "0d39213c-49c2-4170-bf19-4c09e1b72aca:opentrons/opentrons_flex_96_tiprack_50ul/1", @@ -3621,7 +3684,7 @@ }, { "commandType": "configureForVolume", - "key": "dd1b37d6-eb8c-4616-bc8a-e1f17556234a", + "key": "a35a7664-c44a-41fb-9e67-08b01f2339f7", "params": { "pipetteId": "21087f15-4c03-4587-8a2b-1ba0b5a501a0", "volume": 10 @@ -3629,7 +3692,7 @@ }, { "commandType": "aspirate", - "key": "c8ba3637-892e-45c1-8b31-0a975060cdff", + "key": "d7a2bb3f-4158-41c2-83fa-95c33f02c076", "params": { "pipetteId": "21087f15-4c03-4587-8a2b-1ba0b5a501a0", "volume": 10, @@ -3637,14 +3700,18 @@ "wellName": "C1", "wellLocation": { "origin": "bottom", - "offset": { "z": 29, "x": 2, "y": -2 } + "offset": { + "z": 29, + "x": 2, + "y": -2 + } }, "flowRate": 35 } }, { "commandType": "dispense", - "key": "eb95a3e1-091d-4646-9324-a2594284bf8f", + "key": "5c6fc843-d3e9-46ba-88a7-34f88771010a", "params": { "pipetteId": "21087f15-4c03-4587-8a2b-1ba0b5a501a0", "volume": 10, @@ -3652,40 +3719,55 @@ "wellName": "B3", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 57 } }, { "commandType": "blowout", - "key": "98f2eee6-1ee5-4ba8-acd5-3b3316560957", + "key": "e53ccf8f-b3e3-4a63-a84e-b000457162e6", "params": { "pipetteId": "21087f15-4c03-4587-8a2b-1ba0b5a501a0", "labwareId": "c0093e5f-3f7d-4cbf-aa17-d88394108501:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", "wellName": "C1", "flowRate": 20, - "wellLocation": { "origin": "top", "offset": { "z": -12 } } + "wellLocation": { + "origin": "top", + "offset": { + "z": -12 + } + } } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "09bd3532-aa71-4795-a9c9-32ad271aa852", + "key": "287251ef-d8dc-4ae5-ad72-ac84cd81e5b6", "params": { "pipetteId": "21087f15-4c03-4587-8a2b-1ba0b5a501a0", "addressableAreaName": "movableTrashA3", - "offset": { "x": 0, "y": 0, "z": 0 }, + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, "alternateDropLocation": true } }, { "commandType": "dropTipInPlace", - "key": "ec86f079-6e0e-4eda-a0a1-97199bc852fd", - "params": { "pipetteId": "21087f15-4c03-4587-8a2b-1ba0b5a501a0" } + "key": "ea735ed4-a2c6-41af-ae6e-7eb223db25bf", + "params": { + "pipetteId": "21087f15-4c03-4587-8a2b-1ba0b5a501a0" + } }, { "commandType": "temperatureModule/setTargetTemperature", - "key": "74a68fe2-9e03-4bff-9ba4-0f125a2cea49", + "key": "c45ee0b8-08fa-4854-8a0d-e65f513c2f08", "params": { "moduleId": "d6966555-6c0e-45e0-8056-428d7c486401:temperatureModuleType", "celsius": 40 @@ -3693,7 +3775,7 @@ }, { "commandType": "temperatureModule/waitForTemperature", - "key": "9c4a7f7c-6ce3-48a8-ad05-06d2e6b29fdf", + "key": "f994033a-27cf-4ce1-999b-242edae5538e", "params": { "moduleId": "d6966555-6c0e-45e0-8056-428d7c486401:temperatureModuleType", "celsius": 40 @@ -3701,7 +3783,7 @@ }, { "commandType": "temperatureModule/setTargetTemperature", - "key": "c70e216e-7e4d-4b78-9c4d-e605ed05a5e3", + "key": "6ceb2f9e-7ac4-4807-ada9-5d1d3cd316ce", "params": { "moduleId": "b9c56153-9026-42d1-8113-949e15254571:temperatureModuleType", "celsius": 4 @@ -3709,7 +3791,7 @@ }, { "commandType": "temperatureModule/waitForTemperature", - "key": "6b9cd83e-c6d3-41f0-a31f-6645ada88d6d", + "key": "e090a25b-48ec-4a2e-8744-23df852efee2", "params": { "moduleId": "b9c56153-9026-42d1-8113-949e15254571:temperatureModuleType", "celsius": 4 diff --git a/protocol-designer/fixtures/protocol/8/ninetySixChannelFullAndColumn.json b/protocol-designer/fixtures/protocol/8/ninetySixChannelFullAndColumn.json index fe6d08df65c..d22281b0369 100644 --- a/protocol-designer/fixtures/protocol/8/ninetySixChannelFullAndColumn.json +++ b/protocol-designer/fixtures/protocol/8/ninetySixChannelFullAndColumn.json @@ -6,16 +6,16 @@ "author": "", "description": "", "created": 1701805621086, - "lastModified": 1714570523087, + "lastModified": 1738157515738, "category": null, "subcategory": null, "tags": [] }, "designerApplication": { "name": "opentrons/protocol-designer", - "version": "8.2.2", + "version": "8.5.0", "data": { - "_internalAppBuildDate": "Wed, 01 May 2024 13:32:34 GMT", + "_internalAppBuildDate": "Wed, 29 Jan 2025 13:23:47 GMT", "defaultValues": { "aspirate_mmFromBottom": 1, "dispense_mmFromBottom": 1, @@ -27,7 +27,10 @@ "opentrons/opentrons_flex_96_tiprack_50ul/1" ] }, - "dismissedWarnings": { "form": [], "timeline": [] }, + "dismissedWarnings": { + "form": [], + "timeline": [] + }, "ingredients": {}, "ingredLocations": { "9bd16b50-4ae9-4cfd-8583-3378087e6a6c:opentrons/opentrons_flex_96_tiprack_50ul/1": {} @@ -40,126 +43,128 @@ "fe1942b1-1b75-4d3a-9c12-d23004958a12:opentrons/biorad_96_wellplate_200ul_pcr/2": "B1", "9bd16b50-4ae9-4cfd-8583-3378087e6a6c:opentrons/opentrons_flex_96_tiprack_50ul/1": "D1" }, + "moduleLocationUpdate": {}, "pipetteLocationUpdate": { "de7da440-95ec-43e8-8723-851321fbd6f9": "left" }, - "moduleLocationUpdate": {}, "stepType": "manualIntervention", "id": "__INITIAL_DECK_SETUP_STEP__" }, "83a095fa-b649-4105-99d4-177f1a3f363a": { - "pipette": "de7da440-95ec-43e8-8723-851321fbd6f9", - "volume": "10", - "tipRack": "opentrons/opentrons_flex_96_tiprack_50ul/1", - "changeTip": "always", - "path": "single", - "aspirate_wells_grouped": false, + "aspirate_airGap_checkbox": false, + "aspirate_airGap_volume": "5", + "aspirate_delay_checkbox": false, + "aspirate_delay_mmFromBottom": null, + "aspirate_delay_seconds": "1", "aspirate_flowRate": null, "aspirate_labware": "fe1942b1-1b75-4d3a-9c12-d23004958a12:opentrons/biorad_96_wellplate_200ul_pcr/2", - "aspirate_wells": ["A1"], - "aspirate_wellOrder_first": "t2b", - "aspirate_wellOrder_second": "l2r", "aspirate_mix_checkbox": false, "aspirate_mix_times": null, "aspirate_mix_volume": null, "aspirate_mmFromBottom": null, "aspirate_touchTip_checkbox": false, - "aspirate_touchTip_mmFromBottom": null, + "aspirate_touchTip_mmFromTop": null, + "aspirate_wellOrder_first": "t2b", + "aspirate_wellOrder_second": "l2r", + "aspirate_wells_grouped": false, + "aspirate_wells": ["A1"], + "aspirate_x_position": 0, + "aspirate_y_position": 0, + "blowout_checkbox": false, + "blowout_flowRate": null, + "blowout_location": null, + "blowout_z_offset": 0, + "changeTip": "always", + "dispense_airGap_checkbox": false, + "dispense_airGap_volume": "5", + "dispense_delay_checkbox": false, + "dispense_delay_mmFromBottom": null, + "dispense_delay_seconds": "1", "dispense_flowRate": null, "dispense_labware": "1e553651-9e4d-44b1-a31b-92459642bfd7:trashBin", - "dispense_wells": [], - "dispense_wellOrder_first": "t2b", - "dispense_wellOrder_second": "l2r", "dispense_mix_checkbox": false, "dispense_mix_times": null, "dispense_mix_volume": null, "dispense_mmFromBottom": null, "dispense_touchTip_checkbox": false, - "dispense_touchTip_mmFromBottom": null, + "dispense_touchTip_mmFromTop": null, + "dispense_wellOrder_first": "t2b", + "dispense_wellOrder_second": "l2r", + "dispense_wells": [], + "dispense_x_position": 0, + "dispense_y_position": 0, "disposalVolume_checkbox": true, "disposalVolume_volume": "5", - "blowout_checkbox": false, - "blowout_location": null, - "preWetTip": false, - "aspirate_airGap_checkbox": false, - "aspirate_airGap_volume": "5", - "aspirate_delay_checkbox": false, - "aspirate_delay_mmFromBottom": null, - "aspirate_delay_seconds": "1", - "dispense_airGap_checkbox": false, - "dispense_airGap_volume": "5", - "dispense_delay_checkbox": false, - "dispense_delay_seconds": "1", - "dispense_delay_mmFromBottom": null, "dropTip_location": "1e553651-9e4d-44b1-a31b-92459642bfd7:trashBin", "nozzles": "ALL", - "dispense_x_position": 0, - "dispense_y_position": 0, - "aspirate_x_position": 0, - "aspirate_y_position": 0, - "blowout_z_offset": 0, - "blowout_flowRate": null, - "id": "83a095fa-b649-4105-99d4-177f1a3f363a", + "path": "single", + "pipette": "de7da440-95ec-43e8-8723-851321fbd6f9", + "preWetTip": false, + "tipRack": "opentrons/opentrons_flex_96_tiprack_50ul/1", + "volume": "10", "stepType": "moveLiquid", "stepName": "transfer", - "stepDetails": "" + "stepDetails": "", + "id": "83a095fa-b649-4105-99d4-177f1a3f363a", + "dispense_touchTip_mmfromTop": null }, "f5ea3139-1585-4848-9d5f-832eb88c99ca": { - "pipette": "de7da440-95ec-43e8-8723-851321fbd6f9", - "volume": "10", - "tipRack": "opentrons/opentrons_flex_96_tiprack_50ul/1", - "changeTip": "always", - "path": "single", - "aspirate_wells_grouped": false, + "aspirate_airGap_checkbox": false, + "aspirate_airGap_volume": "5", + "aspirate_delay_checkbox": false, + "aspirate_delay_mmFromBottom": null, + "aspirate_delay_seconds": "1", "aspirate_flowRate": null, "aspirate_labware": "fe1942b1-1b75-4d3a-9c12-d23004958a12:opentrons/biorad_96_wellplate_200ul_pcr/2", - "aspirate_wells": ["A7"], - "aspirate_wellOrder_first": "t2b", - "aspirate_wellOrder_second": "l2r", "aspirate_mix_checkbox": false, "aspirate_mix_times": null, "aspirate_mix_volume": null, "aspirate_mmFromBottom": null, "aspirate_touchTip_checkbox": false, - "aspirate_touchTip_mmFromBottom": null, + "aspirate_touchTip_mmFromTop": null, + "aspirate_wellOrder_first": "t2b", + "aspirate_wellOrder_second": "l2r", + "aspirate_wells_grouped": false, + "aspirate_wells": ["A7"], + "aspirate_x_position": 0, + "aspirate_y_position": 0, + "blowout_checkbox": false, + "blowout_flowRate": null, + "blowout_location": null, + "blowout_z_offset": 0, + "changeTip": "always", + "dispense_airGap_checkbox": false, + "dispense_airGap_volume": "5", + "dispense_delay_checkbox": false, + "dispense_delay_mmFromBottom": null, + "dispense_delay_seconds": "1", "dispense_flowRate": null, "dispense_labware": "1e553651-9e4d-44b1-a31b-92459642bfd7:trashBin", - "dispense_wells": [], - "dispense_wellOrder_first": "t2b", - "dispense_wellOrder_second": "l2r", "dispense_mix_checkbox": false, "dispense_mix_times": null, "dispense_mix_volume": null, "dispense_mmFromBottom": null, "dispense_touchTip_checkbox": false, - "dispense_touchTip_mmFromBottom": null, + "dispense_touchTip_mmFromTop": null, + "dispense_wellOrder_first": "t2b", + "dispense_wellOrder_second": "l2r", + "dispense_wells": [], + "dispense_x_position": 0, + "dispense_y_position": 0, "disposalVolume_checkbox": true, "disposalVolume_volume": "5", - "blowout_checkbox": false, - "blowout_location": null, - "preWetTip": false, - "aspirate_airGap_checkbox": false, - "aspirate_airGap_volume": "5", - "aspirate_delay_checkbox": false, - "aspirate_delay_mmFromBottom": null, - "aspirate_delay_seconds": "1", - "dispense_airGap_checkbox": false, - "dispense_airGap_volume": "5", - "dispense_delay_checkbox": false, - "dispense_delay_seconds": "1", - "dispense_delay_mmFromBottom": null, "dropTip_location": "1e553651-9e4d-44b1-a31b-92459642bfd7:trashBin", "nozzles": "COLUMN", - "dispense_x_position": 0, - "dispense_y_position": 0, - "aspirate_x_position": 0, - "aspirate_y_position": 0, - "blowout_z_offset": 0, - "blowout_flowRate": null, - "id": "f5ea3139-1585-4848-9d5f-832eb88c99ca", + "path": "single", + "pipette": "de7da440-95ec-43e8-8723-851321fbd6f9", + "preWetTip": false, + "tipRack": "opentrons/opentrons_flex_96_tiprack_50ul/1", + "volume": "10", "stepType": "moveLiquid", "stepName": "transfer", - "stepDetails": "" + "stepDetails": "", + "id": "f5ea3139-1585-4848-9d5f-832eb88c99ca", + "dispense_touchTip_mmfromTop": null } }, "orderedStepIds": [ @@ -168,7 +173,10 @@ ] } }, - "robot": { "model": "OT-3 Standard", "deckId": "ot3_standard" }, + "robot": { + "model": "OT-3 Standard", + "deckId": "ot3_standard" + }, "labwareDefinitionSchemaId": "opentronsLabwareSchemaV2", "labwareDefinitions": { "opentrons/opentrons_flex_96_tiprack_50ul/1": { @@ -186,7 +194,10 @@ ["A11", "B11", "C11", "D11", "E11", "F11", "G11", "H11"], ["A12", "B12", "C12", "D12", "E12", "F12", "G12", "H12"] ], - "brand": { "brand": "Opentrons", "brandId": [] }, + "brand": { + "brand": "Opentrons", + "brandId": [] + }, "metadata": { "displayName": "Opentrons Flex 96 Tip Rack 50 µL", "displayCategory": "tipRack", @@ -1181,14 +1192,25 @@ "namespace": "opentrons", "version": 1, "schemaVersion": 2, - "cornerOffsetFromSlot": { "x": 0, "y": 0, "z": 0 }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, "stackingOffsetWithLabware": { - "opentrons_flex_96_tiprack_adapter": { "x": 0, "y": 0, "z": 121 } + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121 + } } }, "opentrons/opentrons_flex_96_tiprack_adapter/1": { "ordering": [], - "brand": { "brand": "Opentrons", "brandId": [] }, + "brand": { + "brand": "Opentrons", + "brandId": [] + }, "metadata": { "displayName": "Opentrons Flex 96 Tip Rack Adapter", "displayCategory": "adapter", @@ -1201,7 +1223,12 @@ "zDimension": 132 }, "wells": {}, - "groups": [{ "metadata": {}, "wells": [] }], + "groups": [ + { + "metadata": {}, + "wells": [] + } + ], "parameters": { "format": "96Standard", "quirks": ["tiprackAdapterFor96Channel"], @@ -1213,7 +1240,11 @@ "version": 1, "schemaVersion": 2, "allowedRoles": ["adapter"], - "cornerOffsetFromSlot": { "x": -14.25, "y": -3.5, "z": 0 } + "cornerOffsetFromSlot": { + "x": -14.25, + "y": -3.5, + "z": 0 + } }, "opentrons/biorad_96_wellplate_200ul_pcr/2": { "ordering": [ @@ -2226,17 +2257,39 @@ "G12", "H12" ], - "metadata": { "wellBottomShape": "v" } + "metadata": { + "wellBottomShape": "v" + } } ], - "cornerOffsetFromSlot": { "x": 0, "y": 0, "z": 0 }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, "stackingOffsetWithLabware": { - "opentrons_96_well_aluminum_block": { "x": 0, "y": 0, "z": 15.41 }, - "opentrons_96_pcr_adapter": { "x": 0, "y": 0, "z": 10.16 } + "opentrons_96_well_aluminum_block": { + "x": 0, + "y": 0, + "z": 15.41 + }, + "opentrons_96_pcr_adapter": { + "x": 0, + "y": 0, + "z": 10.16 + } }, "stackingOffsetWithModule": { - "thermocyclerModuleV2": { "x": 0, "y": 0, "z": 10.75 }, - "magneticBlockV1": { "x": 0, "y": 0, "z": 3.87 } + "thermocyclerModuleV2": { + "x": 0, + "y": 0, + "z": 10.75 + }, + "magneticBlockV1": { + "x": 0, + "y": 0, + "z": 3.87 + } } } }, @@ -2245,7 +2298,7 @@ "commandSchemaId": "opentronsCommandSchemaV8", "commands": [ { - "key": "1370b9a4-1e65-4203-9106-896db3db3bd3", + "key": "261b6dcd-ec1c-405c-bc13-bdca44557a4c", "commandType": "loadPipette", "params": { "pipetteName": "p1000_96", @@ -2254,7 +2307,7 @@ } }, { - "key": "d65a7183-875a-443a-b26a-6a2470291dce", + "key": "4889f04d-e1fb-49ba-9f10-a0030c68ac7f", "commandType": "loadLabware", "params": { "displayName": "Opentrons Flex 96 Tip Rack Adapter", @@ -2262,11 +2315,13 @@ "loadName": "opentrons_flex_96_tiprack_adapter", "namespace": "opentrons", "version": 1, - "location": { "slotName": "C2" } + "location": { + "slotName": "C2" + } } }, { - "key": "d05d92c6-d0d1-4886-aaef-c180b6953763", + "key": "60a8ced3-f7bb-44db-a492-aa2d102cc465", "commandType": "loadLabware", "params": { "displayName": "Opentrons Flex 96 Tip Rack 50 µL", @@ -2280,7 +2335,7 @@ } }, { - "key": "bb161828-5fd9-4d84-8209-c1f5de48ba99", + "key": "608c4a16-9751-44c8-96f8-eec999611c79", "commandType": "loadLabware", "params": { "displayName": "Bio-Rad 96 Well Plate 200 µL PCR", @@ -2288,11 +2343,13 @@ "loadName": "biorad_96_wellplate_200ul_pcr", "namespace": "opentrons", "version": 2, - "location": { "slotName": "B1" } + "location": { + "slotName": "B1" + } } }, { - "key": "8821778d-8456-4c74-8e29-da7604c012ec", + "key": "9905fa02-358f-4d23-b936-8711b2bf5600", "commandType": "loadLabware", "params": { "displayName": "Opentrons Flex 96 Tip Rack 50 µL", @@ -2300,20 +2357,24 @@ "loadName": "opentrons_flex_96_tiprack_50ul", "namespace": "opentrons", "version": 1, - "location": { "slotName": "D1" } + "location": { + "slotName": "D1" + } } }, { "commandType": "configureNozzleLayout", - "key": "a2a88d61-5c01-45bf-bcb8-91c893328b53", + "key": "e8d646ad-3046-4186-803f-a01e329cef97", "params": { "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9", - "configurationParams": { "style": "ALL" } + "configurationParams": { + "style": "ALL" + } } }, { "commandType": "pickUpTip", - "key": "747ca334-8955-4069-8473-351be7666ee0", + "key": "ecf30773-7a3c-47c3-8c79-6b1f91bf20b2", "params": { "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9", "labwareId": "75aa666f-98d8-4af9-908e-963ced428580:opentrons/opentrons_flex_96_tiprack_50ul/1", @@ -2322,7 +2383,7 @@ }, { "commandType": "aspirate", - "key": "b1ffc410-ed41-4c83-bebd-145ae0ca05d8", + "key": "bb5f9927-b5a2-4e5e-8015-a93d808aa3ea", "params": { "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9", "volume": 10, @@ -2330,23 +2391,31 @@ "wellName": "A1", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 6 } }, { "commandType": "moveToAddressableArea", - "key": "9100f4e2-b808-43d3-8c72-355dcce98b33", + "key": "efd35098-e1b1-4353-b5e9-9cc8c87e66df", "params": { "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9", "addressableAreaName": "movableTrashA3", - "offset": { "x": 0, "y": 0, "z": 0 } + "offset": { + "x": 0, + "y": 0, + "z": 0 + } } }, { "commandType": "dispenseInPlace", - "key": "4088260b-f0e9-4d3a-852c-13b7d467cc2d", + "key": "b2da7fa8-1359-40fb-ab30-92e21fb879de", "params": { "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9", "volume": 10, @@ -2355,30 +2424,39 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "8169cddb-5337-4bcf-bbfb-eb6307764b90", + "key": "9cdf6b7f-3fe4-455d-82db-2b0f3a8179bc", "params": { "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9", "addressableAreaName": "movableTrashA3", - "offset": { "x": 0, "y": 0, "z": 0 }, + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, "alternateDropLocation": true } }, { "commandType": "dropTipInPlace", - "key": "e0db70c1-546f-44ce-91c7-b18c37fcbcef", - "params": { "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9" } + "key": "335acc42-668d-4159-9943-df822419adae", + "params": { + "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9" + } }, { "commandType": "configureNozzleLayout", - "key": "97fb0aee-ce45-427f-b3af-b9b9a1923778", + "key": "1950c1e6-1eb6-46c8-ba4b-c7c38c825094", "params": { "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9", - "configurationParams": { "primaryNozzle": "A12", "style": "COLUMN" } + "configurationParams": { + "primaryNozzle": "A12", + "style": "COLUMN" + } } }, { "commandType": "pickUpTip", - "key": "203d9332-ea93-4047-97e8-58516d18373b", + "key": "34b5dc55-8096-445d-b77c-40918b657c9f", "params": { "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9", "labwareId": "9bd16b50-4ae9-4cfd-8583-3378087e6a6c:opentrons/opentrons_flex_96_tiprack_50ul/1", @@ -2387,7 +2465,7 @@ }, { "commandType": "aspirate", - "key": "3b5ef144-b0a9-4136-8579-3ddef13d60d1", + "key": "42132ae0-4321-4251-9b12-5aec2a398617", "params": { "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9", "volume": 10, @@ -2395,23 +2473,31 @@ "wellName": "A7", "wellLocation": { "origin": "bottom", - "offset": { "z": 1, "x": 0, "y": 0 } + "offset": { + "z": 1, + "x": 0, + "y": 0 + } }, "flowRate": 6 } }, { "commandType": "moveToAddressableArea", - "key": "b1b0cb96-cf8a-4c19-ad8b-7a515b720c80", + "key": "e6468d3a-d076-40be-bc49-da13f38c7e4e", "params": { "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9", "addressableAreaName": "movableTrashA3", - "offset": { "x": 0, "y": 0, "z": 0 } + "offset": { + "x": 0, + "y": 0, + "z": 0 + } } }, { "commandType": "dispenseInPlace", - "key": "b49b05e6-f82a-4dd3-9288-8f5eba004b2a", + "key": "acbf26f8-2025-48df-85a8-8696815906f6", "params": { "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9", "volume": 10, @@ -2420,18 +2506,24 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "6e0104da-5608-490a-ae14-e67db91331fe", + "key": "0e00ce33-ab8f-4600-9a4c-72677d2d4408", "params": { "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9", "addressableAreaName": "movableTrashA3", - "offset": { "x": 0, "y": 0, "z": 0 }, + "offset": { + "x": 0, + "y": 0, + "z": 0 + }, "alternateDropLocation": true } }, { "commandType": "dropTipInPlace", - "key": "a1266ec5-4602-43e7-a5e5-6512e7560eb9", - "params": { "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9" } + "key": "bfba211e-b4a7-475d-88ce-134c134dc7a1", + "params": { + "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9" + } } ], "commandAnnotationSchemaId": "opentronsCommandAnnotationSchemaV1", diff --git a/protocol-designer/fixtures/protocol/8/thermocyclerOnOt2V7MigratedToV8.json b/protocol-designer/fixtures/protocol/8/thermocyclerOnOt2V7MigratedToV8.json index 1fad3dd9db2..09c4773fc37 100644 --- a/protocol-designer/fixtures/protocol/8/thermocyclerOnOt2V7MigratedToV8.json +++ b/protocol-designer/fixtures/protocol/8/thermocyclerOnOt2V7MigratedToV8.json @@ -6,16 +6,16 @@ "author": "Hopia", "description": "testing a thermocycler on OT-2", "created": 1731356664582, - "lastModified": 1731356884152, + "lastModified": 1738157325544, "category": null, "subcategory": null, "tags": [] }, "designerApplication": { "name": "opentrons/protocol-designer", - "version": "8.2.0", + "version": "8.5.0", "data": { - "_internalAppBuildDate": "Mon, 11 Nov 2024 20:27:53 GMT", + "_internalAppBuildDate": "Wed, 29 Jan 2025 13:23:47 GMT", "defaultValues": { "aspirate_mmFromBottom": 1, "dispense_mmFromBottom": 1, @@ -27,7 +27,10 @@ "opentrons/opentrons_96_tiprack_20ul/1" ] }, - "dismissedWarnings": { "form": [], "timeline": [] }, + "dismissedWarnings": { + "form": [], + "timeline": [] + }, "ingredients": { "0": { "name": "123", @@ -39,14 +42,46 @@ }, "ingredLocations": { "ac928a51-a248-4304-be43-e9cb19c34fa9:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2": { - "A1": { "0": { "volume": 55 } }, - "B1": { "0": { "volume": 55 } }, - "C1": { "0": { "volume": 55 } }, - "D1": { "0": { "volume": 55 } }, - "E1": { "0": { "volume": 55 } }, - "F1": { "0": { "volume": 55 } }, - "G1": { "0": { "volume": 55 } }, - "H1": { "0": { "volume": 55 } } + "A1": { + "0": { + "volume": 55 + } + }, + "B1": { + "0": { + "volume": 55 + } + }, + "C1": { + "0": { + "volume": 55 + } + }, + "D1": { + "0": { + "volume": 55 + } + }, + "E1": { + "0": { + "volume": 55 + } + }, + "F1": { + "0": { + "volume": 55 + } + }, + "G1": { + "0": { + "volume": 55 + } + }, + "H1": { + "0": { + "volume": 55 + } + } } }, "savedStepForms": { @@ -149,7 +184,10 @@ ] } }, - "robot": { "model": "OT-2 Standard", "deckId": "ot2_standard" }, + "robot": { + "model": "OT-2 Standard", + "deckId": "ot2_standard" + }, "labwareDefinitionSchemaId": "opentronsLabwareSchemaV2", "labwareDefinitions": { "opentrons/opentrons_96_tiprack_20ul/1": { @@ -1165,7 +1203,11 @@ "namespace": "opentrons", "version": 1, "schemaVersion": 2, - "cornerOffsetFromSlot": { "x": 0, "y": 0, "z": 0 } + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + } }, "opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2": { "ordering": [ @@ -2068,7 +2110,9 @@ }, "groups": [ { - "metadata": { "wellBottomShape": "v" }, + "metadata": { + "wellBottomShape": "v" + }, "wells": [ "A1", "B1", @@ -2179,24 +2223,44 @@ "namespace": "opentrons", "version": 2, "schemaVersion": 2, - "cornerOffsetFromSlot": { "x": 0, "y": 0, "z": 0 }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, "stackingOffsetWithLabware": { - "opentrons_96_pcr_adapter": { "x": 0, "y": 0, "z": 10.2 }, - "opentrons_96_well_aluminum_block": { "x": 0, "y": 0, "z": 12.66 } + "opentrons_96_pcr_adapter": { + "x": 0, + "y": 0, + "z": 10.2 + }, + "opentrons_96_well_aluminum_block": { + "x": 0, + "y": 0, + "z": 12.66 + } }, "stackingOffsetWithModule": { - "thermocyclerModuleV2": { "x": 0, "y": 0, "z": 10.8 } + "thermocyclerModuleV2": { + "x": 0, + "y": 0, + "z": 10.8 + } } } }, "liquidSchemaId": "opentronsLiquidSchemaV1", "liquids": { - "0": { "displayName": "123", "description": "", "displayColor": "#b925ff" } + "0": { + "displayName": "123", + "description": "", + "displayColor": "#b925ff" + } }, "commandSchemaId": "opentronsCommandSchemaV8", "commands": [ { - "key": "b0cb75c2-d745-44fc-9132-d0614153db4f", + "key": "01d12a6f-a134-41ad-8a96-0f1db1caa648", "commandType": "loadPipette", "params": { "pipetteName": "p20_single_gen2", @@ -2205,16 +2269,18 @@ } }, { - "key": "cbb3ea89-3f25-4276-9578-556605c262d8", + "key": "984a7baa-bf2d-4b9b-8d22-7fa864d443d5", "commandType": "loadModule", "params": { "model": "thermocyclerModuleV1", - "location": { "slotName": "7" }, + "location": { + "slotName": "7" + }, "moduleId": "82858229-5c25-46cc-87d4-35ab318c18ce:thermocyclerModuleType" } }, { - "key": "c8492190-5605-449e-b409-a458a2dd914b", + "key": "70bd414e-8191-4c73-a79d-ec514a775cdd", "commandType": "loadLabware", "params": { "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", @@ -2229,7 +2295,7 @@ }, { "commandType": "loadLiquid", - "key": "f064269e-96fd-442b-b84c-4d0628238e14", + "key": "6eeecce1-bf14-4ba9-ac27-99d4a45c1352", "params": { "liquidId": "0", "labwareId": "ac928a51-a248-4304-be43-e9cb19c34fa9:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", @@ -2247,14 +2313,14 @@ }, { "commandType": "thermocycler/closeLid", - "key": "d5cf25be-eae8-4004-ad77-1c72ac9135ea", + "key": "b3f3d0ef-d186-451b-b019-92170d4c54b0", "params": { "moduleId": "82858229-5c25-46cc-87d4-35ab318c18ce:thermocyclerModuleType" } }, { "commandType": "thermocycler/setTargetLidTemperature", - "key": "b04fb0d0-080f-48cb-9fa3-977818c42e9f", + "key": "a61991d4-e5ca-4828-88e1-16121263e580", "params": { "moduleId": "82858229-5c25-46cc-87d4-35ab318c18ce:thermocyclerModuleType", "celsius": 50 @@ -2262,14 +2328,14 @@ }, { "commandType": "thermocycler/waitForLidTemperature", - "key": "c0d61d1e-24ff-466b-bda2-4d33baadcb4b", + "key": "5433a727-f2fc-49ef-a7b2-f88e426fa310", "params": { "moduleId": "82858229-5c25-46cc-87d4-35ab318c18ce:thermocyclerModuleType" } }, { "commandType": "thermocycler/setTargetLidTemperature", - "key": "909291ef-24d2-4a1a-83fc-9fad61cba3d1", + "key": "cd2d7b9e-c308-4efd-9cbd-cca366abbe2d", "params": { "moduleId": "82858229-5c25-46cc-87d4-35ab318c18ce:thermocyclerModuleType", "celsius": 40 @@ -2277,38 +2343,59 @@ }, { "commandType": "thermocycler/waitForLidTemperature", - "key": "d19932d8-cbf8-4f90-88b6-e624cce31630", + "key": "ea9d18cd-d9a3-461e-96c1-ac41436474d6", "params": { "moduleId": "82858229-5c25-46cc-87d4-35ab318c18ce:thermocyclerModuleType" } }, { "commandType": "thermocycler/runProfile", - "key": "9dd3f412-2c40-49a2-aeb3-0c0b0b244efb", + "key": "5d773732-71d8-45af-83f7-be31f4f89689", "params": { "moduleId": "82858229-5c25-46cc-87d4-35ab318c18ce:thermocyclerModuleType", "profile": [ - { "holdSeconds": 71, "celsius": 50 }, - { "holdSeconds": 170, "celsius": 34 }, - { "holdSeconds": 2640, "celsius": 87 }, - { "holdSeconds": 170, "celsius": 34 }, - { "holdSeconds": 2640, "celsius": 87 }, - { "holdSeconds": 170, "celsius": 34 }, - { "holdSeconds": 2640, "celsius": 87 } + { + "holdSeconds": 71, + "celsius": 50 + }, + { + "holdSeconds": 170, + "celsius": 34 + }, + { + "holdSeconds": 2640, + "celsius": 87 + }, + { + "holdSeconds": 170, + "celsius": 34 + }, + { + "holdSeconds": 2640, + "celsius": 87 + }, + { + "holdSeconds": 170, + "celsius": 34 + }, + { + "holdSeconds": 2640, + "celsius": 87 + } ], "blockMaxVolumeUl": 50 } }, { "commandType": "thermocycler/deactivateBlock", - "key": "15ed7e3a-26e6-44ec-929c-883fafa37fa8", + "key": "49c7e428-7a42-4bc0-93a8-8c30c375fe58", "params": { "moduleId": "82858229-5c25-46cc-87d4-35ab318c18ce:thermocyclerModuleType" } }, { "commandType": "thermocycler/deactivateLid", - "key": "453b76d8-9132-4556-95ca-e9909cdcc839", + "key": "3358c263-9ce4-4a02-846f-26faf626ed50", "params": { "moduleId": "82858229-5c25-46cc-87d4-35ab318c18ce:thermocyclerModuleType" } diff --git a/protocol-designer/src/assets/localization/en/modal.json b/protocol-designer/src/assets/localization/en/modal.json index 62d34d00a9d..741bdacabca 100644 --- a/protocol-designer/src/assets/localization/en/modal.json +++ b/protocol-designer/src/assets/localization/en/modal.json @@ -99,9 +99,9 @@ "aspirate_mmFromBottom": "Change where in the well the robot aspirates from.", "dispense_mmFromBottom": "Change where in the well the robot dispenses from.", "mix_mmFromBottom": "Change from where in the well the robot aspirates and dispenses during the mix.", - "aspirate_touchTip_mmFromBottom": "Change from where in the well the robot performs the touch tip.", - "dispense_touchTip_mmFromBottom": "Change from where in the well the robot performs the touch tip.", - "mix_touchTip_mmFromBottom": "Change from where in the well the robot performs the touch tip.", + "aspirate_touchTip_mmFromTop": "Change from where in the well the robot performs the touch tip.", + "dispense_touchTip_mmFromTop": "Change from where in the well the robot performs the touch tip.", + "mix_touchTip_mmFromTop": "Change from where in the well the robot performs the touch tip.", "aspirate_delay_mmFromBottom": "Change from where in the well the robot delays after aspirating.", "dispense_delay_mmFromBottom": "Change from where in the well the robot delays after dispensing." }, diff --git a/protocol-designer/src/assets/localization/en/protocol_steps.json b/protocol-designer/src/assets/localization/en/protocol_steps.json index c92e9cdcb83..fe5630f4465 100644 --- a/protocol-designer/src/assets/localization/en/protocol_steps.json +++ b/protocol-designer/src/assets/localization/en/protocol_steps.json @@ -138,7 +138,7 @@ "tiprack": "Tiprack", "tip_handling": "Tip handling", "tip_position": "{{prefix}} tip position", - "touch_tip_position": "Touch tip position from bottom", + "touch_tip_position": "Touch tip position from top", "valid_range": "Valid range between {{min}} - {{max}} {{unit}}", "view_details": "View details", "volume_per_well": "Volume per well", diff --git a/protocol-designer/src/assets/localization/en/shared.json b/protocol-designer/src/assets/localization/en/shared.json index ed6982725c9..4a3490bc73a 100644 --- a/protocol-designer/src/assets/localization/en/shared.json +++ b/protocol-designer/src/assets/localization/en/shared.json @@ -142,11 +142,11 @@ "temperaturemoduletype": "Temperature Module", "thermocyclermoduletype": "Thermocycler Module", "tip_position_aspirate_delay_mmFromBottom": "Edit aspirate delay position", - "tip_position_aspirate_touchTip_mmFromBottom": "Edit aspirate touch tip position", + "tip_position_aspirate_touchTip_mmFromTop": "Edit aspirate touch tip position", "tip_position_blowout_z_offset": "Edit blowout position", "tip_position_dispense_delay_mmFromBottom": "Edit dispense delay position", - "tip_position_dispense_touchTip_mmFromBottom": "Edit dispense touch tip position", - "tip_position_mix_touchTip_mmFromBottom": "Edit touch tip position", + "tip_position_dispense_touchTip_mmFromTop": "Edit dispense touch tip position", + "tip_position_mix_touchTip_mmFromTop": "Edit touch tip position", "tip_position": "Edit {{prefix}} tip position", "trashBin": "Trash Bin", "updated_protocol_designer": "We've updated Protocol Designer!", diff --git a/protocol-designer/src/assets/localization/en/tooltip.json b/protocol-designer/src/assets/localization/en/tooltip.json index 86f5f6e8197..67780f3fb2d 100644 --- a/protocol-designer/src/assets/localization/en/tooltip.json +++ b/protocol-designer/src/assets/localization/en/tooltip.json @@ -36,7 +36,7 @@ "aspirate_mix_checkbox": "Aspirate and dispense repeatedly before main aspiration", "aspirate_mmFromBottom": "Adjust tip position for aspirate", "aspirate_touchTip_checkbox": "Touch tip to each side of the well after aspirating", - "aspirate_touchTip_mmFromBottom": "Distance from the bottom of the well", + "aspirate_touchTip_mmFromTop": "Distance from the top of the well", "aspirate_wells": "First select a source labware", "blowout_checkbox": "Blow extra air through the tip", "blowout_flowRate": "Blowout speed", @@ -51,7 +51,7 @@ "dispense_mix_checkbox": "Aspirate and dispense repeatedly after main dispense", "dispense_mmFromBottom": "Adjust tip position for dispense", "dispense_touchTip_checkbox": "Touch tip to each side of the well after dispensing", - "dispense_touchTip_mmFromBottom": "Distance from the bottom of the well", + "dispense_touchTip_mmFromTop": "Distance from the top of the well", "dispense_wells": "First select a destination labware", "disposalVolume_checkbox": "Aspirate extra volume that is disposed of after a multi-dispense is complete. We recommend a disposal volume of at least the pipette's minimum.", "dropTip_location": "Choose where you would like to drop tip", @@ -59,7 +59,7 @@ "labware": "Select a labware to use", "mix_mmFromBottom": "Adjust tip position", "mix_touchTip_checkbox": "Touch tip to each side of the well after dispensing", - "mix_touchTip_mmFromBottom": "Distance from the bottom of the well", + "mix_touchTip_mmFromTop": "Distance from the top of the well", "newLocation": "New location to move the selected labware", "nozzles": "Partial pickup requires a tip rack directly on the deck. Full rack pickup requires the Flex 96 Tip Rack Adapter.", "pipette": "Select the pipette you want to use", diff --git a/protocol-designer/src/form-types.ts b/protocol-designer/src/form-types.ts index d69aa1e7d1b..45424a89117 100644 --- a/protocol-designer/src/form-types.ts +++ b/protocol-designer/src/form-types.ts @@ -33,7 +33,7 @@ export type StepFieldName = string // | 'aspirate_mix_volume' // | 'aspirate_mmFromBottom' // | 'aspirate_touchTip_checkbox' -// | 'aspirate_touchTip_mmFromBottom' +// | 'aspirate_touchTip_mmFromTop' // | 'aspirate_wellOrder_first' // | 'aspirate_wellOrder_second' // | 'aspirate_wells_grouped' @@ -52,7 +52,7 @@ export type StepFieldName = string // | 'dispense_mix_volume' // | 'dispense_mmFromBottom' // | 'dispense_touchTip_checkbox' -// | 'dispense_touchTip_mmFromBottom' +// | 'dispense_touchTip_mmFromTop' // | 'dispense_wellOrder_first' // | 'dispense_wellOrder_second' // | 'dispense_wells' @@ -66,7 +66,7 @@ export type StepFieldName = string // | 'labwareLocationUpdate' // | 'message' // | 'mix_mmFromBottom' -// | 'mix_touchTip_mmFromBottom' +// | 'mix_touchTip_mmFromTop' // | 'mix_x_position // | 'mix_y_position // | 'newLocation' @@ -252,7 +252,7 @@ export interface HydratedMoveLiquidFormData extends AnnotationFields { aspirate_mix_times?: number | null aspirate_mix_volume?: number | null aspirate_mmFromBottom?: number | null - aspirate_touchTip_mmFromBottom?: number | null + aspirate_touchTip_mmFromTop?: number | null aspirate_wells_grouped?: boolean | null aspirate_x_position?: number | null aspirate_y_position?: number | null @@ -266,7 +266,7 @@ export interface HydratedMoveLiquidFormData extends AnnotationFields { dispense_mix_times?: number | null dispense_mix_volume?: number | null dispense_mmFromBottom?: number | null - dispense_touchTip_mmFromBottom?: number | null + dispense_touchTip_mmFromTop?: number | null dispense_x_position?: number | null dispense_y_position?: number | null disposalVolume_volume?: number | null @@ -316,7 +316,7 @@ export interface HydratedMixFormData extends AnnotationFields { dispense_flowRate?: number | null dropTip_wellNames?: string[] | null mix_mmFromBottom?: number | null - mix_touchTip_mmFromBottom?: number | null + mix_touchTip_mmFromTop?: number | null mix_x_position?: number | null mix_y_position?: number | null pickUpTip_location?: string | null @@ -398,11 +398,11 @@ export type TipZOffsetFields = | 'aspirate_mmFromBottom' | 'dispense_mmFromBottom' | 'mix_mmFromBottom' - | 'aspirate_touchTip_mmFromBottom' - | 'dispense_touchTip_mmFromBottom' + | 'aspirate_touchTip_mmFromTop' + | 'dispense_touchTip_mmFromTop' | 'aspirate_delay_mmFromBottom' | 'dispense_delay_mmFromBottom' - | 'mix_touchTip_mmFromBottom' + | 'mix_touchTip_mmFromTop' export type TipYOffsetFields = | 'aspirate_y_position' @@ -424,9 +424,9 @@ export type DelaySecondFields = export function getIsTouchTipField(fieldName: StepFieldName): boolean { const touchTipFields = [ - 'aspirate_touchTip_mmFromBottom', - 'dispense_touchTip_mmFromBottom', - 'mix_touchTip_mmFromBottom', + 'aspirate_touchTip_mmFromTop', + 'dispense_touchTip_mmFromTop', + 'mix_touchTip_mmFromTop', ] return touchTipFields.includes(fieldName) } diff --git a/protocol-designer/src/load-file/migration/8_5_0.ts b/protocol-designer/src/load-file/migration/8_5_0.ts new file mode 100644 index 00000000000..2f6e8d38553 --- /dev/null +++ b/protocol-designer/src/load-file/migration/8_5_0.ts @@ -0,0 +1,164 @@ +import floor from 'lodash/floor' +import type { + LabwareDefinition2, + LoadLabwareCreateCommand, + ProtocolFile, +} from '@opentrons/shared-data' +import type { DesignerApplicationData } from './utils/getLoadLiquidCommands' + +const getMigratedPositionFromTop = ( + labwareDefinitions: { + [definitionId: string]: LabwareDefinition2 + }, + loadLabwareCommands: LoadLabwareCreateCommand[], + labware: string, + type: 'aspirate' | 'dispense' | 'mix' +): number => { + const matchingLoadLabware = loadLabwareCommands.find( + command => + command.commandType === 'loadLabware' && + command.params.labwareId === labware + ) + if (matchingLoadLabware == null) { + console.error( + `expected to find matching ${type} labware load command but could not with ${type}_labware from form data as ${labware}` + ) + } + const labwareUri = + matchingLoadLabware != null + ? `${matchingLoadLabware.params.namespace}/${matchingLoadLabware.params.loadName}/${matchingLoadLabware.params.version}` + : '' + + // early exit for dispense_labware equaling trashBin or wasteChute + if (labwareDefinitions[labwareUri] == null) { + return 0 + } + + const matchingLabwareWellDepth = labwareUri + ? labwareDefinitions[labwareUri].wells.A1.depth + : 0 + + if (matchingLabwareWellDepth === 0) { + console.error( + `error in finding the ${type} labware well depth with labware uri ${labwareUri}` + ) + } + return matchingLabwareWellDepth +} + +export const migrateFile = ( + appData: ProtocolFile +): ProtocolFile => { + const { designerApplication, commands, labwareDefinitions } = appData + + if (designerApplication == null || designerApplication?.data == null) { + throw Error('The designerApplication key in your file is corrupt.') + } + const savedStepForms = designerApplication.data + ?.savedStepForms as DesignerApplicationData['savedStepForms'] + + const loadLabwareCommands = commands.filter( + (command): command is LoadLabwareCreateCommand => + command.commandType === 'loadLabware' + ) + + const savedStepsWithUpdatedMoveLiquidFields = Object.values( + savedStepForms + ).reduce((acc, form) => { + if (form.stepType === 'moveLiquid') { + const { + id, + aspirate_touchTip_mmFromBottom, + dispense_touchTip_mmFromBottom, + aspirate_labware, + dispense_labware, + ...rest + } = form + const matchingAspirateLabwareWellDepth = getMigratedPositionFromTop( + labwareDefinitions, + loadLabwareCommands, + aspirate_labware as string, + 'aspirate' + ) + const matchingDispenseLabwareWellDepth = getMigratedPositionFromTop( + labwareDefinitions, + loadLabwareCommands, + dispense_labware as string, + 'dispense' + ) + + return { + ...acc, + [id]: { + ...rest, + id, + aspirate_labware, + dispense_labware, + aspirate_touchTip_mmFromTop: + aspirate_touchTip_mmFromBottom == null + ? null + : floor( + aspirate_touchTip_mmFromBottom - + matchingAspirateLabwareWellDepth, + 1 + ), + dispense_touchTip_mmfromTop: + dispense_touchTip_mmFromBottom == null + ? null + : floor( + dispense_touchTip_mmFromBottom - + matchingDispenseLabwareWellDepth, + 1 + ), + }, + } + } + return acc + }, {}) + + const savedStepsWithUpdatedMixFields = Object.values(savedStepForms).reduce( + (acc, form) => { + if (form.stepType === 'mix') { + const { id, mix_touchTip_mmFromBottom, labware, ...rest } = form + const matchingLabwareWellDepth = getMigratedPositionFromTop( + labwareDefinitions, + loadLabwareCommands, + labware as string, + 'mix' + ) + return { + ...acc, + [id]: { + ...rest, + id, + labware, + mix_touchTip_mmFromTop: + mix_touchTip_mmFromBottom == null + ? null + : floor( + mix_touchTip_mmFromBottom - matchingLabwareWellDepth, + 1 + ), + }, + } + } + return acc + }, + {} + ) + + return { + ...appData, + designerApplication: { + ...designerApplication, + data: { + ...designerApplication.data, + savedStepForms: { + ...designerApplication.data.savedStepForms, + ...savedStepsWithUpdatedMoveLiquidFields, + ...savedStepsWithUpdatedMixFields, + }, + }, + }, + } +} diff --git a/protocol-designer/src/load-file/migration/index.ts b/protocol-designer/src/load-file/migration/index.ts index 27afb8eb132..071e4520c89 100644 --- a/protocol-designer/src/load-file/migration/index.ts +++ b/protocol-designer/src/load-file/migration/index.ts @@ -13,6 +13,7 @@ import { migrateFile as migrateFileEight } from './8_0_0' import { migrateFile as migrateFileEightOne } from './8_1_0' import { migrateFile as migrateFileEightTwo } from './8_2_0' import { migrateFile as migrateFileEightTwoPointTwo } from './8_2_2' +import { migrateFile as migrateFileEightFive } from './8_5_0' import type { PDProtocolFile } from '../../file-types' @@ -58,6 +59,8 @@ const allMigrationsByVersion: MigrationsByVersion = { '8.2.0': migrateFileEightTwo, // @ts-expect-error '8.2.2': migrateFileEightTwoPointTwo, + // @ts-expect-error + '8.5.0': migrateFileEightFive, } export const migration = ( file: any diff --git a/protocol-designer/src/organisms/TipPositionModal/ZTipPositionModal.tsx b/protocol-designer/src/organisms/TipPositionModal/ZTipPositionModal.tsx index 6453824b4d4..c78e24e064a 100644 --- a/protocol-designer/src/organisms/TipPositionModal/ZTipPositionModal.tsx +++ b/protocol-designer/src/organisms/TipPositionModal/ZTipPositionModal.tsx @@ -46,12 +46,15 @@ export function ZTipPositionModal(props: ZTipPositionModalProps): JSX.Element { } = props const { t } = useTranslation(['modal', 'button']) - const isBlowout = name === 'blowout_z_offset' - const defaultMm = isBlowout + const isPositionFromTop = + name === 'blowout_z_offset' || + name === 'aspirate_touchTip_mmFromTop' || + name === 'dispense_touchTip_mmFromTop' || + name === 'mix_touchTip_mmFromTop' + const defaultMm = isPositionFromTop ? 0 - : utils.getDefaultMmFromBottom({ + : utils.getDefaultMmFromEdge({ name, - wellDepthMm, }) const [value, setValue] = useState( @@ -82,8 +85,8 @@ export function ZTipPositionModal(props: ZTipPositionModalProps): JSX.Element { const minFromTop = DEFAULT_MM_BLOWOUT_OFFSET_FROM_TOP const maxFromTop = -wellDepthMm - const minMm = isBlowout ? maxFromTop : minMmFromBottom - const maxMm = isBlowout ? minFromTop : maxMmFromBottom + const minMm = isPositionFromTop ? maxFromTop : minMmFromBottom + const maxMm = isPositionFromTop ? minFromTop : maxMmFromBottom const errors = utils.getErrors({ minMm, @@ -126,7 +129,7 @@ export function ZTipPositionModal(props: ZTipPositionModalProps): JSX.Element { } else if (newValue === '-0') { setValue('0') } else { - isBlowout + isPositionFromTop ? setValue(newValue) : setValue(Number(newValue) >= 0 ? newValue : '0') } @@ -192,10 +195,14 @@ export function ZTipPositionModal(props: ZTipPositionModalProps): JSX.Element { ( diff --git a/protocol-designer/src/organisms/TipPositionModal/utils.tsx b/protocol-designer/src/organisms/TipPositionModal/utils.tsx index bef22227c80..0ed88bb6a40 100644 --- a/protocol-designer/src/organisms/TipPositionModal/utils.tsx +++ b/protocol-designer/src/organisms/TipPositionModal/utils.tsx @@ -8,35 +8,24 @@ import { import { DECIMALS_ALLOWED, TOO_MANY_DECIMALS } from './constants' import type { StepFieldName } from '../../form-types' -export function getDefaultMmFromBottom(args: { - name: StepFieldName - wellDepthMm: number -}): number { - const { name, wellDepthMm } = args +export function getDefaultMmFromEdge(args: { name: StepFieldName }): number { + const { name } = args switch (name) { - case 'aspirate_mmFromBottom': - return DEFAULT_MM_OFFSET_FROM_BOTTOM - - case 'aspirate_delay_mmFromBottom': - return DEFAULT_MM_OFFSET_FROM_BOTTOM - + case 'mix_mmFromBottom': case 'dispense_mmFromBottom': - return DEFAULT_MM_OFFSET_FROM_BOTTOM - case 'dispense_delay_mmFromBottom': - return DEFAULT_MM_OFFSET_FROM_BOTTOM - - case 'mix_mmFromBottom': + case 'aspirate_delay_mmFromBottom': + case 'aspirate_mmFromBottom': return DEFAULT_MM_OFFSET_FROM_BOTTOM default: // touch tip fields console.assert( getIsTouchTipField(name), - `getDefaultMmFromBottom fn does not know what to do with field ${name}` + `getDefaultMmFromEdge fn does not know what to do with field ${name}` ) - return DEFAULT_MM_TOUCH_TIP_OFFSET_FROM_TOP + wellDepthMm + return DEFAULT_MM_TOUCH_TIP_OFFSET_FROM_TOP } } diff --git a/protocol-designer/src/pages/Designer/ProtocolSteps/BatchEditToolbox/BatchEditMixTools.tsx b/protocol-designer/src/pages/Designer/ProtocolSteps/BatchEditToolbox/BatchEditMixTools.tsx index 1aa64e02057..0b74bbab2f3 100644 --- a/protocol-designer/src/pages/Designer/ProtocolSteps/BatchEditToolbox/BatchEditMixTools.tsx +++ b/protocol-designer/src/pages/Designer/ProtocolSteps/BatchEditToolbox/BatchEditMixTools.tsx @@ -179,9 +179,9 @@ export function BatchEditMixTools(props: BatchEditMixToolsProps): JSX.Element { ) : null} diff --git a/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/PipetteFields/PositionField.tsx b/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/PipetteFields/PositionField.tsx index 681b97be866..ef68b274d9b 100644 --- a/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/PipetteFields/PositionField.tsx +++ b/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/PipetteFields/PositionField.tsx @@ -17,7 +17,7 @@ import { import { getWellsDepth, getWellDimension } from '@opentrons/shared-data' import { TipPositionModal, ZTipPositionModal } from '../../../../../organisms' import { getIsDelayPositionField } from '../../../../../form-types' -import { getDefaultMmFromBottom } from '../../../../../organisms/TipPositionModal/utils' +import { getDefaultMmFromEdge } from '../../../../../organisms/TipPositionModal/utils' import { selectors as stepFormSelectors } from '../../../../../step-forms' import type { TipXOffsetFields, @@ -105,8 +105,7 @@ export function PositionField(props: PositionFieldProps): JSX.Element { const mmFromBottom = typeof rawZValue === 'number' ? rawZValue : null if (wellDepthMm !== null) { // show default value for field in parens if no mmFromBottom value is selected - zValue = - mmFromBottom ?? getDefaultMmFromBottom({ name: zName, wellDepthMm }) + zValue = mmFromBottom ?? getDefaultMmFromEdge({ name: zName }) } let modal = ( diff --git a/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/StepTools/MixTools/index.tsx b/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/StepTools/MixTools/index.tsx index 981ff980660..464a25da240 100644 --- a/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/StepTools/MixTools/index.tsx +++ b/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/StepTools/MixTools/index.tsx @@ -318,11 +318,11 @@ export function MixTools(props: StepFormProps): JSX.Element { = { aspirate_mmFromBottom: 'aspirate_labware', - aspirate_touchTip_mmFromBottom: 'aspirate_labware', + aspirate_touchTip_mmFromTop: 'aspirate_labware', aspirate_delay_mmFromBottom: 'aspirate_labware', dispense_mmFromBottom: 'dispense_labware', - dispense_touchTip_mmFromBottom: 'dispense_labware', + dispense_touchTip_mmFromTop: 'dispense_labware', dispense_delay_mmFromBottom: 'dispense_labware', mix_mmFromBottom: 'labware', - mix_touchTip_mmFromBottom: 'labware', + mix_touchTip_mmFromTop: 'labware', } return fieldMap[name] } diff --git a/protocol-designer/src/step-forms/test/createPresavedStepForm.test.ts b/protocol-designer/src/step-forms/test/createPresavedStepForm.test.ts index 1ff4534869a..0e233db1534 100644 --- a/protocol-designer/src/step-forms/test/createPresavedStepForm.test.ts +++ b/protocol-designer/src/step-forms/test/createPresavedStepForm.test.ts @@ -161,7 +161,7 @@ describe('createPresavedStepForm', () => { aspirate_mix_volume: null, aspirate_mmFromBottom: null, aspirate_touchTip_checkbox: false, - aspirate_touchTip_mmFromBottom: null, + aspirate_touchTip_mmFromTop: null, aspirate_wellOrder_first: 't2b', aspirate_wellOrder_second: 'l2r', aspirate_wells: [], @@ -178,7 +178,7 @@ describe('createPresavedStepForm', () => { dispense_mix_volume: null, dispense_mmFromBottom: null, dispense_touchTip_checkbox: false, - dispense_touchTip_mmFromBottom: null, + dispense_touchTip_mmFromTop: null, dispense_wellOrder_first: 't2b', dispense_wellOrder_second: 'l2r', dispense_wells: [], @@ -217,7 +217,7 @@ describe('createPresavedStepForm', () => { dispense_delay_checkbox: false, dispense_delay_seconds: `${DEFAULT_DELAY_SECONDS}`, mix_mmFromBottom: DEFAULT_MM_OFFSET_FROM_BOTTOM, - mix_touchTip_mmFromBottom: null, + mix_touchTip_mmFromTop: null, mix_wellOrder_first: 't2b', mix_wellOrder_second: 'l2r', blowout_checkbox: false, diff --git a/protocol-designer/src/steplist/formLevel/getDefaultsForStepType.ts b/protocol-designer/src/steplist/formLevel/getDefaultsForStepType.ts index 3d405810254..571cdf819f7 100644 --- a/protocol-designer/src/steplist/formLevel/getDefaultsForStepType.ts +++ b/protocol-designer/src/steplist/formLevel/getDefaultsForStepType.ts @@ -33,7 +33,7 @@ export function getDefaultsForStepType( labware: null, mix_mmFromBottom: DEFAULT_MM_OFFSET_FROM_BOTTOM, mix_touchTip_checkbox: false, - mix_touchTip_mmFromBottom: null, + mix_touchTip_mmFromTop: null, mix_wellOrder_first: DEFAULT_WELL_ORDER_FIRST_OPTION, mix_wellOrder_second: DEFAULT_WELL_ORDER_SECOND_OPTION, mix_x_position: 0, @@ -62,7 +62,7 @@ export function getDefaultsForStepType( aspirate_mix_volume: null, aspirate_mmFromBottom: null, aspirate_touchTip_checkbox: false, - aspirate_touchTip_mmFromBottom: null, + aspirate_touchTip_mmFromTop: null, aspirate_wellOrder_first: DEFAULT_WELL_ORDER_FIRST_OPTION, aspirate_wellOrder_second: DEFAULT_WELL_ORDER_SECOND_OPTION, aspirate_wells_grouped: false, @@ -86,7 +86,7 @@ export function getDefaultsForStepType( dispense_mix_volume: null, dispense_mmFromBottom: null, dispense_touchTip_checkbox: false, - dispense_touchTip_mmFromBottom: null, + dispense_touchTip_mmFromTop: null, dispense_wellOrder_first: DEFAULT_WELL_ORDER_FIRST_OPTION, dispense_wellOrder_second: DEFAULT_WELL_ORDER_SECOND_OPTION, dispense_wells: [], diff --git a/protocol-designer/src/steplist/formLevel/handleFormChange/dependentFieldsUpdateMix.ts b/protocol-designer/src/steplist/formLevel/handleFormChange/dependentFieldsUpdateMix.ts index ab2a53eba81..b2fc0ef1fbb 100644 --- a/protocol-designer/src/steplist/formLevel/handleFormChange/dependentFieldsUpdateMix.ts +++ b/protocol-designer/src/steplist/formLevel/handleFormChange/dependentFieldsUpdateMix.ts @@ -32,7 +32,7 @@ const updatePatchOnLabwareChange = ( ...patch, ...getDefaultFields( 'mix_mmFromBottom', - 'mix_touchTip_mmFromBottom', + 'mix_touchTip_mmFromTop', 'mix_touchTip_checkbox' ), wells: getDefaultWells({ diff --git a/protocol-designer/src/steplist/formLevel/handleFormChange/dependentFieldsUpdateMoveLiquid.ts b/protocol-designer/src/steplist/formLevel/handleFormChange/dependentFieldsUpdateMoveLiquid.ts index 940d715a06d..018234491b9 100644 --- a/protocol-designer/src/steplist/formLevel/handleFormChange/dependentFieldsUpdateMoveLiquid.ts +++ b/protocol-designer/src/steplist/formLevel/handleFormChange/dependentFieldsUpdateMoveLiquid.ts @@ -190,7 +190,7 @@ const updatePatchOnLabwareChange = ( ? { ...getDefaultFields( 'aspirate_mmFromBottom', - 'aspirate_touchTip_mmFromBottom', + 'aspirate_touchTip_mmFromTop', 'aspirate_touchTip_checkbox' ), aspirate_wells: getDefaultWells({ @@ -206,7 +206,7 @@ const updatePatchOnLabwareChange = ( ? { ...getDefaultFields( 'dispense_mmFromBottom', - 'dispense_touchTip_mmFromBottom', + 'dispense_touchTip_mmFromTop', 'dispense_touchTip_checkbox' ), dispense_wells: getDefaultWells({ diff --git a/protocol-designer/src/steplist/formLevel/handleFormChange/test/mix.test.ts b/protocol-designer/src/steplist/formLevel/handleFormChange/test/mix.test.ts index 3684648327d..7231e22f15d 100644 --- a/protocol-designer/src/steplist/formLevel/handleFormChange/test/mix.test.ts +++ b/protocol-designer/src/steplist/formLevel/handleFormChange/test/mix.test.ts @@ -82,7 +82,7 @@ describe('well selection should update', () => { volume: '2', pipette: 'pipetteId', mix_mmFromBottom: 1.2, - mix_touchTip_mmFromBottom: 2.3, + mix_touchTip_mmFromTop: 2.3, } }) it('pipette cleared', () => { @@ -133,7 +133,7 @@ describe('well selection should update', () => { ...patch, wells: ['A1'], mix_mmFromBottom: DEFAULT_MM_OFFSET_FROM_BOTTOM, - mix_touchTip_mmFromBottom: null, + mix_touchTip_mmFromTop: null, mix_touchTip_checkbox: false, }) }) @@ -146,7 +146,7 @@ describe('well selection should update', () => { ...patch, wells: [], mix_mmFromBottom: DEFAULT_MM_OFFSET_FROM_BOTTOM, - mix_touchTip_mmFromBottom: null, + mix_touchTip_mmFromTop: null, mix_touchTip_checkbox: false, }) }) diff --git a/protocol-designer/src/steplist/formLevel/stepFormToArgs/getDelayData.ts b/protocol-designer/src/steplist/formLevel/stepFormToArgs/getDelayData.ts index 5ae5860621a..b6dfdd643f5 100644 --- a/protocol-designer/src/steplist/formLevel/stepFormToArgs/getDelayData.ts +++ b/protocol-designer/src/steplist/formLevel/stepFormToArgs/getDelayData.ts @@ -1,4 +1,4 @@ -import { getDefaultMmFromBottom } from '../../../organisms/TipPositionModal/utils' +import { getDefaultMmFromEdge } from '../../../organisms/TipPositionModal/utils' import type { InnerDelayArgs } from '@opentrons/step-generation' import type { DelayCheckboxFields, @@ -21,9 +21,8 @@ export function getMoveLiquidDelayData( if (typeof mmFromBottomFormValue === 'number') { mmFromBottom = mmFromBottomFormValue } else if (mmFromBottomFormValue === null) { - mmFromBottom = getDefaultMmFromBottom({ + mmFromBottom = getDefaultMmFromEdge({ name: mmFromBottomField, - wellDepthMm: 0 /* NOTE: `wellDepthMm` should not be used for delay offsets */, }) } if ( diff --git a/protocol-designer/src/steplist/formLevel/stepFormToArgs/mixFormToArgs.ts b/protocol-designer/src/steplist/formLevel/stepFormToArgs/mixFormToArgs.ts index 8658c46d124..803b75422ac 100644 --- a/protocol-designer/src/steplist/formLevel/stepFormToArgs/mixFormToArgs.ts +++ b/protocol-designer/src/steplist/formLevel/stepFormToArgs/mixFormToArgs.ts @@ -1,4 +1,3 @@ -import { getWellsDepth } from '@opentrons/shared-data' import { DEFAULT_CHANGE_TIP_OPTION, DEFAULT_MM_BLOWOUT_OFFSET_FROM_TOP, @@ -38,10 +37,9 @@ export const mixFormToArgs = ( orderSecond ) const touchTip = Boolean(hydratedFormData.mix_touchTip_checkbox) - const touchTipMmFromBottom = - hydratedFormData.mix_touchTip_mmFromBottom || - getWellsDepth(labware.def, orderedWells) + - DEFAULT_MM_TOUCH_TIP_OFFSET_FROM_TOP + const touchTipMmFromTop = + hydratedFormData.mix_touchTip_mmFromTop ?? + DEFAULT_MM_TOUCH_TIP_OFFSET_FROM_TOP const volume = hydratedFormData.volume || 0 const times = hydratedFormData.times || 0 const aspirateFlowRateUlSec = @@ -91,7 +89,7 @@ export const mixFormToArgs = ( volume, times, touchTip, - touchTipMmFromBottom, + touchTipMmFromTop, changeTip, blowoutLocation, pipette: pipette.id, diff --git a/protocol-designer/src/steplist/formLevel/stepFormToArgs/moveLiquidFormToArgs.ts b/protocol-designer/src/steplist/formLevel/stepFormToArgs/moveLiquidFormToArgs.ts index 2ca6853a2d6..e6827ac2e9c 100644 --- a/protocol-designer/src/steplist/formLevel/stepFormToArgs/moveLiquidFormToArgs.ts +++ b/protocol-designer/src/steplist/formLevel/stepFormToArgs/moveLiquidFormToArgs.ts @@ -1,4 +1,3 @@ -import { getWellsDepth } from '@opentrons/shared-data' import { DEST_WELL_BLOWOUT_DESTINATION } from '@opentrons/step-generation' import { DEFAULT_MM_BLOWOUT_OFFSET_FROM_TOP, @@ -121,10 +120,6 @@ export const moveLiquidFormToArgs = ( } } } - const wellDepth = - 'def' in destLabware && destWells != null - ? getWellsDepth(destLabware.def, destWells) - : 0 const disposalVolume = hydratedFormData.disposalVolume_checkbox ? hydratedFormData.disposalVolume_volume @@ -132,16 +127,15 @@ export const moveLiquidFormToArgs = ( const touchTipAfterAspirate = Boolean( hydratedFormData.aspirate_touchTip_checkbox ) - const touchTipAfterAspirateOffsetMmFromBottom = - hydratedFormData.aspirate_touchTip_mmFromBottom || - getWellsDepth(hydratedFormData.aspirate_labware.def, sourceWells) + - DEFAULT_MM_TOUCH_TIP_OFFSET_FROM_TOP + const touchTipAfterAspirateOffsetMmFromTop = + hydratedFormData.aspirate_touchTip_mmFromTop ?? + DEFAULT_MM_TOUCH_TIP_OFFSET_FROM_TOP const touchTipAfterDispense = Boolean( hydratedFormData.dispense_touchTip_checkbox ) - const touchTipAfterDispenseOffsetMmFromBottom = - hydratedFormData.dispense_touchTip_mmFromBottom || - wellDepth + DEFAULT_MM_TOUCH_TIP_OFFSET_FROM_TOP + const touchTipAfterDispenseOffsetMmFromTop = + hydratedFormData.dispense_touchTip_mmFromTop ?? + DEFAULT_MM_TOUCH_TIP_OFFSET_FROM_TOP const mixBeforeAspirate = getMixData( hydratedFormData, 'aspirate_mix_checkbox', @@ -220,9 +214,9 @@ export const moveLiquidFormToArgs = ( aspirateAirGapVolume, dispenseAirGapVolume, touchTipAfterAspirate, - touchTipAfterAspirateOffsetMmFromBottom, + touchTipAfterAspirateOffsetMmFromTop, touchTipAfterDispense, - touchTipAfterDispenseOffsetMmFromBottom, + touchTipAfterDispenseOffsetMmFromTop, description: hydratedFormData.stepDetails, name: hydratedFormData.stepName, // TODO(jr, 7/26/24): wire up wellNames diff --git a/protocol-designer/src/steplist/formLevel/stepFormToArgs/test/mixFormToArgs.test.ts b/protocol-designer/src/steplist/formLevel/stepFormToArgs/test/mixFormToArgs.test.ts index adffcac2061..4f1c2f76795 100644 --- a/protocol-designer/src/steplist/formLevel/stepFormToArgs/test/mixFormToArgs.test.ts +++ b/protocol-designer/src/steplist/formLevel/stepFormToArgs/test/mixFormToArgs.test.ts @@ -59,7 +59,7 @@ beforeEach(() => { times: '2', dispense_flowRate: 4, mix_touchTip_checkbox: false, - mix_touchTip_mmFromBottom: null, + mix_touchTip_mmFromTop: null, aspirate_delay_checkbox: false, aspirate_delay_seconds: null, dispense_delay_checkbox: false, @@ -83,7 +83,7 @@ describe('mix step form -> command creator args', () => { volume: '12', times: '2', touchTip: false, - touchTipMmFromBottom: 9.54, + touchTipMmFromTop: -1, changeTip: 'always', blowoutLocation: null, pipette: 'pipetteId', @@ -131,14 +131,14 @@ describe('mix step form -> command creator args', () => { // TOUCH TIP { checkboxField: 'mix_touchTip_checkbox', - formFields: { mix_touchTip_mmFromBottom: 10.5 }, + formFields: { mix_touchTip_mmFromTop: -10.5 }, expectedArgsUnchecked: { touchTip: false, - touchTipMmFromBottom: 10.5, + touchTipMmFromTop: -10.5, }, expectedArgsChecked: { touchTip: true, - touchTipMmFromBottom: 10.5, + touchTipMmFromTop: -10.5, }, }, // Aspirate delay diff --git a/protocol-designer/src/steplist/formLevel/stepFormToArgs/test/moveLiquidFormToArgs.test.ts b/protocol-designer/src/steplist/formLevel/stepFormToArgs/test/moveLiquidFormToArgs.test.ts index 98afc6828fd..1ae269a33df 100644 --- a/protocol-designer/src/steplist/formLevel/stepFormToArgs/test/moveLiquidFormToArgs.test.ts +++ b/protocol-designer/src/steplist/formLevel/stepFormToArgs/test/moveLiquidFormToArgs.test.ts @@ -73,7 +73,7 @@ describe('move liquid step form -> command creator args', () => { aspirate_flowRate: null, aspirate_mmFromBottom: null, aspirate_touchTip_checkbox: false, - aspirate_touchTip_mmFromBottom: null, + aspirate_touchTip_mmFromTop: null, aspirate_mix_checkbox: false, aspirate_mix_volume: null, aspirate_mix_times: null, @@ -93,7 +93,7 @@ describe('move liquid step form -> command creator args', () => { dispense_flowRate: null, dispense_mmFromBottom: null, dispense_touchTip_checkbox: false, - dispense_touchTip_mmFromBottom: null, + dispense_touchTip_mmFromTop: null, dispense_mix_checkbox: false, dispense_mix_volume: null, dispense_mix_times: null, @@ -177,26 +177,26 @@ describe('move liquid step form -> command creator args', () => { // TOUCH TIPS { checkboxField: 'aspirate_touchTip_checkbox', - formFields: { aspirate_touchTip_mmFromBottom: 101 }, + formFields: { aspirate_touchTip_mmFromTop: -11 }, expectedArgsUnchecked: { touchTipAfterAspirate: false, - touchTipAfterAspirateOffsetMmFromBottom: 101, + touchTipAfterAspirateOffsetMmFromTop: -11, }, expectedArgsChecked: { touchTipAfterAspirate: true, - touchTipAfterAspirateOffsetMmFromBottom: 101, + touchTipAfterAspirateOffsetMmFromTop: -11, }, }, { checkboxField: 'dispense_touchTip_checkbox', - formFields: { dispense_touchTip_mmFromBottom: 42 }, + formFields: { dispense_touchTip_mmFromTop: -22 }, expectedArgsUnchecked: { touchTipAfterDispense: false, - touchTipAfterDispenseOffsetMmFromBottom: 42, + touchTipAfterDispenseOffsetMmFromTop: -22, }, expectedArgsChecked: { touchTipAfterDispense: true, - touchTipAfterDispenseOffsetMmFromBottom: 42, + touchTipAfterDispenseOffsetMmFromTop: -22, }, }, // MIXES diff --git a/protocol-designer/src/steplist/formLevel/test/getDefaultsForStepType.test.ts b/protocol-designer/src/steplist/formLevel/test/getDefaultsForStepType.test.ts index 570437d350a..aeb24f5e708 100644 --- a/protocol-designer/src/steplist/formLevel/test/getDefaultsForStepType.test.ts +++ b/protocol-designer/src/steplist/formLevel/test/getDefaultsForStepType.test.ts @@ -35,7 +35,7 @@ describe('getDefaultsForStepType', () => { aspirate_mix_volume: null, aspirate_mmFromBottom: null, aspirate_touchTip_checkbox: false, - aspirate_touchTip_mmFromBottom: null, + aspirate_touchTip_mmFromTop: null, dispense_flowRate: null, dispense_labware: null, @@ -47,7 +47,7 @@ describe('getDefaultsForStepType', () => { dispense_mix_volume: null, dispense_mmFromBottom: null, dispense_touchTip_checkbox: false, - dispense_touchTip_mmFromBottom: null, + dispense_touchTip_mmFromTop: null, disposalVolume_checkbox: false, disposalVolume_volume: null, @@ -95,7 +95,7 @@ describe('getDefaultsForStepType', () => { blowout_location: null, blowout_flowRate: null, mix_mmFromBottom: DEFAULT_MM_OFFSET_FROM_BOTTOM, - mix_touchTip_mmFromBottom: null, + mix_touchTip_mmFromTop: null, mix_touchTip_checkbox: false, pipette: null, nozzles: null, diff --git a/protocol-designer/src/steplist/test/generateSubsteps.test.ts b/protocol-designer/src/steplist/test/generateSubsteps.test.ts index 86bc5a7ad11..8994f921232 100644 --- a/protocol-designer/src/steplist/test/generateSubsteps.test.ts +++ b/protocol-designer/src/steplist/test/generateSubsteps.test.ts @@ -364,7 +364,7 @@ describe('generateSubstepItem', () => { volume: 50, times: 2, touchTip: false, - touchTipMmFromBottom: 5, + touchTipMmFromTop: -5, changeTip: 'always', blowoutLocation: null, blowoutFlowRateUlSec: 3, diff --git a/protocol-designer/src/timelineMiddleware/__tests__/generateRobotStateTimeline.test.ts b/protocol-designer/src/timelineMiddleware/__tests__/generateRobotStateTimeline.test.ts index 4a807129b81..21f16d4a03d 100644 --- a/protocol-designer/src/timelineMiddleware/__tests__/generateRobotStateTimeline.test.ts +++ b/protocol-designer/src/timelineMiddleware/__tests__/generateRobotStateTimeline.test.ts @@ -40,9 +40,9 @@ describe('generateRobotStateTimeline', () => { dispenseAirGapVolume: null, mixInDestination: null, touchTipAfterAspirate: false, - touchTipAfterAspirateOffsetMmFromBottom: 13.81, + touchTipAfterAspirateOffsetMmFromTop: -13.81, touchTipAfterDispense: false, - touchTipAfterDispenseOffsetMmFromBottom: 13.81, + touchTipAfterDispenseOffsetMmFromTop: -13.81, name: 'transfer', commandCreatorFnName: 'transfer', blowoutLocation: null, @@ -80,9 +80,9 @@ describe('generateRobotStateTimeline', () => { dispenseAirGapVolume: null, mixInDestination: null, touchTipAfterAspirate: false, - touchTipAfterAspirateOffsetMmFromBottom: 13.81, + touchTipAfterAspirateOffsetMmFromTop: -13.81, touchTipAfterDispense: false, - touchTipAfterDispenseOffsetMmFromBottom: 13.81, + touchTipAfterDispenseOffsetMmFromTop: -13.81, name: 'transfer', commandCreatorFnName: 'transfer', blowoutLocation: null, @@ -110,7 +110,7 @@ describe('generateRobotStateTimeline', () => { volume: 5, times: 2, touchTip: false, - touchTipMmFromBottom: 13.81, + touchTipMmFromTop: -13.81, changeTip: 'always', blowoutLocation: null, pipette: DEFAULT_PIPETTE, diff --git a/protocol-designer/src/ui/steps/__fixtures__/index.ts b/protocol-designer/src/ui/steps/__fixtures__/index.ts index b7eeee3ec4a..67accdaad75 100644 --- a/protocol-designer/src/ui/steps/__fixtures__/index.ts +++ b/protocol-designer/src/ui/steps/__fixtures__/index.ts @@ -16,7 +16,7 @@ export const getMockMoveLiquidStep = (): SavedStepFormState => ({ aspirate_mix_volume: '5', aspirate_mmFromBottom: 1, aspirate_touchTip_checkbox: true, - aspirate_touchTip_mmFromBottom: 1, + aspirate_touchTip_mmFromTop: -1, dispense_flowRate: null, dispense_labware: 'dispense_labware_id', dispense_wells: ['A1'], @@ -27,7 +27,7 @@ export const getMockMoveLiquidStep = (): SavedStepFormState => ({ dispense_mix_volume: null, dispense_mmFromBottom: 0.5, dispense_touchTip_checkbox: true, - dispense_touchTip_mmFromBottom: 1, + dispense_touchTip_mmFromTop: -1, disposalVolume_checkbox: true, disposalVolume_volume: '20', blowout_checkbox: true, @@ -74,7 +74,7 @@ export const getMockMixStep = (): SavedStepFormState => ({ dispense_delay_checkbox: false, dispense_delay_seconds: '1', mix_touchTip_checkbox: false, - mix_touchTip_mmFromBottom: null, + mix_touchTip_mmFromTop: null, dropTip_location: 'fixedTrash', }, }) diff --git a/protocol-designer/src/ui/steps/test/selectors.test.ts b/protocol-designer/src/ui/steps/test/selectors.test.ts index e91dc7a82ac..1e1dd3f152b 100644 --- a/protocol-designer/src/ui/steps/test/selectors.test.ts +++ b/protocol-designer/src/ui/steps/test/selectors.test.ts @@ -508,8 +508,8 @@ describe('_getSavedMultiSelectFieldValues', () => { value: true, isIndeterminate: false, }, - aspirate_touchTip_mmFromBottom: { - value: 1, + aspirate_touchTip_mmFromTop: { + value: -1, isIndeterminate: false, }, // dispense settings @@ -569,8 +569,8 @@ describe('_getSavedMultiSelectFieldValues', () => { value: true, isIndeterminate: false, }, - dispense_touchTip_mmFromBottom: { - value: 1, + dispense_touchTip_mmFromTop: { + value: -1, isIndeterminate: false, }, blowout_checkbox: { @@ -654,7 +654,7 @@ describe('_getSavedMultiSelectFieldValues', () => { aspirate_airGap_checkbox: false, // same thing here with air gap volume aspirate_touchTip_checkbox: false, - // same thing with aspirate_touchTip_mmFromBottom + // same thing with aspirate_touchTip_mmFromTop dispense_labware: 'other_disp_labware', dispense_flowRate: 2, dispense_mmFromBottom: '2', @@ -668,7 +668,7 @@ describe('_getSavedMultiSelectFieldValues', () => { dispense_airGap_checkbox: false, // same thing here with air gap volume dispense_touchTip_checkbox: false, - // same thing with dispense_touchTip_mmFromBottom + // same thing with dispense_touchTip_mmFromTop blowout_checkbox: false, // same thing here with blowout location nozzles: null, @@ -758,9 +758,9 @@ describe('_getSavedMultiSelectFieldValues', () => { aspirate_touchTip_checkbox: { isIndeterminate: true, }, - aspirate_touchTip_mmFromBottom: { + aspirate_touchTip_mmFromTop: { isIndeterminate: false, - value: 1, + value: -1, }, // dispense settings dispense_labware: { @@ -810,9 +810,9 @@ describe('_getSavedMultiSelectFieldValues', () => { dispense_touchTip_checkbox: { isIndeterminate: true, }, - dispense_touchTip_mmFromBottom: { + dispense_touchTip_mmFromTop: { isIndeterminate: false, - value: 1, + value: -1, }, blowout_checkbox: { isIndeterminate: true, @@ -917,7 +917,7 @@ describe('_getSavedMultiSelectFieldValues', () => { dispense_delay_checkbox: { value: false, isIndeterminate: false }, dispense_delay_seconds: { value: '1', isIndeterminate: false }, mix_touchTip_checkbox: { value: false, isIndeterminate: false }, - mix_touchTip_mmFromBottom: { value: null, isIndeterminate: false }, + mix_touchTip_mmFromTop: { value: null, isIndeterminate: false }, nozzles: { value: undefined, isIndeterminate: false }, mix_x_position: { isIndeterminate: false, @@ -974,7 +974,7 @@ describe('_getSavedMultiSelectFieldValues', () => { dispense_delay_checkbox: true, dispense_delay_seconds: '3', mix_touchTip_checkbox: true, - mix_touchTip_mmFromBottom: '14', + mix_touchTip_mmFromTop: '-14', nozzles: null, }, } @@ -1011,7 +1011,7 @@ describe('_getSavedMultiSelectFieldValues', () => { dispense_delay_checkbox: { isIndeterminate: true }, dispense_delay_seconds: { isIndeterminate: true }, mix_touchTip_checkbox: { isIndeterminate: true }, - mix_touchTip_mmFromBottom: { isIndeterminate: true }, + mix_touchTip_mmFromTop: { isIndeterminate: true }, nozzles: { isIndeterminate: true }, mix_x_position: { isIndeterminate: false, @@ -1154,7 +1154,7 @@ describe('getMultiSelectDisabledFields', () => { aspirate_delay_seconds: aspirateLabwareDifferentText, aspirate_delay_mmFromBottom: aspirateLabwareDifferentText, aspirate_touchTip_checkbox: aspirateLabwareDifferentText, - aspirate_touchTip_mmFromBottom: aspirateLabwareDifferentText, + aspirate_touchTip_mmFromTop: aspirateLabwareDifferentText, }) }) }) @@ -1184,7 +1184,7 @@ describe('getMultiSelectDisabledFields', () => { dispense_delay_seconds: dispenseLabwareDifferentText, dispense_delay_mmFromBottom: dispenseLabwareDifferentText, dispense_touchTip_checkbox: dispenseLabwareDifferentText, - dispense_touchTip_mmFromBottom: dispenseLabwareDifferentText, + dispense_touchTip_mmFromTop: dispenseLabwareDifferentText, }) }) }) @@ -1372,7 +1372,7 @@ describe('getMultiSelectDisabledFields', () => { dispense_delay_checkbox: labwareDifferentText, dispense_delay_seconds: labwareDifferentText, mix_touchTip_checkbox: labwareDifferentText, - mix_touchTip_mmFromBottom: labwareDifferentText, + mix_touchTip_mmFromTop: labwareDifferentText, }) }) }) diff --git a/protocol-designer/src/ui/steps/utils.ts b/protocol-designer/src/ui/steps/utils.ts index bf3cba42aaa..a80da0d4dd2 100644 --- a/protocol-designer/src/ui/steps/utils.ts +++ b/protocol-designer/src/ui/steps/utils.ts @@ -42,7 +42,7 @@ const batchEditMoveLiquidAspirateLabwareDisabledFieldNames: StepFieldName[] = [ 'aspirate_delay_seconds', 'aspirate_delay_mmFromBottom', 'aspirate_touchTip_checkbox', - 'aspirate_touchTip_mmFromBottom', + 'aspirate_touchTip_mmFromTop', ] const batchEditMoveLiquidDispenseLabwareDisabledFieldNames: StepFieldName[] = [ 'dispense_mmFromBottom', @@ -50,7 +50,7 @@ const batchEditMoveLiquidDispenseLabwareDisabledFieldNames: StepFieldName[] = [ 'dispense_delay_seconds', 'dispense_delay_mmFromBottom', 'dispense_touchTip_checkbox', - 'dispense_touchTip_mmFromBottom', + 'dispense_touchTip_mmFromTop', ] const batchEditMixLabwareDifferentDisabledFieldNames: StepFieldName[] = [ 'mix_mmFromBottom', @@ -59,7 +59,7 @@ const batchEditMixLabwareDifferentDisabledFieldNames: StepFieldName[] = [ 'dispense_delay_checkbox', 'dispense_delay_seconds', 'mix_touchTip_checkbox', - 'mix_touchTip_mmFromBottom', + 'mix_touchTip_mmFromTop', ] const batchEditMoveLiquidMultiAspiratePathDisabledFieldNames: StepFieldName[] = [ 'aspirate_mix_checkbox', diff --git a/step-generation/src/__tests__/consolidate.test.ts b/step-generation/src/__tests__/consolidate.test.ts index c77ab3ab53d..6a00b13006f 100644 --- a/step-generation/src/__tests__/consolidate.test.ts +++ b/step-generation/src/__tests__/consolidate.test.ts @@ -908,9 +908,9 @@ describe('consolidate single-channel', () => { const touchTipAfterAsp = { wellLocation: { - origin: 'bottom' as const, + origin: 'top' as const, offset: { - z: mixinArgs.touchTipAfterAspirateOffsetMmFromBottom, + z: mixinArgs.touchTipAfterAspirateOffsetMmFromTop, }, }, } @@ -949,9 +949,9 @@ describe('consolidate single-channel', () => { const touchTipAfterDisp = { labwareId: DEST_LABWARE, wellLocation: { - origin: 'bottom' as const, + origin: 'top' as const, offset: { - z: mixinArgs.touchTipAfterDispenseOffsetMmFromBottom, + z: mixinArgs.touchTipAfterDispenseOffsetMmFromTop, }, }, } @@ -1080,7 +1080,7 @@ describe('consolidate single-channel', () => { preWetTip: true, aspirateDelay: { seconds: 11, mmFromBottom: 15 }, touchTipAfterAspirate: true, - touchTipAfterAspirateOffsetMmFromBottom: 14.5, + touchTipAfterAspirateOffsetMmFromTop: -14.5, aspirateAirGapVolume: 31, // dispense column dispenseDelay: { seconds: 12, mmFromBottom: 14 }, @@ -1207,9 +1207,9 @@ describe('consolidate single-channel', () => { labwareId: 'sourcePlateId', wellName: 'A1', wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: 14.5, + z: -14.5, }, }, }, @@ -1300,9 +1300,9 @@ describe('consolidate single-channel', () => { labwareId: 'sourcePlateId', wellName: 'A2', wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: 14.5, + z: -14.5, }, }, }, @@ -1449,9 +1449,9 @@ describe('consolidate single-channel', () => { labwareId: 'destPlateId', wellName: 'B1', wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: 3.4, + z: -3.4, }, }, }, @@ -1566,9 +1566,9 @@ describe('consolidate single-channel', () => { labwareId: 'sourcePlateId', wellName: 'A3', wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: 14.5, + z: -14.5, }, }, }, @@ -1715,9 +1715,9 @@ describe('consolidate single-channel', () => { labwareId: 'destPlateId', wellName: 'B1', wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: 3.4, + z: -3.4, }, }, }, @@ -1773,7 +1773,7 @@ describe('consolidate single-channel', () => { preWetTip: true, aspirateDelay: { seconds: 11, mmFromBottom: 15 }, touchTipAfterAspirate: true, - touchTipAfterAspirateOffsetMmFromBottom: 14.5, + touchTipAfterAspirateOffsetMmFromTop: -14.5, aspirateAirGapVolume: 31, // dispense column dispenseDelay: { seconds: 12, mmFromBottom: 14 }, @@ -1906,9 +1906,9 @@ describe('consolidate single-channel', () => { labwareId: 'sourcePlateId', wellName: 'A1', wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: 14.5, + z: -14.5, }, }, }, @@ -1999,9 +1999,9 @@ describe('consolidate single-channel', () => { labwareId: 'sourcePlateId', wellName: 'A2', wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: 14.5, + z: -14.5, }, }, }, @@ -2163,9 +2163,9 @@ describe('consolidate single-channel', () => { labwareId: 'destPlateId', wellName: 'B1', wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: 3.4, + z: -3.4, }, }, }, @@ -2280,9 +2280,9 @@ describe('consolidate single-channel', () => { labwareId: 'sourcePlateId', wellName: 'A3', wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: 14.5, + z: -14.5, }, }, }, @@ -2444,9 +2444,9 @@ describe('consolidate single-channel', () => { labwareId: 'destPlateId', wellName: 'B1', wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: 3.4, + z: -3.4, }, }, }, @@ -2499,7 +2499,7 @@ describe('consolidate single-channel', () => { preWetTip: true, aspirateDelay: { seconds: 11, mmFromBottom: 15 }, touchTipAfterAspirate: true, - touchTipAfterAspirateOffsetMmFromBottom: 14.5, + touchTipAfterAspirateOffsetMmFromTop: -14.5, aspirateAirGapVolume: 31, // dispense column dispenseDelay: { seconds: 12, mmFromBottom: 14 }, @@ -2632,9 +2632,9 @@ describe('consolidate single-channel', () => { labwareId: 'sourcePlateId', wellName: 'A1', wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: 14.5, + z: -14.5, }, }, }, @@ -2725,9 +2725,9 @@ describe('consolidate single-channel', () => { labwareId: 'sourcePlateId', wellName: 'A2', wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: 14.5, + z: -14.5, }, }, }, @@ -2889,9 +2889,9 @@ describe('consolidate single-channel', () => { labwareId: 'destPlateId', wellName: 'B1', wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: 3.4, + z: -3.4, }, }, }, @@ -3049,9 +3049,9 @@ describe('consolidate single-channel', () => { labwareId: 'sourcePlateId', wellName: 'A3', wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: 14.5, + z: -14.5, }, }, }, @@ -3213,9 +3213,9 @@ describe('consolidate single-channel', () => { labwareId: 'destPlateId', wellName: 'B1', wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: 3.4, + z: -3.4, }, }, }, diff --git a/step-generation/src/__tests__/distribute.test.ts b/step-generation/src/__tests__/distribute.test.ts index 12f3676f09a..2264f4b44b3 100644 --- a/step-generation/src/__tests__/distribute.test.ts +++ b/step-generation/src/__tests__/distribute.test.ts @@ -859,7 +859,7 @@ describe('advanced settings: volume, mix, pre-wet tip, tip touch, tip position', }, aspirateDelay: { seconds: 11, mmFromBottom: 15 }, touchTipAfterAspirate: true, - touchTipAfterAspirateOffsetMmFromBottom: 14.5, + touchTipAfterAspirateOffsetMmFromTop: -14.5, aspirateAirGapVolume: 31, // dispense column dispenseDelay: { seconds: 12, mmFromBottom: 14 }, @@ -884,7 +884,7 @@ describe('advanced settings: volume, mix, pre-wet tip, tip touch, tip position', }, aspirateDelay: { seconds: 11, mmFromBottom: 15 }, touchTipAfterAspirate: true, - touchTipAfterAspirateOffsetMmFromBottom: 14.5, + touchTipAfterAspirateOffsetMmFromTop: -14.5, aspirateAirGapVolume: 31, // dispense column dispenseDelay: { seconds: 12, mmFromBottom: 14 }, @@ -917,9 +917,9 @@ describe('advanced settings: volume, mix, pre-wet tip, tip touch, tip position', // touch tip (asp) touchTipHelper('A1', { wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: 14.5, + z: -14.5, }, }, }), @@ -965,9 +965,9 @@ describe('advanced settings: volume, mix, pre-wet tip, tip touch, tip position', // touch tip (asp) touchTipHelper('A1', { wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: 14.5, + z: -14.5, }, }, }), @@ -998,9 +998,9 @@ describe('advanced settings: volume, mix, pre-wet tip, tip touch, tip position', // touch tip (asp) touchTipHelper('A1', { wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: 14.5, + z: -14.5, }, }, }), @@ -1048,9 +1048,9 @@ describe('advanced settings: volume, mix, pre-wet tip, tip touch, tip position', // touch tip (asp) touchTipHelper('A1', { wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: 14.5, + z: -14.5, }, }, }), @@ -1087,9 +1087,9 @@ describe('advanced settings: volume, mix, pre-wet tip, tip touch, tip position', // touch tip (asp) touchTipHelper('A1', { wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: 14.5, + z: -14.5, }, }, }), @@ -1138,9 +1138,9 @@ describe('advanced settings: volume, mix, pre-wet tip, tip touch, tip position', // touch tip (asp) touchTipHelper('A1', { wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: 14.5, + z: -14.5, }, }, }), @@ -1170,9 +1170,9 @@ describe('advanced settings: volume, mix, pre-wet tip, tip touch, tip position', // touch tip (asp) touchTipHelper('A1', { wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: 14.5, + z: -14.5, }, }, }), @@ -1218,9 +1218,9 @@ describe('advanced settings: volume, mix, pre-wet tip, tip touch, tip position', // touch tip (asp) touchTipHelper('A1', { wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: 14.5, + z: -14.5, }, }, }), @@ -1251,9 +1251,9 @@ describe('advanced settings: volume, mix, pre-wet tip, tip touch, tip position', // touch tip (asp) touchTipHelper('A1', { wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: 14.5, + z: -14.5, }, }, }), @@ -1303,9 +1303,9 @@ describe('advanced settings: volume, mix, pre-wet tip, tip touch, tip position', // touch tip (asp) touchTipHelper('A1', { wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: 14.5, + z: -14.5, }, }, }), @@ -1344,9 +1344,9 @@ describe('advanced settings: volume, mix, pre-wet tip, tip touch, tip position', // touch tip (asp) touchTipHelper('A1', { wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: 14.5, + z: -14.5, }, }, }), @@ -1395,9 +1395,9 @@ describe('advanced settings: volume, mix, pre-wet tip, tip touch, tip position', // touch tip (asp) touchTipHelper('A1', { wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: 14.5, + z: -14.5, }, }, }), @@ -1428,9 +1428,9 @@ describe('advanced settings: volume, mix, pre-wet tip, tip touch, tip position', // touch tip (asp) touchTipHelper('A1', { wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: 14.5, + z: -14.5, }, }, }), @@ -1477,9 +1477,9 @@ describe('advanced settings: volume, mix, pre-wet tip, tip touch, tip position', // touch tip (asp) touchTipHelper('A1', { wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: 14.5, + z: -14.5, }, }, }), @@ -1510,9 +1510,9 @@ describe('advanced settings: volume, mix, pre-wet tip, tip touch, tip position', // touch tip (asp) touchTipHelper('A1', { wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: 14.5, + z: -14.5, }, }, }), @@ -1562,9 +1562,9 @@ describe('advanced settings: volume, mix, pre-wet tip, tip touch, tip position', // touch tip (asp) touchTipHelper('A1', { wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: 14.5, + z: -14.5, }, }, }), @@ -1603,9 +1603,9 @@ describe('advanced settings: volume, mix, pre-wet tip, tip touch, tip position', // touch tip (asp) touchTipHelper('A1', { wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: 14.5, + z: -14.5, }, }, }), @@ -1654,9 +1654,9 @@ describe('advanced settings: volume, mix, pre-wet tip, tip touch, tip position', // touch tip (asp) touchTipHelper('A1', { wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: 14.5, + z: -14.5, }, }, }), @@ -1687,9 +1687,9 @@ describe('advanced settings: volume, mix, pre-wet tip, tip touch, tip position', // touch tip (asp) touchTipHelper('A1', { wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: 14.5, + z: -14.5, }, }, }), diff --git a/step-generation/src/__tests__/transfer.test.ts b/step-generation/src/__tests__/transfer.test.ts index cd22d6a321b..9ed463aecb7 100644 --- a/step-generation/src/__tests__/transfer.test.ts +++ b/step-generation/src/__tests__/transfer.test.ts @@ -1092,7 +1092,7 @@ describe('advanced options', () => { }, aspirateDelay: { seconds: 11, mmFromBottom: 15 }, touchTipAfterAspirate: true, - touchTipAfterAspirateOffsetMmFromBottom: 14.5, + touchTipAfterAspirateOffsetMmFromTop: -14.5, aspirateAirGapVolume: 31, // dispense column dispenseDelay: { seconds: 12, mmFromBottom: 14 }, @@ -1275,9 +1275,9 @@ describe('advanced options', () => { labwareId: 'sourcePlateId', wellName: 'A1', wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: 14.5, + z: -14.5, }, }, }, @@ -1470,9 +1470,9 @@ describe('advanced options', () => { labwareId: 'destPlateId', wellName: 'B1', wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: 3.4, + z: -3.4, }, }, }, @@ -1585,9 +1585,9 @@ describe('advanced options', () => { labwareId: 'sourcePlateId', wellName: 'A1', wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: 14.5, + z: -14.5, }, }, }, @@ -1775,9 +1775,9 @@ describe('advanced options', () => { labwareId: 'destPlateId', wellName: 'B1', wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: 3.4, + z: -3.4, }, }, }, @@ -1992,9 +1992,9 @@ describe('advanced options', () => { labwareId: 'sourcePlateId', wellName: 'A1', wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: 14.5, + z: -14.5, }, }, }, @@ -2182,9 +2182,9 @@ describe('advanced options', () => { labwareId: 'destPlateId', wellName: 'B1', wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: 3.4, + z: -3.4, }, }, }, @@ -2299,9 +2299,9 @@ describe('advanced options', () => { labwareId: 'sourcePlateId', wellName: 'A1', wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: 14.5, + z: -14.5, }, }, }, @@ -2488,9 +2488,9 @@ describe('advanced options', () => { labwareId: 'destPlateId', wellName: 'B1', wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: 3.4, + z: -3.4, }, }, }, @@ -2732,9 +2732,9 @@ describe('advanced options', () => { labwareId: 'sourcePlateId', wellName: 'A1', wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: 14.5, + z: -14.5, }, }, }, @@ -2922,9 +2922,9 @@ describe('advanced options', () => { labwareId: 'destPlateId', wellName: 'B1', wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: 3.4, + z: -3.4, }, }, }, @@ -3039,9 +3039,9 @@ describe('advanced options', () => { labwareId: 'sourcePlateId', wellName: 'A1', wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: 14.5, + z: -14.5, }, }, }, @@ -3229,9 +3229,9 @@ describe('advanced options', () => { labwareId: 'destPlateId', wellName: 'B1', wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: 3.4, + z: -3.4, }, }, }, @@ -3471,9 +3471,9 @@ describe('advanced options', () => { labwareId: 'sourcePlateId', wellName: 'A1', wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: 14.5, + z: -14.5, }, }, }, @@ -3661,9 +3661,9 @@ describe('advanced options', () => { labwareId: 'destPlateId', wellName: 'B1', wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: 3.4, + z: -3.4, }, }, }, @@ -3835,9 +3835,9 @@ describe('advanced options', () => { labwareId: 'sourcePlateId', wellName: 'A1', wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: 14.5, + z: -14.5, }, }, }, @@ -4025,9 +4025,9 @@ describe('advanced options', () => { labwareId: 'destPlateId', wellName: 'B1', wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: 3.4, + z: -3.4, }, }, }, diff --git a/step-generation/src/commandCreators/compound/consolidate.ts b/step-generation/src/commandCreators/compound/consolidate.ts index 579d3799161..eb87de0ed45 100644 --- a/step-generation/src/commandCreators/compound/consolidate.ts +++ b/step-generation/src/commandCreators/compound/consolidate.ts @@ -276,9 +276,9 @@ export const consolidate: CommandCreator = ( labwareId: args.sourceLabware, wellName: sourceWell, wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: args.touchTipAfterAspirateOffsetMmFromBottom, + z: args.touchTipAfterAspirateOffsetMmFromTop, }, }, }), @@ -324,6 +324,7 @@ export const consolidate: CommandCreator = ( }), ] } + // can not touch tip in a waste chute const touchTipAfterDispenseCommands: CurriedCommandCreator[] = args.touchTipAfterDispense && destinationWell != null @@ -333,9 +334,9 @@ export const consolidate: CommandCreator = ( labwareId: args.destLabware, wellName: destinationWell, wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: args.touchTipAfterDispenseOffsetMmFromBottom, + z: args.touchTipAfterDispenseOffsetMmFromTop, }, }, }), diff --git a/step-generation/src/commandCreators/compound/distribute.ts b/step-generation/src/commandCreators/compound/distribute.ts index de87cffd29d..111626c79ce 100644 --- a/step-generation/src/commandCreators/compound/distribute.ts +++ b/step-generation/src/commandCreators/compound/distribute.ts @@ -298,9 +298,9 @@ export const distribute: CommandCreator = ( labwareId: args.destLabware, wellName: destWell, wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: args.touchTipAfterDispenseOffsetMmFromBottom, + z: args.touchTipAfterDispenseOffsetMmFromTop, }, }, }), @@ -457,9 +457,9 @@ export const distribute: CommandCreator = ( labwareId: args.sourceLabware, wellName: args.sourceWell, wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: args.touchTipAfterAspirateOffsetMmFromBottom, + z: args.touchTipAfterAspirateOffsetMmFromTop, }, }, }), diff --git a/step-generation/src/commandCreators/compound/mix.ts b/step-generation/src/commandCreators/compound/mix.ts index cacbdc27864..74d8d8c01cd 100644 --- a/step-generation/src/commandCreators/compound/mix.ts +++ b/step-generation/src/commandCreators/compound/mix.ts @@ -255,9 +255,9 @@ export const mix: CommandCreator = ( labwareId: labware, wellName: well, wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: data.touchTipMmFromBottom, + z: data.touchTipMmFromTop, }, }, }), diff --git a/step-generation/src/commandCreators/compound/transfer.ts b/step-generation/src/commandCreators/compound/transfer.ts index adfb9c43887..c4b3d183ea2 100644 --- a/step-generation/src/commandCreators/compound/transfer.ts +++ b/step-generation/src/commandCreators/compound/transfer.ts @@ -346,9 +346,9 @@ export const transfer: CommandCreator = ( labwareId: args.sourceLabware, wellName: sourceWell, wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: args.touchTipAfterAspirateOffsetMmFromBottom, + z: args.touchTipAfterAspirateOffsetMmFromTop, }, }, }), @@ -363,9 +363,9 @@ export const transfer: CommandCreator = ( labwareId: args.destLabware, wellName: destinationWell, wellLocation: { - origin: 'bottom', + origin: 'top', offset: { - z: args.touchTipAfterDispenseOffsetMmFromBottom, + z: args.touchTipAfterDispenseOffsetMmFromTop, }, }, }), diff --git a/step-generation/src/fixtures/commandFixtures.ts b/step-generation/src/fixtures/commandFixtures.ts index aac4662fea0..37e4ed07a44 100644 --- a/step-generation/src/fixtures/commandFixtures.ts +++ b/step-generation/src/fixtures/commandFixtures.ts @@ -55,7 +55,7 @@ export const BLOWOUT_FLOW_RATE = 2.3 export const ASPIRATE_OFFSET_FROM_BOTTOM_MM = 3.1 export const DISPENSE_OFFSET_FROM_BOTTOM_MM = 3.2 export const BLOWOUT_OFFSET_FROM_TOP_MM = 3.3 -const TOUCH_TIP_OFFSET_FROM_BOTTOM_MM = 3.4 +const TOUCH_TIP_OFFSET_FROM_TOP_MM = -3.4 interface FlowRateAndOffsetParamsTransferlike { aspirateFlowRateUlSec: number dispenseFlowRateUlSec: number @@ -63,8 +63,8 @@ interface FlowRateAndOffsetParamsTransferlike { aspirateOffsetFromBottomMm: number dispenseOffsetFromBottomMm: number blowoutOffsetFromTopMm: number - touchTipAfterAspirateOffsetMmFromBottom: number - touchTipAfterDispenseOffsetMmFromBottom: number + touchTipAfterAspirateOffsetMmFromTop: number + touchTipAfterDispenseOffsetMmFromTop: number } export const getFlowRateAndOffsetParamsTransferLike = (): FlowRateAndOffsetParamsTransferlike => ({ aspirateFlowRateUlSec: ASPIRATE_FLOW_RATE, @@ -74,8 +74,8 @@ export const getFlowRateAndOffsetParamsTransferLike = (): FlowRateAndOffsetParam dispenseOffsetFromBottomMm: DISPENSE_OFFSET_FROM_BOTTOM_MM, blowoutOffsetFromTopMm: BLOWOUT_OFFSET_FROM_TOP_MM, // for consolidate/distribute/transfer only - touchTipAfterAspirateOffsetMmFromBottom: TOUCH_TIP_OFFSET_FROM_BOTTOM_MM, - touchTipAfterDispenseOffsetMmFromBottom: TOUCH_TIP_OFFSET_FROM_BOTTOM_MM, + touchTipAfterAspirateOffsetMmFromTop: TOUCH_TIP_OFFSET_FROM_TOP_MM, + touchTipAfterDispenseOffsetMmFromTop: TOUCH_TIP_OFFSET_FROM_TOP_MM, }) interface FlowRateAndOffsetParamsMix { aspirateFlowRateUlSec: number @@ -84,7 +84,7 @@ interface FlowRateAndOffsetParamsMix { aspirateOffsetFromBottomMm: number dispenseOffsetFromBottomMm: number blowoutOffsetFromTopMm: number - touchTipMmFromBottom: number + touchTipMmFromTop: number } export const getFlowRateAndOffsetParamsMix = (): FlowRateAndOffsetParamsMix => ({ aspirateFlowRateUlSec: ASPIRATE_FLOW_RATE, @@ -94,7 +94,7 @@ export const getFlowRateAndOffsetParamsMix = (): FlowRateAndOffsetParamsMix => ( dispenseOffsetFromBottomMm: DISPENSE_OFFSET_FROM_BOTTOM_MM, blowoutOffsetFromTopMm: BLOWOUT_OFFSET_FROM_TOP_MM, // for mix only - touchTipMmFromBottom: TOUCH_TIP_OFFSET_FROM_BOTTOM_MM, + touchTipMmFromTop: TOUCH_TIP_OFFSET_FROM_TOP_MM, }) type MakeAspDispHelper

= ( bakedParams?: Partial

@@ -251,9 +251,9 @@ const _defaultTouchTipParams = { pipetteId: DEFAULT_PIPETTE, labwareId: SOURCE_LABWARE, wellLocation: { - origin: 'bottom' as const, + origin: 'top' as const, offset: { - z: TOUCH_TIP_OFFSET_FROM_BOTTOM_MM, + z: TOUCH_TIP_OFFSET_FROM_TOP_MM, }, }, } diff --git a/step-generation/src/types.ts b/step-generation/src/types.ts index b4768a678f8..34105529058 100644 --- a/step-generation/src/types.ts +++ b/step-generation/src/types.ts @@ -195,7 +195,7 @@ export type SharedTransferLikeArgs = CommonArgs & { /** Touch tip after every aspirate */ touchTipAfterAspirate: boolean /** Optional offset for touch tip after aspirate (if null, use PD default) */ - touchTipAfterAspirateOffsetMmFromBottom: number + touchTipAfterAspirateOffsetMmFromTop: number /** changeTip is interpreted differently by different Step types */ changeTip: ChangeTipOptions /** Delay after every aspirate */ @@ -219,7 +219,7 @@ export type SharedTransferLikeArgs = CommonArgs & { /** Touch tip in destination well after dispense */ touchTipAfterDispense: boolean /** Optional offset for touch tip after dispense (if null, use PD default) */ - touchTipAfterDispenseOffsetMmFromBottom: number + touchTipAfterDispenseOffsetMmFromTop: number /** Flow rate in uL/sec for all dispenses */ dispenseFlowRateUlSec: number /** offset from bottom of well in mm */ @@ -295,7 +295,7 @@ export type MixArgs = CommonArgs & { times: number /** Touch tip after mixing */ touchTip: boolean - touchTipMmFromBottom: number + touchTipMmFromTop: number /** change tip: see comments in step-generation/mix.js */ changeTip: ChangeTipOptions /** drop tip location entity id */ From 85c4e96d0606ac806a1a32eeb183830b42c6878c Mon Sep 17 00:00:00 2001 From: TamarZanzouri Date: Thu, 30 Jan 2025 13:41:45 -0500 Subject: [PATCH 047/150] fix(api): Over pressure while probing should trigger ER (#17379) --- .../protocol_engine/commands/liquid_probe.py | 71 ++++++++++++++++--- .../commands/test_liquid_probe.py | 4 +- 2 files changed, 64 insertions(+), 11 deletions(-) diff --git a/api/src/opentrons/protocol_engine/commands/liquid_probe.py b/api/src/opentrons/protocol_engine/commands/liquid_probe.py index 419dca03b40..53cc3f77abd 100644 --- a/api/src/opentrons/protocol_engine/commands/liquid_probe.py +++ b/api/src/opentrons/protocol_engine/commands/liquid_probe.py @@ -19,12 +19,14 @@ from opentrons_shared_data.errors.exceptions import ( PipetteLiquidNotFoundError, UnsupportedHardwareCommand, + PipetteOverpressureError, ) from ..types import DeckPoint from .pipetting_common import ( LiquidNotFoundError, PipetteIdMixin, + OverpressureError, ) from .movement_common import ( WellLocationMixin, @@ -43,7 +45,7 @@ from ..errors.error_occurrence import ErrorOccurrence if TYPE_CHECKING: - from ..execution import MovementHandler, PipettingHandler + from ..execution import MovementHandler, PipettingHandler, GantryMover from ..resources import ModelUtils from ..state.state import StateView @@ -99,10 +101,14 @@ class TryLiquidProbeResult(DestinationPositionResult): _LiquidProbeExecuteReturn = Union[ SuccessData[LiquidProbeResult], - DefinedErrorData[LiquidNotFoundError] | DefinedErrorData[StallOrCollisionError], + DefinedErrorData[LiquidNotFoundError] + | DefinedErrorData[StallOrCollisionError] + | DefinedErrorData[OverpressureError], ] _TryLiquidProbeExecuteReturn = ( - SuccessData[TryLiquidProbeResult] | DefinedErrorData[StallOrCollisionError] + SuccessData[TryLiquidProbeResult] + | DefinedErrorData[StallOrCollisionError] + | DefinedErrorData[OverpressureError] ) @@ -110,19 +116,22 @@ class _ExecuteCommonResult(NamedTuple): # If the probe succeeded, the z_pos that it returned. # Or, if the probe found no liquid, the error representing that, # so calling code can propagate those details up. - z_pos_or_error: float | PipetteLiquidNotFoundError + z_pos_or_error: float | PipetteLiquidNotFoundError | PipetteOverpressureError state_update: update_types.StateUpdate deck_point: DeckPoint -async def _execute_common( +async def _execute_common( # noqa: C901 state_view: StateView, movement: MovementHandler, + gantry_mover: GantryMover, pipetting: PipettingHandler, model_utils: ModelUtils, params: _CommonParams, -) -> _ExecuteCommonResult | DefinedErrorData[StallOrCollisionError]: +) -> _ExecuteCommonResult | DefinedErrorData[StallOrCollisionError] | DefinedErrorData[ + OverpressureError +]: pipette_id = params.pipetteId labware_id = params.labwareId well_name = params.wellName @@ -173,6 +182,7 @@ async def _execute_common( if isinstance(move_result, DefinedErrorData): return move_result try: + current_position = await gantry_mover.get_position(params.pipetteId) z_pos = await pipetting.liquid_probe_in_place( pipette_id=pipette_id, labware_id=labware_id, @@ -185,6 +195,33 @@ async def _execute_common( state_update=move_result.state_update, deck_point=move_result.public.position, ) + except PipetteOverpressureError as e: + return DefinedErrorData( + public=OverpressureError( + id=model_utils.generate_id(), + createdAt=model_utils.get_timestamp(), + wrappedErrors=[ + ErrorOccurrence.from_failed( + id=model_utils.generate_id(), + createdAt=model_utils.get_timestamp(), + error=e, + ) + ], + errorInfo=( + { + # This is here bc its not optional in the type but we are not using the retry location for this case + "retryLocation": ( + current_position.x, + current_position.y, + current_position.z, + ) + } + ), + ), + state_update=move_result.state_update.set_fluid_unknown( + pipette_id=pipette_id + ), + ) else: return _ExecuteCommonResult( z_pos_or_error=z_pos, @@ -202,12 +239,14 @@ def __init__( self, state_view: StateView, movement: MovementHandler, + gantry_mover: GantryMover, pipetting: PipettingHandler, model_utils: ModelUtils, **kwargs: object, ) -> None: self._state_view = state_view self._movement = movement + self._gantry_mover = gantry_mover self._pipetting = pipetting self._model_utils = model_utils @@ -230,6 +269,7 @@ async def execute(self, params: _CommonParams) -> _LiquidProbeExecuteReturn: result = await _execute_common( state_view=self._state_view, movement=self._movement, + gantry_mover=self._gantry_mover, pipetting=self._pipetting, model_utils=self._model_utils, params=params, @@ -237,7 +277,9 @@ async def execute(self, params: _CommonParams) -> _LiquidProbeExecuteReturn: if isinstance(result, DefinedErrorData): return result z_pos_or_error, state_update, deck_point = result - if isinstance(z_pos_or_error, PipetteLiquidNotFoundError): + if isinstance( + z_pos_or_error, (PipetteLiquidNotFoundError, PipetteOverpressureError) + ): state_update.set_liquid_probed( labware_id=params.labwareId, well_name=params.wellName, @@ -294,12 +336,14 @@ def __init__( self, state_view: StateView, movement: MovementHandler, + gantry_mover: GantryMover, pipetting: PipettingHandler, model_utils: ModelUtils, **kwargs: object, ) -> None: self._state_view = state_view self._movement = movement + self._gantry_mover = gantry_mover self._pipetting = pipetting self._model_utils = model_utils @@ -313,6 +357,7 @@ async def execute(self, params: _CommonParams) -> _TryLiquidProbeExecuteReturn: result = await _execute_common( state_view=self._state_view, movement=self._movement, + gantry_mover=self._gantry_mover, pipetting=self._pipetting, model_utils=self._model_utils, params=params, @@ -321,7 +366,9 @@ async def execute(self, params: _CommonParams) -> _TryLiquidProbeExecuteReturn: return result z_pos_or_error, state_update, deck_point = result - if isinstance(z_pos_or_error, PipetteLiquidNotFoundError): + if isinstance( + z_pos_or_error, (PipetteLiquidNotFoundError, PipetteOverpressureError) + ): z_pos = None well_volume: float | update_types.ClearType = update_types.CLEAR else: @@ -354,7 +401,7 @@ class LiquidProbe( BaseCommand[ LiquidProbeParams, LiquidProbeResult, - LiquidNotFoundError | StallOrCollisionError, + LiquidNotFoundError | StallOrCollisionError | OverpressureError, ] ): """The model for a full `liquidProbe` command.""" @@ -367,7 +414,11 @@ class LiquidProbe( class TryLiquidProbe( - BaseCommand[TryLiquidProbeParams, TryLiquidProbeResult, StallOrCollisionError] + BaseCommand[ + TryLiquidProbeParams, + TryLiquidProbeResult, + StallOrCollisionError | OverpressureError, + ] ): """The model for a full `tryLiquidProbe` command.""" diff --git a/api/tests/opentrons/protocol_engine/commands/test_liquid_probe.py b/api/tests/opentrons/protocol_engine/commands/test_liquid_probe.py index c9661512aaa..14a269bf300 100644 --- a/api/tests/opentrons/protocol_engine/commands/test_liquid_probe.py +++ b/api/tests/opentrons/protocol_engine/commands/test_liquid_probe.py @@ -49,6 +49,7 @@ from opentrons.protocol_engine.execution import ( MovementHandler, PipettingHandler, + GantryMover, ) from opentrons.protocol_engine.resources.model_utils import ModelUtils @@ -106,6 +107,7 @@ def subject( implementation_type: EitherImplementationType, state_view: StateView, movement: MovementHandler, + gantry_mover: GantryMover, pipetting: PipettingHandler, model_utils: ModelUtils, ) -> Union[LiquidProbeImplementation, TryLiquidProbeImplementation]: @@ -114,6 +116,7 @@ def subject( state_view=state_view, pipetting=pipetting, movement=movement, + gantry_mover=gantry_mover, model_utils=model_utils, ) @@ -317,7 +320,6 @@ async def test_liquid_not_found_error( operation_volume=None, ), ).then_return(position) - decoy.when( await pipetting.liquid_probe_in_place( pipette_id=pipette_id, From 18da73946e917d21f9c150ef34c212cfb91e9255 Mon Sep 17 00:00:00 2001 From: Sarah Breen Date: Thu, 30 Jan 2025 15:52:47 -0500 Subject: [PATCH 048/150] fix(app): App support for new lid commands and fix lid error boundary trigger (#17386) fix EXEC-1042, RABR-712 --- .../en/protocol_command_text.json | 2 + .../hooks/useFailedLabwareUtils.ts | 2 +- .../CommandText/useCommandTextString/index.ts | 2 + .../utils/commandText/getLoadCommandText.ts | 7 +++ shared-data/command/types/setup.ts | 50 ++++++++++++++++++- .../helpers/getAddressableAreasInProtocol.ts | 8 ++- .../getLoadedLabwareDefinitionsByUri.ts | 6 ++- 7 files changed, 72 insertions(+), 5 deletions(-) diff --git a/app/src/assets/localization/en/protocol_command_text.json b/app/src/assets/localization/en/protocol_command_text.json index 8037b8f2778..fa7484e8c88 100644 --- a/app/src/assets/localization/en/protocol_command_text.json +++ b/app/src/assets/localization/en/protocol_command_text.json @@ -38,6 +38,8 @@ "latching_hs_latch": "Latching labware on Heater-Shaker", "left": "Left", "load_labware_to_display_location": "Load {{labware}} {{display_location}}", + "load_lid": "Loading lid", + "load_lid_stack": "Loading lid stack", "load_liquids_info_protocol_setup": "Load {{liquid}} into {{labware}}", "load_module_protocol_setup": "Load {{module}} in Slot {{slot_name}}", "load_pipette_protocol_setup": "Load {{pipette_name}} in {{mount_name}} Mount", diff --git a/app/src/organisms/ErrorRecoveryFlows/hooks/useFailedLabwareUtils.ts b/app/src/organisms/ErrorRecoveryFlows/hooks/useFailedLabwareUtils.ts index c74840ca5b0..c4b4d92a31b 100644 --- a/app/src/organisms/ErrorRecoveryFlows/hooks/useFailedLabwareUtils.ts +++ b/app/src/organisms/ErrorRecoveryFlows/hooks/useFailedLabwareUtils.ts @@ -287,7 +287,7 @@ export function getFailedCmdRelevantLabware( const failedLWURI = runRecord?.data.labware.find( labware => labware.id === recentRelevantFailedLabwareCmd?.params.labwareId )?.definitionUri - if (failedLWURI != null) { + if (failedLWURI != null && Object.keys(lwDefsByURI).includes(failedLWURI)) { return { name: getLabwareDisplayName(lwDefsByURI[failedLWURI]), nickname: labwareNickname, diff --git a/components/src/organisms/CommandText/useCommandTextString/index.ts b/components/src/organisms/CommandText/useCommandTextString/index.ts index 53ff89d170b..01754c0e71e 100644 --- a/components/src/organisms/CommandText/useCommandTextString/index.ts +++ b/components/src/organisms/CommandText/useCommandTextString/index.ts @@ -100,6 +100,8 @@ export function useCommandTextString( case 'loadLabware': case 'reloadLabware': + case 'loadLid': + case 'loadLidStack': case 'loadPipette': case 'loadModule': case 'loadLiquid': diff --git a/components/src/organisms/CommandText/useCommandTextString/utils/commandText/getLoadCommandText.ts b/components/src/organisms/CommandText/useCommandTextString/utils/commandText/getLoadCommandText.ts index e875ce989cb..d0355220f29 100644 --- a/components/src/organisms/CommandText/useCommandTextString/utils/commandText/getLoadCommandText.ts +++ b/components/src/organisms/CommandText/useCommandTextString/utils/commandText/getLoadCommandText.ts @@ -73,6 +73,13 @@ export const getLoadCommandText = ({ display_location: displayLocation, }) } + // TODO(sb, 01/29): Add full support for these commands in run log once location refactor is complete + case 'loadLid': { + return t('load_lid') + } + case 'loadLidStack': { + return t('load_lid_stack') + } case 'reloadLabware': { const { labwareId } = command.params const labware = diff --git a/shared-data/command/types/setup.ts b/shared-data/command/types/setup.ts index 554c7706977..7180abfd6f9 100644 --- a/shared-data/command/types/setup.ts +++ b/shared-data/command/types/setup.ts @@ -29,6 +29,24 @@ export interface LoadLabwareRunTimeCommand LoadLabwareCreateCommand { result?: LoadLabwareResult } +export interface LoadLidCreateCommand extends CommonCommandCreateInfo { + commandType: 'loadLid' + params: LoadLidParams +} +export interface LoadLidRunTimeCommand + extends CommonCommandRunTimeInfo, + LoadLidCreateCommand { + result?: LoadLidResult +} +export interface LoadLidStackCreateCommand extends CommonCommandCreateInfo { + commandType: 'loadLidStack' + params: LoadLidStackParams +} +export interface LoadLidStackRunTimeCommand + extends CommonCommandRunTimeInfo, + LoadLidStackCreateCommand { + result?: LoadLidStackResult +} export interface ReloadLabwareCreateCommand extends CommonCommandCreateInfo { commandType: 'reloadLabware' params: { labwareId: string } @@ -89,6 +107,8 @@ export type SetupRunTimeCommand = | LoadModuleRunTimeCommand | LoadLiquidRunTimeCommand | MoveLabwareRunTimeCommand + | LoadLidRunTimeCommand + | LoadLidStackRunTimeCommand export type SetupCreateCommand = | ConfigureNozzleLayoutCreateCommand @@ -98,6 +118,8 @@ export type SetupCreateCommand = | LoadModuleCreateCommand | LoadLiquidCreateCommand | MoveLabwareCreateCommand + | LoadLidCreateCommand + | LoadLidStackCreateCommand export type LabwareLocation = | 'offDeck' @@ -163,7 +185,6 @@ export interface MoveLabwareParams { interface MoveLabwareResult { offsetId: string } - interface LoadModuleParams { moduleId?: string location: ModuleLocation @@ -203,3 +224,30 @@ export interface ConfigureNozzleLayoutParams { pipetteId: string configurationParams: NozzleConfigurationParams } + +interface LoadLidStackParams { + location: LabwareLocation + loadName: string + namespace: string + version: number + quantity: number +} + +interface LoadLidStackResult { + stackLabwareId: string + labwareIds: string[] + definition: LabwareDefinition2 + location: LabwareLocation +} + +interface LoadLidParams { + location: LabwareLocation + loadName: string + namespace: string + version: number +} + +interface LoadLidResult { + labwareId: string + definition: LabwareDefinition2 +} diff --git a/shared-data/js/helpers/getAddressableAreasInProtocol.ts b/shared-data/js/helpers/getAddressableAreasInProtocol.ts index 9be0a547f40..9b972d0accf 100644 --- a/shared-data/js/helpers/getAddressableAreasInProtocol.ts +++ b/shared-data/js/helpers/getAddressableAreasInProtocol.ts @@ -42,7 +42,9 @@ export function getAddressableAreasInProtocol( ) { return [...acc, params.newLocation.addressableAreaName] } else if ( - commandType === 'loadLabware' && + (commandType === 'loadLabware' || + commandType === 'loadLid' || + commandType === 'loadLidStack') && params.location !== 'offDeck' && params.location !== 'systemLocation' && 'slotName' in params.location && @@ -75,7 +77,9 @@ export function getAddressableAreasInProtocol( return [...acc, ...addressableAreaNames] } else if ( - commandType === 'loadLabware' && + (commandType === 'loadLabware' || + commandType === 'loadLid' || + commandType === 'loadLidStack') && params.location !== 'offDeck' && params.location !== 'systemLocation' && 'addressableAreaName' in params.location && diff --git a/shared-data/js/helpers/getLoadedLabwareDefinitionsByUri.ts b/shared-data/js/helpers/getLoadedLabwareDefinitionsByUri.ts index 120dc760d13..4892569a318 100644 --- a/shared-data/js/helpers/getLoadedLabwareDefinitionsByUri.ts +++ b/shared-data/js/helpers/getLoadedLabwareDefinitionsByUri.ts @@ -9,7 +9,11 @@ export function getLoadedLabwareDefinitionsByUri( commands: RunTimeCommand[] ): LabwareDefinitionsByUri { return commands.reduce((acc, command) => { - if (command.commandType === 'loadLabware') { + if ( + command.commandType === 'loadLabware' || + command.commandType === 'loadLid' || + command.commandType === 'loadLidStack' + ) { const labwareDef: LabwareDefinition2 | undefined = command.result?.definition if (labwareDef == null) { From 253c30095342e3e5bdc0ea65dbd17dd1378d37c5 Mon Sep 17 00:00:00 2001 From: Sanniti Pimpley Date: Thu, 30 Jan 2025 16:51:39 -0500 Subject: [PATCH 049/150] fix(api): use smaller of max pipette volume and max tip volume for splitting large transfer volumes (#17387) # Overview Found a bug in the logic that splits large volume transfers into smaller volumes. Bug is that we only check the transfer volume against max pipette volume. So if you use a 50uL pipette with a 200uL tip, everything works correctly, but if you use a 1000uL pipette with 50uL tip, it attempts to pipette upto 1000uL, instead of clipping to the max tip volume of 50uL. This PR fixes that by taking the smaller of pipette volume and tip volume as the max volume a single transfer can take. ## Risk assessment Low. A scope-limited bug fix --- .../protocol_api/core/engine/instrument.py | 10 ++++-- .../core/engine/test_instrument_core.py | 36 +++++++++++++++++++ .../test_transfer_with_liquid_classes.py | 14 ++++---- 3 files changed, 51 insertions(+), 9 deletions(-) diff --git a/api/src/opentrons/protocol_api/core/engine/instrument.py b/api/src/opentrons/protocol_api/core/engine/instrument.py index 30ace69e63b..d9f0cbdd1d4 100644 --- a/api/src/opentrons/protocol_api/core/engine/instrument.py +++ b/api/src/opentrons/protocol_api/core/engine/instrument.py @@ -1008,7 +1008,12 @@ def transfer_liquid( # noqa: C901 source_dest_per_volume_step = tx_commons.expand_for_volume_constraints( volumes=[volume for _ in range(len(source))], targets=zip(source, dest), - max_volume=self.get_max_volume(), + max_volume=min( + self.get_max_volume(), + tip_racks[0][1] + .get_well_core("A1") + .get_max_volume(), # Assuming all tips in tiprack are of same volume + ), ) def _drop_tip() -> None: @@ -1175,10 +1180,11 @@ def aspirate_liquid_class( Return: List of liquid and air gap pairs in tip. """ aspirate_props = transfer_properties.aspirate + # TODO (spp, 2025-01-30): check if check_valid_volume_parameters is necessary and is enough. tx_commons.check_valid_volume_parameters( disposal_volume=0, # No disposal volume for 1-to-1 transfer air_gap=aspirate_props.retract.air_gap_by_volume.get_for_volume(volume), - max_volume=self.get_max_volume(), + max_volume=self.get_working_volume(), ) source_loc, source_well = source aspirate_point = ( diff --git a/api/tests/opentrons/protocol_api/core/engine/test_instrument_core.py b/api/tests/opentrons/protocol_api/core/engine/test_instrument_core.py index 8ac1ffc1dc8..12e658ab7ae 100644 --- a/api/tests/opentrons/protocol_api/core/engine/test_instrument_core.py +++ b/api/tests/opentrons/protocol_api/core/engine/test_instrument_core.py @@ -1786,6 +1786,42 @@ def test_aspirate_liquid_class( assert result == [LiquidAndAirGapPair(air_gap=222, liquid=111)] +def test_aspirate_liquid_class_raises_for_more_than_max_volume( + decoy: Decoy, + mock_engine_client: EngineClient, + subject: InstrumentCore, + minimal_liquid_class_def2: LiquidClassSchemaV1, + mock_transfer_components_executor: TransferComponentsExecutor, +) -> None: + """It should call aspirate sub-steps execution based on liquid class.""" + source_well = decoy.mock(cls=WellCore) + source_location = Location(Point(1, 2, 3), labware=None) + test_liquid_class = LiquidClass.create(minimal_liquid_class_def2) + test_transfer_properties = test_liquid_class.get_for( + "flex_1channel_50", "opentrons_flex_96_tiprack_50ul" + ) + decoy.when( + mock_engine_client.state.pipettes.get_working_volume("abc123") + ).then_return(100) + decoy.when( + tx_commons.check_valid_volume_parameters( + disposal_volume=0, + air_gap=test_transfer_properties.aspirate.retract.air_gap_by_volume.get_for_volume( + 123 + ), + max_volume=100, + ) + ).then_raise(ValueError("Oh oh!")) + with pytest.raises(ValueError, match="Oh oh!"): + subject.aspirate_liquid_class( + volume=123, + source=(source_location, source_well), + transfer_properties=test_transfer_properties, + transfer_type=TransferType.ONE_TO_ONE, + tip_contents=[], + ) + + def test_dispense_liquid_class( decoy: Decoy, mock_engine_client: EngineClient, diff --git a/api/tests/opentrons/protocol_api_integration/test_transfer_with_liquid_classes.py b/api/tests/opentrons/protocol_api_integration/test_transfer_with_liquid_classes.py index ba3d3facd6a..6fe2474cfba 100644 --- a/api/tests/opentrons/protocol_api_integration/test_transfer_with_liquid_classes.py +++ b/api/tests/opentrons/protocol_api_integration/test_transfer_with_liquid_classes.py @@ -27,8 +27,8 @@ def test_water_transfer_with_volume_more_than_tip_max( tiprack = simulated_protocol_context.load_labware( "opentrons_flex_96_tiprack_50ul", "D1" ) - pipette_50 = simulated_protocol_context.load_instrument( - "flex_1channel_50", mount="left", tip_racks=[tiprack] + pipette_1k = simulated_protocol_context.load_instrument( + "flex_1channel_1000", mount="left", tip_racks=[tiprack] ) nest_plate = simulated_protocol_context.load_labware( "nest_96_wellplate_200ul_flat", "C3" @@ -47,7 +47,7 @@ def test_water_transfer_with_volume_more_than_tip_max( mock_manager = mock.Mock() mock_manager.attach_mock(patched_pick_up_tip, "pick_up_tip") - pipette_50.transfer_liquid( + pipette_1k.transfer_liquid( liquid_class=water, volume=60, source=nest_plate.rows()[0], @@ -58,7 +58,7 @@ def test_water_transfer_with_volume_more_than_tip_max( assert patched_pick_up_tip.call_count == 24 patched_pick_up_tip.reset_mock() - pipette_50.transfer_liquid( + pipette_1k.transfer_liquid( liquid_class=water, volume=100, source=nest_plate.rows()[0], @@ -69,8 +69,8 @@ def test_water_transfer_with_volume_more_than_tip_max( assert patched_pick_up_tip.call_count == 12 patched_pick_up_tip.reset_mock() - pipette_50.pick_up_tip() - pipette_50.transfer_liquid( + pipette_1k.pick_up_tip() + pipette_1k.transfer_liquid( liquid_class=water, volume=50, source=nest_plate.rows()[0], @@ -78,7 +78,7 @@ def test_water_transfer_with_volume_more_than_tip_max( new_tip="never", trash_location=trash, ) - pipette_50.drop_tip() + pipette_1k.drop_tip() assert patched_pick_up_tip.call_count == 1 From a79e873ff55fd2304524e0cf60c25f596f73b82f Mon Sep 17 00:00:00 2001 From: David Chau <46395074+ddcc4@users.noreply.github.com> Date: Thu, 30 Jan 2025 16:57:54 -0500 Subject: [PATCH 050/150] feat(protocol-designer): add python field to commands and timeline (#17383) # Overview This starts the plumbing for Python generation from Protocol Designer. AUTH-1385 We're adding a field for Python code to each command (`CommandsAndWarnings`) and to each entry of the timeline (`CommandsAndRobotState`). And in the reducer, we concatenate the Python commands together, analogously to how we concatenate the JSON commands together. ## Test Plan and Hands on Testing I added unit tests to show that the Python code concatenation works, and that the Python code gets copied from the CommandCreators to the Timeline. The tests also demonstrate that the changes do NOT affect the behavior of existing commands that don't generate Python. I've also done hands-on testing in a private experimental branch that has a more complete implementation of Python generation. ## Review requests My first time making a functional change to PD, let me know if I'm overlooking anything. ## Risk assessment Low. Should not cause any observable change to PD's behavior. --- step-generation/src/__tests__/glue.test.ts | 74 +++++++++++++++++++ step-generation/src/types.ts | 2 + .../src/utils/commandCreatorsTimeline.ts | 1 + .../src/utils/reduceCommandCreators.ts | 7 ++ 4 files changed, 84 insertions(+) diff --git a/step-generation/src/__tests__/glue.test.ts b/step-generation/src/__tests__/glue.test.ts index b5e651d3e16..8524053cb43 100644 --- a/step-generation/src/__tests__/glue.test.ts +++ b/step-generation/src/__tests__/glue.test.ts @@ -93,6 +93,30 @@ const divideCreator: any = ( } } +const pythonHelloWorldCreator: any = ( + params: CountParams, + invariantContext: InvariantContext, + prevState: CountState +) => { + return { + commands: [], + warnings: [], + python: 'print("Hello world")', + } +} + +const pythonGoodbyeWorldCreator: any = ( + params: CountParams, + invariantContext: InvariantContext, + prevState: CountState +) => { + return { + commands: [], + warnings: [], + python: 'print("Goodbye world")', + } +} + function mockNextRobotStateAndWarningsSingleCommand( command: CountCommand, invariantContext: any, @@ -177,6 +201,9 @@ describe('reduceCommandCreators', () => { { command: 'multiply', params: { value: 2 } }, ], warnings: [], + // Note no `python` field here. + // Existing CommandCreators that don't emit Python should behave exactly the same as before. + // This test makes sure we do NOT produce results like `python:'undefined'` or `python:''` or `python:'\n'`. }) }) @@ -226,6 +253,43 @@ describe('reduceCommandCreators', () => { ], }) }) + + it('Python commands are joined together', () => { + const initialState: any = {} + const result: any = reduceCommandCreators( + [ + curryCommandCreator(pythonHelloWorldCreator, {}), + curryCommandCreator(pythonGoodbyeWorldCreator, {}), + ], + invariantContext, + initialState + ) + + expect(result).toEqual({ + commands: [], + warnings: [], + python: 'print("Hello world")\nprint("Goodbye world")', + }) + }) + + it('Python commands mixed with non-Python commands', () => { + const initialState: any = {} + const result: any = reduceCommandCreators( + [ + curryCommandCreator(addCreator, { value: 1 }), + curryCommandCreator(pythonHelloWorldCreator, {}), + ], + invariantContext, + initialState + ) + + expect(result).toEqual({ + commands: [{ command: 'add', params: { value: 1 } }], + warnings: [], + python: 'print("Hello world")', + // should only get 1 line of Python with no stray newlines or `undefined`s. + }) + }) }) describe('commandCreatorsTimeline', () => { @@ -236,6 +300,7 @@ describe('commandCreatorsTimeline', () => { curryCommandCreator(addCreatorWithWarning, { value: 4 }), curryCommandCreator(divideCreator, { value: 0 }), curryCommandCreator(multiplyCreator, { value: 3 }), + curryCommandCreator(pythonHelloWorldCreator, {}), ], invariantContext, initialState @@ -263,6 +328,7 @@ describe('commandCreatorsTimeline', () => { ], }, // no more steps in the timeline, stopped by error + // python output is suppressed too ], }) }) @@ -275,6 +341,7 @@ describe('commandCreatorsTimeline', () => { curryCommandCreator(addCreatorWithWarning, { value: 3 }), curryCommandCreator(multiplyCreator, { value: 2 }), curryCommandCreator(addCreatorWithWarning, { value: 1 }), + curryCommandCreator(pythonHelloWorldCreator, {}), ], invariantContext, initialState @@ -309,6 +376,13 @@ describe('commandCreatorsTimeline', () => { }, ], }, + // Python hello world + { + robotState: { count: 17 }, + commands: [], + warnings: [], + python: 'print("Hello world")', + }, ]) }) }) diff --git a/step-generation/src/types.ts b/step-generation/src/types.ts index 34105529058..95adcbee5a8 100644 --- a/step-generation/src/types.ts +++ b/step-generation/src/types.ts @@ -619,6 +619,7 @@ export interface CommandsAndRobotState { commands: CreateCommand[] robotState: RobotState warnings?: CommandCreatorWarning[] + python?: string } export interface CommandCreatorErrorResponse { @@ -629,6 +630,7 @@ export interface CommandCreatorErrorResponse { export interface CommandsAndWarnings { commands: CreateCommand[] warnings?: CommandCreatorWarning[] + python?: string } export type CommandCreatorResult = | CommandsAndWarnings diff --git a/step-generation/src/utils/commandCreatorsTimeline.ts b/step-generation/src/utils/commandCreatorsTimeline.ts index 878368e6a25..c5728a754ae 100644 --- a/step-generation/src/utils/commandCreatorsTimeline.ts +++ b/step-generation/src/utils/commandCreatorsTimeline.ts @@ -53,6 +53,7 @@ export const commandCreatorsTimeline = ( commands: commandCreatorResult.commands, robotState: nextRobotStateAndWarnings.robotState, warnings: commandCreatorResult.warnings, + python: commandCreatorResult.python, } return { timeline: [...acc.timeline, nextResult], diff --git a/step-generation/src/utils/reduceCommandCreators.ts b/step-generation/src/utils/reduceCommandCreators.ts index 03a5814b46d..68d8c227ccc 100644 --- a/step-generation/src/utils/reduceCommandCreators.ts +++ b/step-generation/src/utils/reduceCommandCreators.ts @@ -13,6 +13,7 @@ interface CCReducerAcc { commands: CreateCommand[] errors: CommandCreatorError[] warnings: CommandCreatorWarning[] + python?: string } export const reduceCommandCreators = ( commandCreators: CurriedCommandCreator[], @@ -36,6 +37,10 @@ export const reduceCommandCreators = ( } } const allCommands = [...prev.commands, ...next.commands] + const allPython = [ + ...(prev.python ? [prev.python] : []), + ...(next.python ? [next.python] : []), + ].join('\n') const updates = getNextRobotStateAndWarnings( next.commands, invariantContext, @@ -50,6 +55,7 @@ export const reduceCommandCreators = ( ...(next.warnings || []), ...updates.warnings, ], + ...(allPython && { python: allPython }), } }, { @@ -69,5 +75,6 @@ export const reduceCommandCreators = ( return { commands: result.commands, warnings: result.warnings, + ...(result.python && { python: result.python }), } } From 3c2379302a3d4c4f24c2e342a22029866a2e68db Mon Sep 17 00:00:00 2001 From: Sanniti Pimpley Date: Thu, 30 Jan 2025 17:18:39 -0500 Subject: [PATCH 051/150] feat(api): fix InstrumentContext.name for Flex and update LiquidClass.get_for() (#17289) Closes AUTH-1295, AUTH-1299 # Overview - fixes `InstrumentContext.name` to fetch the python API load name of flex pipettes - updates `LiquidClass.get_for()` to accept the a loaded instrument object and loaded tiprack object for `pipette` and `tip_rack` args respectively. - changes the tiprack argument name of `get_for()` from `tiprack` to `tip_rack` to be consistent with API naming conventions. ## Risk assessment None --------- Co-authored-by: Max Marrone --- api/release-notes-internal.md | 4 ++ api/src/opentrons/protocol_api/_liquid.py | 39 +++++++++++--- .../protocol_api/core/engine/instrument.py | 52 +++++++++--------- .../protocol_api/instrument_context.py | 5 ++ .../protocols/api_support/instrument.py | 15 +++++- .../core/engine/test_instrument_core.py | 54 +++++++++++++++---- .../test_transfer_components_executor.py | 2 +- .../protocol_api/test_liquid_class.py | 12 +++++ .../protocol_api/test_protocol_context.py | 1 + .../test_liquid_classes.py | 7 +-- 10 files changed, 140 insertions(+), 51 deletions(-) diff --git a/api/release-notes-internal.md b/api/release-notes-internal.md index 7fb93059e15..1186b510eb6 100644 --- a/api/release-notes-internal.md +++ b/api/release-notes-internal.md @@ -11,6 +11,10 @@ This internal release, pulled from the `edge` branch, contains features being de - Python API version bumped to 2.23 - Added liquid classes and new transfer functions +### Bug Fixes In This Release (list in progress): +- Fixed `InstrumentContext.name` so that it returns the correct API-specific names of Flex pipettes. + + ## Internal Release 2.3.0-alpha.2 This internal release, pulled from the `edge` branch, contains features being developed for 8.3.0. It's for internal testing only. diff --git a/api/src/opentrons/protocol_api/_liquid.py b/api/src/opentrons/protocol_api/_liquid.py index 12c9a140ce3..fa979428eb2 100644 --- a/api/src/opentrons/protocol_api/_liquid.py +++ b/api/src/opentrons/protocol_api/_liquid.py @@ -1,7 +1,7 @@ from __future__ import annotations from dataclasses import dataclass -from typing import Optional, Dict +from typing import Optional, Dict, Union, TYPE_CHECKING from opentrons_shared_data.liquid_classes.liquid_class_definition import ( LiquidClassSchemaV1, @@ -12,6 +12,9 @@ build_transfer_properties, ) +if TYPE_CHECKING: + from . import InstrumentContext, Labware + @dataclass(frozen=True) class Liquid: @@ -64,18 +67,42 @@ def name(self) -> str: def display_name(self) -> str: return self._display_name - def get_for(self, pipette: str, tiprack: str) -> TransferProperties: + def get_for( + self, pipette: Union[str, InstrumentContext], tip_rack: Union[str, Labware] + ) -> TransferProperties: """Get liquid class transfer properties for the specified pipette and tip.""" + from . import InstrumentContext, Labware + + if isinstance(pipette, InstrumentContext): + pipette_name = pipette.name + elif isinstance(pipette, str): + pipette_name = pipette + else: + raise ValueError( + f"{pipette} should either be an InstrumentContext object" + f" or a pipette name string." + ) + + if isinstance(tip_rack, Labware): + tiprack_uri = tip_rack.uri + elif isinstance(tip_rack, str): + tiprack_uri = tip_rack + else: + raise ValueError( + f"{tip_rack} should either be a tiprack Labware object" + f" or a tiprack URI string." + ) + try: - settings_for_pipette = self._by_pipette_setting[pipette] + settings_for_pipette = self._by_pipette_setting[pipette_name] except KeyError: raise ValueError( - f"No properties found for {pipette} in {self._name} liquid class" + f"No properties found for {pipette_name} in {self._name} liquid class" ) try: - transfer_properties = settings_for_pipette[tiprack] + transfer_properties = settings_for_pipette[tiprack_uri] except KeyError: raise ValueError( - f"No properties found for {tiprack} in {self._name} liquid class" + f"No properties found for {tiprack_uri} in {self._name} liquid class" ) return transfer_properties diff --git a/api/src/opentrons/protocol_api/core/engine/instrument.py b/api/src/opentrons/protocol_api/core/engine/instrument.py index d9f0cbdd1d4..d1898e5ccaa 100644 --- a/api/src/opentrons/protocol_api/core/engine/instrument.py +++ b/api/src/opentrons/protocol_api/core/engine/instrument.py @@ -42,7 +42,7 @@ from opentrons.protocol_engine.errors.exceptions import TipNotAttachedError from opentrons.protocol_engine.clients import SyncClient as EngineClient from opentrons.protocols.api_support.definitions import MAX_SUPPORTED_VERSION -from opentrons_shared_data.pipette.types import PipetteNameType, PIPETTE_API_NAMES_MAP +from opentrons_shared_data.pipette.types import PIPETTE_API_NAMES_MAP from opentrons_shared_data.errors.exceptions import ( UnsupportedHardwareCommand, ) @@ -62,6 +62,9 @@ _DISPENSE_VOLUME_VALIDATION_ADDED_IN = APIVersion(2, 17) +_FLEX_PIPETTE_NAMES_FIXED_IN = APIVersion(2, 23) +"""The version after which InstrumentContext.name returns the correct API-specific names of Flex pipettes.""" + class InstrumentCore(AbstractInstrument[WellCore, LabwareCore]): """Instrument API core using a ProtocolEngine. @@ -721,33 +724,29 @@ def get_pipette_name(self) -> str: Will match the load name of the actually loaded pipette, which may differ from the requested load name. - """ - # TODO (tz, 11-23-22): revert this change when merging - # https://opentrons.atlassian.net/browse/RLIQ-251 - pipette = self._engine_client.state.pipettes.get(self._pipette_id) - return ( - pipette.pipetteName.value - if isinstance(pipette.pipetteName, PipetteNameType) - else pipette.pipetteName - ) - def get_load_name(self) -> str: - """Get the pipette's requested API load name. + From API v2.15 to v2.22, this property returned an internal, engine-specific, + name for Flex pipettes (eg, "p50_multi_flex" instead of "flex_8channel_50"). - This is the load name that is specified in the `ProtocolContext.load_instrument()` - method. This name might differ from the engine-specific pipette name. + From API v2.23 onwards, this behavior is fixed so that this property returns + the API-specific names of Flex pipettes. """ + # TODO (tz, 11-23-22): revert this change when merging + # https://opentrons.atlassian.net/browse/RLIQ-251 pipette = self._engine_client.state.pipettes.get(self._pipette_id) - load_name = next( - ( - pip_api_name - for pip_api_name, pip_name in PIPETTE_API_NAMES_MAP.items() - if pip_name == pipette.pipetteName - ), - None, - ) - assert load_name, "Load name not found." - return load_name + if self._protocol_core.api_version < _FLEX_PIPETTE_NAMES_FIXED_IN: + return pipette.pipetteName.value + else: + name = next( + ( + pip_api_name + for pip_api_name, pip_name in PIPETTE_API_NAMES_MAP.items() + if pip_name == pipette.pipetteName + ), + None, + ) + assert name, "Pipette name not found." + return name def get_model(self) -> str: return self._engine_client.state.pipettes.get_model_name(self._pipette_id) @@ -932,7 +931,7 @@ def load_liquid_class( """ liquid_class_record = LiquidClassRecord( liquidClassName=name, - pipetteModel=self.get_load_name(), + pipetteModel=self.get_pipette_name(), tiprack=tiprack_uri, aspirate=transfer_properties.aspirate.as_shared_data_model(), singleDispense=transfer_properties.dispense.as_shared_data_model(), @@ -994,8 +993,7 @@ def transfer_liquid( # noqa: C901 ) tiprack_uri_for_transfer_props = tip_racks[0][1].get_uri() transfer_props = liquid_class.get_for( - pipette=self.get_load_name(), - tiprack=tiprack_uri_for_transfer_props, + pipette=self.get_pipette_name(), tip_rack=tiprack_uri_for_transfer_props ) # TODO: use the ID returned by load_liquid_class in command annotations self.load_liquid_class( diff --git a/api/src/opentrons/protocol_api/instrument_context.py b/api/src/opentrons/protocol_api/instrument_context.py index 6bd93f27970..992aa68c785 100644 --- a/api/src/opentrons/protocol_api/instrument_context.py +++ b/api/src/opentrons/protocol_api/instrument_context.py @@ -64,6 +64,7 @@ _AIR_GAP_TRACKING_ADDED_IN = APIVersion(2, 22) """The version after which air gaps should be implemented with a separate call instead of an aspirate for better liquid volume tracking.""" + AdvancedLiquidHandling = v1_transfer.AdvancedLiquidHandling @@ -2004,6 +2005,10 @@ def trash_container( def name(self) -> str: """ The name string for the pipette (e.g., ``"p300_single"``). + + From API v2.15 to v2.22, this property returned an internal name for Flex pipettes. + From API v2.23 onwards, this behavior is fixed so that this property returns + the Python Protocol API load names of Flex pipettes. """ return self._core.get_pipette_name() diff --git a/api/src/opentrons/protocols/api_support/instrument.py b/api/src/opentrons/protocols/api_support/instrument.py index 3299b8512f9..35625100645 100644 --- a/api/src/opentrons/protocols/api_support/instrument.py +++ b/api/src/opentrons/protocols/api_support/instrument.py @@ -99,7 +99,20 @@ def validate_tiprack( gen_lookup = ( "FLEX" if ("flex" in instr_metadata or "96" in instr_metadata) else "OT2" ) - valid_vols = VALID_PIP_TIPRACK_VOL[gen_lookup][instrument_name.split("_")[0]] + + # TODO (spp, 2025-01-30): do what AA's note above says or at least, + # fetch the 'pip_type' below from the 'model' field in pipette definitions + # so that we don't have to figure it out from pipette names + if instrument_name.split("_")[0] == "flex": + # Flex's API load names have the format 'flex_1channel_1000' + # From API v2.23 on, this is the name returned by InstrumentContext.name + pip_type = "p" + instrument_name.split("_")[2] + else: + # Until API v2.23, InstrumentContext.name returned the engine-specific names + # of Flex pipettes. These names, as well as OT2 pipette names, + # have the format- 'p1000_single_gen2' or 'p1000_single_flex' + pip_type = instrument_name.split("_")[0] + valid_vols = VALID_PIP_TIPRACK_VOL[gen_lookup][pip_type] if tiprack_vol not in valid_vols: log.warning( f"The pipette {instrument_name} and its tip rack {tip_rack.load_name}" diff --git a/api/tests/opentrons/protocol_api/core/engine/test_instrument_core.py b/api/tests/opentrons/protocol_api/core/engine/test_instrument_core.py index 12e658ab7ae..c7e5fa904e0 100644 --- a/api/tests/opentrons/protocol_api/core/engine/test_instrument_core.py +++ b/api/tests/opentrons/protocol_api/core/engine/test_instrument_core.py @@ -187,32 +187,60 @@ def test_pipette_id(subject: InstrumentCore) -> None: assert subject.pipette_id == "abc123" -def test_get_pipette_name( - decoy: Decoy, mock_engine_client: EngineClient, subject: InstrumentCore +@pytest.mark.parametrize( + "version", + [ + APIVersion(2, 15), + APIVersion(2, 17), + APIVersion(2, 20), + APIVersion(2, 22), + ], +) +def test_get_pipette_name_old( + decoy: Decoy, + mock_engine_client: EngineClient, + mock_protocol_core: ProtocolCore, + subject: InstrumentCore, + version: APIVersion, ) -> None: """It should get the pipette's load name.""" + decoy.when(mock_protocol_core.api_version).then_return(version) decoy.when(mock_engine_client.state.pipettes.get("abc123")).then_return( LoadedPipette.model_construct(pipetteName=PipetteNameType.P300_SINGLE) # type: ignore[call-arg] ) - - result = subject.get_pipette_name() - - assert result == "p300_single" + assert subject.get_pipette_name() == "p300_single" + decoy.when(mock_engine_client.state.pipettes.get("abc123")).then_return( + LoadedPipette.model_construct(pipetteName=PipetteNameType.P1000_96) # type: ignore[call-arg] + ) + assert subject.get_pipette_name() == "p1000_96" + decoy.when(mock_engine_client.state.pipettes.get("abc123")).then_return( + LoadedPipette.model_construct(pipetteName=PipetteNameType.P50_SINGLE_FLEX) # type: ignore[call-arg] + ) + assert subject.get_pipette_name() == "p50_single_flex" -def test_get_pipette_load_name( - decoy: Decoy, mock_engine_client: EngineClient, subject: InstrumentCore +@pytest.mark.parametrize("version", versions_at_or_above(APIVersion(2, 23))) +def test_get_pipette_name_new( + decoy: Decoy, + mock_engine_client: EngineClient, + mock_protocol_core: ProtocolCore, + subject: InstrumentCore, + version: APIVersion, ) -> None: """It should get the pipette's API-specific load name.""" + decoy.when(mock_protocol_core.api_version).then_return(version) decoy.when(mock_engine_client.state.pipettes.get("abc123")).then_return( LoadedPipette.model_construct(pipetteName=PipetteNameType.P300_SINGLE) # type: ignore[call-arg] ) - assert subject.get_load_name() == "p300_single" - + assert subject.get_pipette_name() == "p300_single" decoy.when(mock_engine_client.state.pipettes.get("abc123")).then_return( LoadedPipette.model_construct(pipetteName=PipetteNameType.P1000_96) # type: ignore[call-arg] ) - assert subject.get_load_name() == "flex_96channel_1000" + assert subject.get_pipette_name() == "flex_96channel_1000" + decoy.when(mock_engine_client.state.pipettes.get("abc123")).then_return( + LoadedPipette.model_construct(pipetteName=PipetteNameType.P50_SINGLE_FLEX) # type: ignore[call-arg] + ) + assert subject.get_pipette_name() == "flex_1channel_50" def test_get_mount( @@ -1671,11 +1699,14 @@ def test_liquid_probe_with_recovery( ) +@pytest.mark.parametrize("version", versions_at_or_above(APIVersion(2, 23))) def test_load_liquid_class( decoy: Decoy, mock_engine_client: EngineClient, + mock_protocol_core: ProtocolCore, subject: InstrumentCore, minimal_liquid_class_def2: LiquidClassSchemaV1, + version: APIVersion, ) -> None: """It should send the load liquid class command to the engine.""" sample_aspirate_data = minimal_liquid_class_def2.byPipette[0].byTipType[0].aspirate @@ -1686,6 +1717,7 @@ def test_load_liquid_class( minimal_liquid_class_def2.byPipette[0].byTipType[0].multiDispense ) + decoy.when(mock_protocol_core.api_version).then_return(version) test_liq_class = decoy.mock(cls=LiquidClass) test_transfer_props = decoy.mock(cls=TransferProperties) diff --git a/api/tests/opentrons/protocol_api/core/engine/test_transfer_components_executor.py b/api/tests/opentrons/protocol_api/core/engine/test_transfer_components_executor.py index 4dadf5b503b..b58b873523c 100644 --- a/api/tests/opentrons/protocol_api/core/engine/test_transfer_components_executor.py +++ b/api/tests/opentrons/protocol_api/core/engine/test_transfer_components_executor.py @@ -36,7 +36,7 @@ def sample_transfer_props( ) -> TransferProperties: """Return a mocked out liquid class fixture.""" return LiquidClass.create(maximal_liquid_class_def).get_for( - pipette="flex_1channel_50", tiprack="opentrons_flex_96_tiprack_50ul" + pipette="flex_1channel_50", tip_rack="opentrons_flex_96_tiprack_50ul" ) diff --git a/api/tests/opentrons/protocol_api/test_liquid_class.py b/api/tests/opentrons/protocol_api/test_liquid_class.py index 7118080eda0..47404c2b480 100644 --- a/api/tests/opentrons/protocol_api/test_liquid_class.py +++ b/api/tests/opentrons/protocol_api/test_liquid_class.py @@ -1,10 +1,12 @@ """Tests for LiquidClass methods.""" import pytest +from decoy import Decoy from opentrons_shared_data.liquid_classes.liquid_class_definition import ( LiquidClassSchemaV1, ) from opentrons.protocol_api import LiquidClass +from opentrons.protocol_api import InstrumentContext, Labware def test_create_liquid_class( @@ -17,6 +19,7 @@ def test_create_liquid_class( def test_get_for_pipette_and_tip( + decoy: Decoy, minimal_liquid_class_def2: LiquidClassSchemaV1, ) -> None: """It should get the properties for the specified pipette and tip.""" @@ -26,6 +29,15 @@ def test_get_for_pipette_and_tip( 10.0: 40.0, 20.0: 30.0, } + mock_instrument = decoy.mock(cls=InstrumentContext) + mock_tiprack = decoy.mock(cls=Labware) + decoy.when(mock_instrument.name).then_return("flex_1channel_50") + decoy.when(mock_tiprack.uri).then_return("opentrons_flex_96_tiprack_50ul") + result_2 = liq_class.get_for(mock_instrument, mock_tiprack) + assert result_2.aspirate.flow_rate_by_volume.as_dict() == { + 10.0: 40.0, + 20.0: 30.0, + } def test_get_for_raises_for_incorrect_pipette_or_tip( diff --git a/api/tests/opentrons/protocol_api/test_protocol_context.py b/api/tests/opentrons/protocol_api/test_protocol_context.py index ebe6734a539..4536003094a 100644 --- a/api/tests/opentrons/protocol_api/test_protocol_context.py +++ b/api/tests/opentrons/protocol_api/test_protocol_context.py @@ -283,6 +283,7 @@ def test_load_instrument( ).then_return(mock_instrument_core) decoy.when(mock_instrument_core.get_pipette_name()).then_return("Gandalf the Grey") + decoy.when(mock_instrument_core.get_model()).then_return("wizard") decoy.when(mock_core.get_disposal_locations()).then_raise( NoTrashDefinedError("No trash!") ) diff --git a/api/tests/opentrons/protocol_api_integration/test_liquid_classes.py b/api/tests/opentrons/protocol_api_integration/test_liquid_classes.py index 83b53f01e1a..cf7791a271a 100644 --- a/api/tests/opentrons/protocol_api_integration/test_liquid_classes.py +++ b/api/tests/opentrons/protocol_api_integration/test_liquid_classes.py @@ -13,7 +13,7 @@ def test_liquid_class_creation_and_property_fetching( ) -> None: """It should create the liquid class and provide access to its properties.""" pipette_load_name = "flex_8channel_50" - simulated_protocol_context.load_instrument(pipette_load_name, mount="left") + p50 = simulated_protocol_context.load_instrument(pipette_load_name, mount="left") tiprack = simulated_protocol_context.load_labware( "opentrons_flex_96_tiprack_50ul", "D1" ) @@ -24,10 +24,7 @@ def test_liquid_class_creation_and_property_fetching( # TODO (spp, 2024-10-17): update this to fetch pipette load name from instrument context assert ( - water.get_for( - pipette_load_name, tiprack.uri - ).dispense.flow_rate_by_volume.get_for_volume(1) - == 50 + water.get_for(p50, tiprack).dispense.flow_rate_by_volume.get_for_volume(1) == 50 ) assert water.get_for(pipette_load_name, tiprack.uri).aspirate.submerge.speed == 100 From 3d78c1f4fff687ac2363739a4804423d48319c5b Mon Sep 17 00:00:00 2001 From: CaseyBatten Date: Thu, 30 Jan 2025 17:33:58 -0500 Subject: [PATCH 052/150] feat(api): Addition of Evotip specific commands (#17351) Covers EXEC-907 Introduces Evotip (or resin-tip) specific commands to the instrument context. These commands achieve the desired sealing, pressurization and unsealing steps for a resin tip protocol. --- api/src/opentrons/hardware_control/api.py | 6 +- api/src/opentrons/hardware_control/ot3api.py | 26 +- .../protocols/liquid_handler.py | 5 +- .../protocols/motion_controller.py | 1 + api/src/opentrons/legacy_commands/commands.py | 37 ++ api/src/opentrons/legacy_commands/types.py | 39 +++ .../protocol_api/core/engine/instrument.py | 109 ++++++ .../opentrons/protocol_api/core/instrument.py | 27 ++ .../core/legacy/legacy_instrument_core.py | 50 +++ .../legacy_instrument_core.py | 24 ++ .../protocol_api/instrument_context.py | 141 ++++++++ .../protocol_engine/commands/__init__.py | 40 +++ .../commands/command_unions.py | 39 +++ .../commands/evotip_dispense.py | 156 +++++++++ .../commands/evotip_seal_pipette.py | 331 ++++++++++++++++++ .../commands/evotip_unseal_pipette.py | 160 +++++++++ .../protocol_engine/errors/__init__.py | 2 + .../protocol_engine/errors/exceptions.py | 13 + .../protocol_engine/execution/gantry_mover.py | 5 + .../protocol_engine/execution/tip_handler.py | 39 ++- .../resources/labware_validation.py | 5 + .../protocol_engine/state/pipettes.py | 5 + .../hardware_control/test_ot3_api.py | 8 +- .../commands/test_evotip_dispense.py | 133 +++++++ .../commands/test_evotip_seal_pipette.py | 300 ++++++++++++++++ .../commands/test_evotip_unseal_pipette.py | 330 +++++++++++++++++ .../execution/test_gantry_mover.py | 4 +- .../execution/test_tip_handler.py | 4 +- .../gripper_assembly_qc_ot3/test_mount.py | 4 +- .../robot_assembly_qc_ot3/test_instruments.py | 4 +- .../production_qc/z_stage_qc_ot3.py | 2 +- shared-data/command/schemas/11.json | 226 ++++++++++++ .../3/evotips_opentrons_96_labware/1.json | 14 + 33 files changed, 2260 insertions(+), 29 deletions(-) create mode 100644 api/src/opentrons/protocol_engine/commands/evotip_dispense.py create mode 100644 api/src/opentrons/protocol_engine/commands/evotip_seal_pipette.py create mode 100644 api/src/opentrons/protocol_engine/commands/evotip_unseal_pipette.py create mode 100644 api/tests/opentrons/protocol_engine/commands/test_evotip_dispense.py create mode 100644 api/tests/opentrons/protocol_engine/commands/test_evotip_seal_pipette.py create mode 100644 api/tests/opentrons/protocol_engine/commands/test_evotip_unseal_pipette.py diff --git a/api/src/opentrons/hardware_control/api.py b/api/src/opentrons/hardware_control/api.py index c52fae64131..175c89dda7e 100644 --- a/api/src/opentrons/hardware_control/api.py +++ b/api/src/opentrons/hardware_control/api.py @@ -778,6 +778,7 @@ async def move_axes( position: Mapping[Axis, float], speed: Optional[float] = None, max_speeds: Optional[Dict[Axis, float]] = None, + expect_stalls: bool = False, ) -> None: """Moves the effectors of the specified axis to the specified position. The effector of the x,y axis is the center of the carriage. @@ -1248,7 +1249,10 @@ async def pick_up_tip( await self.prepare_for_aspirate(mount) async def tip_drop_moves( - self, mount: top_types.Mount, home_after: bool = True + self, + mount: top_types.Mount, + home_after: bool = True, + ignore_plunger: bool = False, ) -> None: spec, _ = self.plan_check_drop_tip(mount, home_after) diff --git a/api/src/opentrons/hardware_control/ot3api.py b/api/src/opentrons/hardware_control/ot3api.py index 6295757e7ab..038843e23ac 100644 --- a/api/src/opentrons/hardware_control/ot3api.py +++ b/api/src/opentrons/hardware_control/ot3api.py @@ -1189,7 +1189,7 @@ async def move_to( speed: Optional[float] = None, critical_point: Optional[CriticalPoint] = None, max_speeds: Union[None, Dict[Axis, float], OT3AxisMap[float]] = None, - _expect_stalls: bool = False, + expect_stalls: bool = False, ) -> None: """Move the critical point of the specified mount to a location relative to the deck, at the specified speed.""" @@ -1233,7 +1233,7 @@ async def move_to( target_position, speed=speed, max_speeds=checked_max, - expect_stalls=_expect_stalls, + expect_stalls=expect_stalls, ) async def move_axes( # noqa: C901 @@ -1241,6 +1241,7 @@ async def move_axes( # noqa: C901 position: Mapping[Axis, float], speed: Optional[float] = None, max_speeds: Optional[Dict[Axis, float]] = None, + expect_stalls: bool = False, ) -> None: """Moves the effectors of the specified axis to the specified position. The effector of the x,y axis is the center of the carriage. @@ -1296,7 +1297,11 @@ async def move_axes( # noqa: C901 if axis not in absolute_positions: absolute_positions[axis] = position_value - await self._move(target_position=absolute_positions, speed=speed) + await self._move( + target_position=absolute_positions, + speed=speed, + expect_stalls=expect_stalls, + ) async def move_rel( self, @@ -1306,7 +1311,7 @@ async def move_rel( max_speeds: Union[None, Dict[Axis, float], OT3AxisMap[float]] = None, check_bounds: MotionChecks = MotionChecks.NONE, fail_on_not_homed: bool = False, - _expect_stalls: bool = False, + expect_stalls: bool = False, ) -> None: """Move the critical point of the specified mount by a specified displacement in a specified direction, at the specified speed.""" @@ -1348,7 +1353,7 @@ async def move_rel( speed=speed, max_speeds=checked_max, check_bounds=check_bounds, - expect_stalls=_expect_stalls, + expect_stalls=expect_stalls, ) async def _cache_and_maybe_retract_mount(self, mount: OT3Mount) -> None: @@ -2320,11 +2325,16 @@ def set_working_volume( instrument.working_volume = tip_volume async def tip_drop_moves( - self, mount: Union[top_types.Mount, OT3Mount], home_after: bool = False + self, + mount: Union[top_types.Mount, OT3Mount], + home_after: bool = False, + ignore_plunger: bool = False, ) -> None: realmount = OT3Mount.from_mount(mount) - - await self._move_to_plunger_bottom(realmount, rate=1.0, check_current_vol=False) + if ignore_plunger is False: + await self._move_to_plunger_bottom( + realmount, rate=1.0, check_current_vol=False + ) if self.gantry_load == GantryLoad.HIGH_THROUGHPUT: spec = self._pipette_handler.plan_ht_drop_tip() diff --git a/api/src/opentrons/hardware_control/protocols/liquid_handler.py b/api/src/opentrons/hardware_control/protocols/liquid_handler.py index 2aea15bd55b..090b7dfec93 100644 --- a/api/src/opentrons/hardware_control/protocols/liquid_handler.py +++ b/api/src/opentrons/hardware_control/protocols/liquid_handler.py @@ -183,7 +183,10 @@ async def pick_up_tip( ... async def tip_drop_moves( - self, mount: MountArgType, home_after: bool = True + self, + mount: MountArgType, + home_after: bool = True, + ignore_plunger: bool = False, ) -> None: ... diff --git a/api/src/opentrons/hardware_control/protocols/motion_controller.py b/api/src/opentrons/hardware_control/protocols/motion_controller.py index e95a9d2e24f..77f78506506 100644 --- a/api/src/opentrons/hardware_control/protocols/motion_controller.py +++ b/api/src/opentrons/hardware_control/protocols/motion_controller.py @@ -171,6 +171,7 @@ async def move_axes( position: Mapping[Axis, float], speed: Optional[float] = None, max_speeds: Optional[Dict[Axis, float]] = None, + expect_stalls: bool = False, ) -> None: """Moves the effectors of the specified axis to the specified position. The effector of the x,y axis is the center of the carriage. diff --git a/api/src/opentrons/legacy_commands/commands.py b/api/src/opentrons/legacy_commands/commands.py index 68b6f1a0595..fbbb14d7fc4 100755 --- a/api/src/opentrons/legacy_commands/commands.py +++ b/api/src/opentrons/legacy_commands/commands.py @@ -299,3 +299,40 @@ def move_to_disposal_location( "name": command_types.MOVE_TO_DISPOSAL_LOCATION, "payload": {"instrument": instrument, "location": location, "text": text}, } + + +def seal( + instrument: InstrumentContext, + location: Well, +) -> command_types.SealCommand: + location_text = stringify_location(location) + text = f"Sealing to {location_text}" + return { + "name": command_types.SEAL, + "payload": {"instrument": instrument, "location": location, "text": text}, + } + + +def unseal( + instrument: InstrumentContext, + location: Well, +) -> command_types.UnsealCommand: + location_text = stringify_location(location) + text = f"Unsealing from {location_text}" + return { + "name": command_types.UNSEAL, + "payload": {"instrument": instrument, "location": location, "text": text}, + } + + +def resin_tip_dispense( + instrument: InstrumentContext, + flow_rate: float | None, +) -> command_types.PressurizeCommand: + if flow_rate is None: + flow_rate = 10 # The Protocol Engine default for Resin Tip Dispense + text = f"Pressurize pipette to dispense from resin tip at {flow_rate}uL/s." + return { + "name": command_types.PRESSURIZE, + "payload": {"instrument": instrument, "text": text}, + } diff --git a/api/src/opentrons/legacy_commands/types.py b/api/src/opentrons/legacy_commands/types.py index 5aaa72b8e09..61302985c2c 100755 --- a/api/src/opentrons/legacy_commands/types.py +++ b/api/src/opentrons/legacy_commands/types.py @@ -43,6 +43,10 @@ RETURN_TIP: Final = "command.RETURN_TIP" MOVE_TO: Final = "command.MOVE_TO" MOVE_TO_DISPOSAL_LOCATION: Final = "command.MOVE_TO_DISPOSAL_LOCATION" +SEAL: Final = "command.SEAL" +UNSEAL: Final = "command.UNSEAL" +PRESSURIZE: Final = "command.PRESSURIZE" + # Modules # @@ -535,11 +539,40 @@ class MoveLabwareCommandPayload(TextOnlyPayload): pass +class SealCommandPayload(TextOnlyPayload): + instrument: InstrumentContext + location: Union[None, Location, Well] + + +class UnsealCommandPayload(TextOnlyPayload): + instrument: InstrumentContext + location: Union[None, Location, Well] + + +class PressurizeCommandPayload(TextOnlyPayload): + instrument: InstrumentContext + + class MoveLabwareCommand(TypedDict): name: Literal["command.MOVE_LABWARE"] payload: MoveLabwareCommandPayload +class SealCommand(TypedDict): + name: Literal["command.SEAL"] + payload: SealCommandPayload + + +class UnsealCommand(TypedDict): + name: Literal["command.UNSEAL"] + payload: UnsealCommandPayload + + +class PressurizeCommand(TypedDict): + name: Literal["command.PRESSURIZE"] + payload: PressurizeCommandPayload + + Command = Union[ DropTipCommand, DropTipInDisposalLocationCommand, @@ -588,6 +621,9 @@ class MoveLabwareCommand(TypedDict): MoveToCommand, MoveToDisposalLocationCommand, MoveLabwareCommand, + SealCommand, + UnsealCommand, + PressurizeCommand, ] @@ -637,6 +673,9 @@ class MoveLabwareCommand(TypedDict): MoveToCommandPayload, MoveToDisposalLocationCommandPayload, MoveLabwareCommandPayload, + SealCommandPayload, + UnsealCommandPayload, + PressurizeCommandPayload, ] diff --git a/api/src/opentrons/protocol_api/core/engine/instrument.py b/api/src/opentrons/protocol_api/core/engine/instrument.py index 010f3110fdb..cd6548202ff 100644 --- a/api/src/opentrons/protocol_api/core/engine/instrument.py +++ b/api/src/opentrons/protocol_api/core/engine/instrument.py @@ -48,6 +48,8 @@ from opentrons.protocol_api._liquid import LiquidClass _DISPENSE_VOLUME_VALIDATION_ADDED_IN = APIVersion(2, 17) +_RESIN_TIP_DEFAULT_VOLUME = 400 +_RESIN_TIP_DEFAULT_FLOW_RATE = 10.0 class InstrumentCore(AbstractInstrument[WellCore]): @@ -678,6 +680,113 @@ def move_to( location=location, mount=self.get_mount() ) + def resin_tip_seal( + self, location: Location, well_core: WellCore, in_place: Optional[bool] = False + ) -> None: + labware_id = well_core.labware_id + well_name = well_core.get_name() + well_location = ( + self._engine_client.state.geometry.get_relative_pick_up_tip_well_location( + labware_id=labware_id, + well_name=well_name, + absolute_point=location.point, + ) + ) + + self._engine_client.execute_command( + cmd.EvotipSealPipetteParams( + pipetteId=self._pipette_id, + labwareId=labware_id, + wellName=well_name, + wellLocation=well_location, + ) + ) + + def resin_tip_unseal(self, location: Location, well_core: WellCore) -> None: + well_name = well_core.get_name() + labware_id = well_core.labware_id + + if location is not None: + relative_well_location = ( + self._engine_client.state.geometry.get_relative_well_location( + labware_id=labware_id, + well_name=well_name, + absolute_point=location.point, + ) + ) + + well_location = DropTipWellLocation( + origin=DropTipWellOrigin(relative_well_location.origin.value), + offset=relative_well_location.offset, + ) + else: + well_location = DropTipWellLocation() + + pipette_movement_conflict.check_safe_for_pipette_movement( + engine_state=self._engine_client.state, + pipette_id=self._pipette_id, + labware_id=labware_id, + well_name=well_name, + well_location=well_location, + ) + self._engine_client.execute_command( + cmd.EvotipUnsealPipetteParams( + pipetteId=self._pipette_id, + labwareId=labware_id, + wellName=well_name, + wellLocation=well_location, + ) + ) + + self._protocol_core.set_last_location(location=location, mount=self.get_mount()) + + def resin_tip_dispense( + self, + location: Location, + well_core: WellCore, + volume: Optional[float] = None, + flow_rate: Optional[float] = None, + ) -> None: + """ + Args: + volume: The volume of liquid to dispense, in microliters. Defaults to 400uL. + location: The exact location to dispense to. + well_core: The well to dispense to, if applicable. + flow_rate: The flow rate in µL/s to dispense at. Defaults to 10.0uL/S. + """ + if isinstance(location, (TrashBin, WasteChute)): + raise ValueError("Trash Bin and Waste Chute have no Wells.") + well_name = well_core.get_name() + labware_id = well_core.labware_id + if volume is None: + volume = _RESIN_TIP_DEFAULT_VOLUME + if flow_rate is None: + flow_rate = _RESIN_TIP_DEFAULT_FLOW_RATE + + well_location = self._engine_client.state.geometry.get_relative_liquid_handling_well_location( + labware_id=labware_id, + well_name=well_name, + absolute_point=location.point, + is_meniscus=None, + ) + pipette_movement_conflict.check_safe_for_pipette_movement( + engine_state=self._engine_client.state, + pipette_id=self._pipette_id, + labware_id=labware_id, + well_name=well_name, + well_location=well_location, + ) + self._engine_client.execute_command( + cmd.EvotipDispenseParams( + pipetteId=self._pipette_id, + labwareId=labware_id, + wellName=well_name, + wellLocation=well_location, + volume=volume, + flowRate=flow_rate, + ) + ) + def get_mount(self) -> Mount: """Get the mount the pipette is attached to.""" return self._engine_client.state.pipettes.get( diff --git a/api/src/opentrons/protocol_api/core/instrument.py b/api/src/opentrons/protocol_api/core/instrument.py index bc1ec3669df..7f0fa4d72a7 100644 --- a/api/src/opentrons/protocol_api/core/instrument.py +++ b/api/src/opentrons/protocol_api/core/instrument.py @@ -180,6 +180,33 @@ def move_to( ) -> None: ... + @abstractmethod + def resin_tip_seal( + self, + location: types.Location, + well_core: WellCoreType, + in_place: Optional[bool] = False, + ) -> None: + ... + + @abstractmethod + def resin_tip_unseal( + self, + location: types.Location, + well_core: WellCoreType, + ) -> None: + ... + + @abstractmethod + def resin_tip_dispense( + self, + location: types.Location, + well_core: WellCoreType, + volume: Optional[float] = None, + flow_rate: Optional[float] = None, + ) -> None: + ... + @abstractmethod def get_mount(self) -> types.Mount: ... 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 d2d25051d49..20d0b862e53 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 @@ -308,6 +308,30 @@ def drop_tip_in_disposal_location( ) -> None: raise APIVersionError(api_element="Dropping tips in a trash bin or waste chute") + def resin_tip_seal( + self, + location: types.Location, + well_core: WellCore, + in_place: Optional[bool] = False, + ) -> None: + raise APIVersionError(api_element="Sealing resin tips.") + + def resin_tip_unseal( + self, + location: types.Location, + well_core: WellCore, + ) -> None: + raise APIVersionError(api_element="Unsealing resin tips.") + + def resin_tip_dispense( + self, + location: types.Location, + well_core: WellCore, + volume: Optional[float] = None, + flow_rate: Optional[float] = None, + ) -> None: + raise APIVersionError(api_element="Dispensing liquid from resin tips.") + def home(self) -> None: """Home the mount""" self._protocol_interface.get_hardware().home_z( @@ -400,6 +424,32 @@ def move_to( location=location, mount=location_cache_mount ) + def evotip_seal( + self, + location: types.Location, + well_core: LegacyWellCore, + in_place: Optional[bool] = False, + ) -> None: + """This will never be called because it was added in API 2.22.""" + assert False, "evotip_seal only supported in API 2.22 & later" + + def evotip_unseal( + self, location: types.Location, well_core: WellCore, home_after: Optional[bool] + ) -> None: + """This will never be called because it was added in API 2.22.""" + assert False, "evotip_unseal only supported in API 2.22 & later" + + def evotip_dispense( + self, + location: types.Location, + well_core: WellCore, + volume: Optional[float] = None, + flow_rate: Optional[float] = None, + push_out: Optional[float] = None, + ) -> None: + """This will never be called because it was added in API 2.22.""" + assert False, "evotip_dispense only supported in API 2.22 & later" + def get_mount(self) -> types.Mount: """Get the mount this pipette is attached to.""" return self._mount 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 ec194874528..54c43a90f8c 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 @@ -276,6 +276,30 @@ def drop_tip_in_disposal_location( ) -> None: raise APIVersionError(api_element="Dropping tips in a trash bin or waste chute") + def resin_tip_seal( + self, + location: types.Location, + well_core: WellCore, + in_place: Optional[bool] = False, + ) -> None: + raise APIVersionError(api_element="Sealing resin tips.") + + def resin_tip_unseal( + self, + location: types.Location, + well_core: WellCore, + ) -> None: + raise APIVersionError(api_element="Unsealing resin tips.") + + def resin_tip_dispense( + self, + location: types.Location, + well_core: WellCore, + volume: Optional[float] = None, + flow_rate: Optional[float] = None, + ) -> None: + raise APIVersionError(api_element="Dispensing liquid from resin tips.") + def home(self) -> None: self._protocol_interface.set_last_location(None) diff --git a/api/src/opentrons/protocol_api/instrument_context.py b/api/src/opentrons/protocol_api/instrument_context.py index 9c6338270c7..bc2e072b671 100644 --- a/api/src/opentrons/protocol_api/instrument_context.py +++ b/api/src/opentrons/protocol_api/instrument_context.py @@ -1712,6 +1712,147 @@ def move_to( return self + @requires_version(2, 22) + def resin_tip_seal( + self, + location: Union[labware.Well, labware.Labware], + ) -> InstrumentContext: + """Seal resin tips onto the pipette. + + The location provided should contain resin tips. Sealing the + tip will perform a `pick up` action but there will be no tip tracking + associated with the pipette. + + :param location: A location containing resin tips, must be a Labware or a Well. + + :type location: :py:class:`~.types.Location` + """ + if isinstance(location, labware.Labware): + well = location.wells()[0] + else: + well = location + + with publisher.publish_context( + broker=self.broker, + command=cmds.seal( + instrument=self, + location=well, + ), + ): + self._core.resin_tip_seal( + location=well.top(), well_core=well._core, in_place=False + ) + return self + + @requires_version(2, 22) + def resin_tip_unseal( + self, + location: Union[labware.Well, labware.Labware], + ) -> InstrumentContext: + """Release resin tips from the pipette. + + The location provided should be a valid location to drop resin tips. + + :param location: A location containing that can accept tips. + + :type location: :py:class:`~.types.Location` + + :param home_after: + Whether to home the pipette after dropping the tip. If not specified + defaults to ``True`` on a Flex. The plunger will not home on an unseal. + + When ``False``, the pipette does not home its plunger. This can save a few + seconds, but is not recommended. Homing helps the robot track the pipette's + position. + + """ + if isinstance(location, labware.Labware): + well = location.wells()[0] + else: + well = location + + with publisher.publish_context( + broker=self.broker, + command=cmds.unseal( + instrument=self, + location=well, + ), + ): + self._core.resin_tip_unseal(location=well.top(), well_core=well._core) + + return self + + @requires_version(2, 22) + def resin_tip_dispense( + self, + location: types.Location, + volume: Optional[float] = None, + rate: Optional[float] = None, + ) -> InstrumentContext: + """Dispense a volume from resin tips into a labware. + + The location provided should contain resin tips labware as well as a + receptical for dispensed liquid. Dispensing from tip will perform a + `dispense` action of the specified volume at a desired flow rate. + + :param location: A location containing resin tips. + :type location: :py:class:`~.types.Location` + + :param volume: Will default to maximum, recommended to use the default. + The volume, in µL, that the pipette will prepare to handle. + :type volume: float + + :param rate: Will default to 10.0, recommended to use the default. How quickly + a pipette dispenses liquid. The speed in µL/s is calculated as + ``rate`` multiplied by :py:attr:`flow_rate.dispense`. + :type rate: float + + """ + well: Optional[labware.Well] = None + last_location = self._get_last_location_by_api_version() + + try: + target = validation.validate_location( + location=location, last_location=last_location + ) + except validation.NoLocationError as e: + raise RuntimeError( + "If dispense is called without an explicit location, another" + " method that moves to a location (such as move_to or " + "aspirate) must previously have been called so the robot " + "knows where it is." + ) from e + + if isinstance(target, validation.WellTarget): + well = target.well + if target.location: + move_to_location = target.location + elif well.parent._core.is_fixed_trash(): + move_to_location = target.well.top() + else: + move_to_location = target.well.bottom( + z=self._well_bottom_clearances.dispense + ) + else: + raise RuntimeError( + "A well must be specified when using `resin_tip_dispense`." + ) + + with publisher.publish_context( + broker=self.broker, + command=cmds.resin_tip_dispense( + instrument=self, + flow_rate=rate, + ), + ): + self._core.resin_tip_dispense( + move_to_location, + well_core=well._core, + volume=volume, + flow_rate=rate, + ) + return self + @requires_version(2, 18) def _retract( self, diff --git a/api/src/opentrons/protocol_engine/commands/__init__.py b/api/src/opentrons/protocol_engine/commands/__init__.py index 4ad91012b11..6f6c08c35e3 100644 --- a/api/src/opentrons/protocol_engine/commands/__init__.py +++ b/api/src/opentrons/protocol_engine/commands/__init__.py @@ -380,6 +380,28 @@ TryLiquidProbeCommandType, ) +from .evotip_seal_pipette import ( + EvotipSealPipette, + EvotipSealPipetteParams, + EvotipSealPipetteCreate, + EvotipSealPipetteResult, + EvotipSealPipetteCommandType, +) +from .evotip_unseal_pipette import ( + EvotipUnsealPipette, + EvotipUnsealPipetteParams, + EvotipUnsealPipetteCreate, + EvotipUnsealPipetteResult, + EvotipUnsealPipetteCommandType, +) +from .evotip_dispense import ( + EvotipDispense, + EvotipDispenseParams, + EvotipDispenseCreate, + EvotipDispenseResult, + EvotipDispenseCommandType, +) + __all__ = [ # command type unions "Command", @@ -670,4 +692,22 @@ "TryLiquidProbeCreate", "TryLiquidProbeResult", "TryLiquidProbeCommandType", + # evotip seal command bundle + "EvotipSealPipette", + "EvotipSealPipetteParams", + "EvotipSealPipetteCreate", + "EvotipSealPipetteResult", + "EvotipSealPipetteCommandType", + # evotip unseal command bundle + "EvotipUnsealPipette", + "EvotipUnsealPipetteParams", + "EvotipUnsealPipetteCreate", + "EvotipUnsealPipetteResult", + "EvotipUnsealPipetteCommandType", + # evotip dispense command bundle + "EvotipDispense", + "EvotipDispenseParams", + "EvotipDispenseCreate", + "EvotipDispenseResult", + "EvotipDispenseCommandType", ] diff --git a/api/src/opentrons/protocol_engine/commands/command_unions.py b/api/src/opentrons/protocol_engine/commands/command_unions.py index b04b381ae6b..d5d1b0a3fc9 100644 --- a/api/src/opentrons/protocol_engine/commands/command_unions.py +++ b/api/src/opentrons/protocol_engine/commands/command_unions.py @@ -360,6 +360,30 @@ TryLiquidProbeCommandType, ) +from .evotip_seal_pipette import ( + EvotipSealPipette, + EvotipSealPipetteParams, + EvotipSealPipetteCreate, + EvotipSealPipetteResult, + EvotipSealPipetteCommandType, +) + +from .evotip_dispense import ( + EvotipDispense, + EvotipDispenseParams, + EvotipDispenseCreate, + EvotipDispenseResult, + EvotipDispenseCommandType, +) + +from .evotip_unseal_pipette import ( + EvotipUnsealPipette, + EvotipUnsealPipetteParams, + EvotipUnsealPipetteCreate, + EvotipUnsealPipetteResult, + EvotipUnsealPipetteCommandType, +) + Command = Annotated[ Union[ AirGapInPlace, @@ -404,6 +428,9 @@ GetNextTip, LiquidProbe, TryLiquidProbe, + EvotipSealPipette, + EvotipDispense, + EvotipUnsealPipette, heater_shaker.WaitForTemperature, heater_shaker.SetTargetTemperature, heater_shaker.DeactivateHeater, @@ -492,6 +519,9 @@ GetNextTipParams, LiquidProbeParams, TryLiquidProbeParams, + EvotipSealPipetteParams, + EvotipDispenseParams, + EvotipUnsealPipetteParams, heater_shaker.WaitForTemperatureParams, heater_shaker.SetTargetTemperatureParams, heater_shaker.DeactivateHeaterParams, @@ -578,6 +608,9 @@ GetNextTipCommandType, LiquidProbeCommandType, TryLiquidProbeCommandType, + EvotipSealPipetteCommandType, + EvotipDispenseCommandType, + EvotipUnsealPipetteCommandType, heater_shaker.WaitForTemperatureCommandType, heater_shaker.SetTargetTemperatureCommandType, heater_shaker.DeactivateHeaterCommandType, @@ -665,6 +698,9 @@ GetNextTipCreate, LiquidProbeCreate, TryLiquidProbeCreate, + EvotipSealPipetteCreate, + EvotipDispenseCreate, + EvotipUnsealPipetteCreate, heater_shaker.WaitForTemperatureCreate, heater_shaker.SetTargetTemperatureCreate, heater_shaker.DeactivateHeaterCreate, @@ -760,6 +796,9 @@ GetNextTipResult, LiquidProbeResult, TryLiquidProbeResult, + EvotipSealPipetteResult, + EvotipDispenseResult, + EvotipUnsealPipetteResult, heater_shaker.WaitForTemperatureResult, heater_shaker.SetTargetTemperatureResult, heater_shaker.DeactivateHeaterResult, diff --git a/api/src/opentrons/protocol_engine/commands/evotip_dispense.py b/api/src/opentrons/protocol_engine/commands/evotip_dispense.py new file mode 100644 index 00000000000..e0053262295 --- /dev/null +++ b/api/src/opentrons/protocol_engine/commands/evotip_dispense.py @@ -0,0 +1,156 @@ +"""Evotip Dispense-in-place command request, result, and implementation models.""" + +from __future__ import annotations +from typing import TYPE_CHECKING, Optional, Type, Union +from typing_extensions import Literal + +from opentrons.protocol_engine.errors import UnsupportedLabwareForActionError +from .pipetting_common import ( + PipetteIdMixin, + FlowRateMixin, + DispenseVolumeMixin, + BaseLiquidHandlingResult, + dispense_in_place, +) +from .movement_common import ( + LiquidHandlingWellLocationMixin, + StallOrCollisionError, + move_to_well, +) + +from .command import ( + AbstractCommandImpl, + BaseCommand, + BaseCommandCreate, + SuccessData, + DefinedErrorData, +) +from ..state.update_types import StateUpdate +from ..resources import labware_validation +from ..errors import ProtocolEngineError + +if TYPE_CHECKING: + from ..execution import PipettingHandler, GantryMover, MovementHandler + from ..resources import ModelUtils + from ..state.state import StateView + + +EvotipDispenseCommandType = Literal["evotipDispense"] + + +class EvotipDispenseParams( + PipetteIdMixin, DispenseVolumeMixin, FlowRateMixin, LiquidHandlingWellLocationMixin +): + """Payload required to dispense in place.""" + + pass + + +class EvotipDispenseResult(BaseLiquidHandlingResult): + """Result data from the execution of a DispenseInPlace command.""" + + pass + + +_ExecuteReturn = Union[ + SuccessData[EvotipDispenseResult], + DefinedErrorData[StallOrCollisionError], +] + + +class EvotipDispenseImplementation( + AbstractCommandImpl[EvotipDispenseParams, _ExecuteReturn] +): + """DispenseInPlace command implementation.""" + + def __init__( + self, + pipetting: PipettingHandler, + state_view: StateView, + gantry_mover: GantryMover, + model_utils: ModelUtils, + movement: MovementHandler, + **kwargs: object, + ) -> None: + self._pipetting = pipetting + self._state_view = state_view + self._gantry_mover = gantry_mover + self._model_utils = model_utils + self._movement = movement + + async def execute(self, params: EvotipDispenseParams) -> _ExecuteReturn: + """Move to and dispense to the requested well.""" + well_location = params.wellLocation + labware_id = params.labwareId + well_name = params.wellName + + labware_definition = self._state_view.labware.get_definition(params.labwareId) + if not labware_validation.is_evotips(labware_definition.parameters.loadName): + raise UnsupportedLabwareForActionError( + f"Cannot use command: `EvotipDispense` with labware: {labware_definition.parameters.loadName}" + ) + move_result = await move_to_well( + movement=self._movement, + model_utils=self._model_utils, + pipette_id=params.pipetteId, + labware_id=labware_id, + well_name=well_name, + well_location=well_location, + ) + if isinstance(move_result, DefinedErrorData): + return move_result + + current_position = await self._gantry_mover.get_position(params.pipetteId) + result = await dispense_in_place( + pipette_id=params.pipetteId, + volume=params.volume, + flow_rate=params.flowRate, + push_out=None, + location_if_error={ + "retryLocation": ( + current_position.x, + current_position.y, + current_position.z, + ) + }, + pipetting=self._pipetting, + model_utils=self._model_utils, + ) + if isinstance(result, DefinedErrorData): + # TODO (chb, 2025-01-29): Remove this and the OverpressureError returns once disabled for this function + raise ProtocolEngineError( + message="Overpressure Error during Resin Tip Dispense Command." + ) + return SuccessData( + public=EvotipDispenseResult(volume=result.public.volume), + state_update=StateUpdate.reduce( + move_result.state_update, result.state_update + ), + ) + + +class EvotipDispense( + BaseCommand[ + EvotipDispenseParams, + EvotipDispenseResult, + StallOrCollisionError, + ] +): + """DispenseInPlace command model.""" + + commandType: EvotipDispenseCommandType = "evotipDispense" + params: EvotipDispenseParams + result: Optional[EvotipDispenseResult] = None + + _ImplementationCls: Type[ + EvotipDispenseImplementation + ] = EvotipDispenseImplementation + + +class EvotipDispenseCreate(BaseCommandCreate[EvotipDispenseParams]): + """DispenseInPlace command request model.""" + + commandType: EvotipDispenseCommandType = "evotipDispense" + params: EvotipDispenseParams + + _CommandCls: Type[EvotipDispense] = EvotipDispense diff --git a/api/src/opentrons/protocol_engine/commands/evotip_seal_pipette.py b/api/src/opentrons/protocol_engine/commands/evotip_seal_pipette.py new file mode 100644 index 00000000000..0e67e8fc2c0 --- /dev/null +++ b/api/src/opentrons/protocol_engine/commands/evotip_seal_pipette.py @@ -0,0 +1,331 @@ +"""Seal evotip resin tip command request, result, and implementation models.""" + +from __future__ import annotations +from pydantic import Field, BaseModel +from typing import TYPE_CHECKING, Optional, Type, Union +from opentrons.types import MountType +from opentrons.protocol_engine.types import MotorAxis +from typing_extensions import Literal + +from opentrons.protocol_engine.errors import UnsupportedLabwareForActionError +from ..resources import ModelUtils, labware_validation +from ..types import PickUpTipWellLocation, FluidKind, AspiratedFluid +from .pipetting_common import ( + PipetteIdMixin, +) +from .movement_common import ( + DestinationPositionResult, + StallOrCollisionError, + move_to_well, +) +from .command import ( + AbstractCommandImpl, + BaseCommand, + BaseCommandCreate, + DefinedErrorData, + SuccessData, +) + +from opentrons.hardware_control import HardwareControlAPI +from opentrons.hardware_control.types import Axis +from ..state.update_types import StateUpdate + +if TYPE_CHECKING: + from ..state.state import StateView + from ..execution import ( + MovementHandler, + TipHandler, + GantryMover, + PipettingHandler, + ) + + +EvotipSealPipetteCommandType = Literal["evotipSealPipette"] +_PREP_DISTANCE_DEFAULT = 8.25 +_PRESS_DISTANCE_DEFAULT = 3.5 +_EJECTOR_PUSH_MM_DEFAULT = 7.0 + + +class TipPickUpParams(BaseModel): + """Payload used to specify press-tip parameters for a seal command.""" + + prepDistance: float = Field( + default=0, description="The distance to move down to fit the tips on." + ) + pressDistance: float = Field( + default=0, description="The distance to press on tips." + ) + ejectorPushMm: float = Field( + default=0, + description="The distance to back off to ensure that the tip presence sensors are not triggered.", + ) + + +class EvotipSealPipetteParams(PipetteIdMixin): + """Payload needed to seal resin tips to a pipette.""" + + labwareId: str = Field(..., description="Identifier of labware to use.") + wellName: str = Field(..., description="Name of well to use in labware.") + wellLocation: PickUpTipWellLocation = Field( + default_factory=PickUpTipWellLocation, + description="Relative well location at which to pick up the tip.", + ) + tipPickUpParams: Optional[TipPickUpParams] = Field( + default=None, description="Specific parameters for " + ) + + +class EvotipSealPipetteResult(DestinationPositionResult): + """Result data from the execution of a EvotipSealPipette.""" + + tipVolume: float = Field( + 0, + description="Maximum volume of liquid that the picked up tip can hold, in µL.", + ge=0, + ) + + tipLength: float = Field( + 0, + description="The length of the tip in mm.", + ge=0, + ) + + tipDiameter: float = Field( + 0, + description="The diameter of the tip in mm.", + ge=0, + ) + + +_ExecuteReturn = Union[ + SuccessData[EvotipSealPipetteResult], + DefinedErrorData[StallOrCollisionError], +] + + +class EvotipSealPipetteImplementation( + AbstractCommandImpl[EvotipSealPipetteParams, _ExecuteReturn] +): + """Evotip seal pipette command implementation.""" + + def __init__( + self, + state_view: StateView, + tip_handler: TipHandler, + model_utils: ModelUtils, + movement: MovementHandler, + hardware_api: HardwareControlAPI, + gantry_mover: GantryMover, + pipetting: PipettingHandler, + **kwargs: object, + ) -> None: + self._state_view = state_view + self._tip_handler = tip_handler + self._model_utils = model_utils + self._movement = movement + self._gantry_mover = gantry_mover + self._pipetting = pipetting + self._hardware_api = hardware_api + + async def relative_pickup_tip( + self, + tip_pick_up_params: TipPickUpParams, + mount: MountType, + ) -> None: + """A relative press-fit pick up command using gantry moves.""" + prep_distance = tip_pick_up_params.prepDistance + press_distance = tip_pick_up_params.pressDistance + retract_distance = -1 * (prep_distance + press_distance) + + mount_axis = MotorAxis.LEFT_Z if mount == MountType.LEFT else MotorAxis.RIGHT_Z + + # TODO chb, 2025-01-29): Factor out the movement constants and relocate this logic into the hardware controller + await self._gantry_mover.move_axes( + axis_map={mount_axis: prep_distance}, speed=10, relative_move=True + ) + + # Drive mount down for press-fit + await self._gantry_mover.move_axes( + axis_map={mount_axis: press_distance}, + speed=10.0, + relative_move=True, + expect_stalls=True, + ) + # retract cam : 11.05 + await self._gantry_mover.move_axes( + axis_map={mount_axis: retract_distance}, speed=5.5, relative_move=True + ) + + async def cam_action_relative_pickup_tip( + self, + tip_pick_up_params: TipPickUpParams, + mount: MountType, + ) -> None: + """A cam action pick up command using gantry moves.""" + prep_distance = tip_pick_up_params.prepDistance + press_distance = tip_pick_up_params.pressDistance + ejector_push_mm = tip_pick_up_params.ejectorPushMm + retract_distance = -1 * (prep_distance + press_distance) + + mount_axis = MotorAxis.LEFT_Z if mount == MountType.LEFT else MotorAxis.RIGHT_Z + + # TODO chb, 2025-01-29): Factor out the movement constants and relocate this logic into the hardware controller + await self._gantry_mover.move_axes( + axis_map={mount_axis: -6}, speed=10, relative_move=True + ) + + # Drive Q down 3mm at fast speed - look into the pick up tip fuinction to find slow and fast: 10.0 + await self._gantry_mover.move_axes( + axis_map={MotorAxis.AXIS_96_CHANNEL_CAM: prep_distance}, + speed=10.0, + relative_move=True, + ) + # 2.8mm at slow speed - cam action pickup speed: 5.5 + await self._gantry_mover.move_axes( + axis_map={MotorAxis.AXIS_96_CHANNEL_CAM: press_distance}, + speed=5.5, + relative_move=True, + ) + # retract cam : 11.05 + await self._gantry_mover.move_axes( + axis_map={MotorAxis.AXIS_96_CHANNEL_CAM: retract_distance}, + speed=5.5, + relative_move=True, + ) + + # Lower tip presence + await self._gantry_mover.move_axes( + axis_map={mount_axis: 2}, speed=10, relative_move=True + ) + await self._gantry_mover.move_axes( + axis_map={MotorAxis.AXIS_96_CHANNEL_CAM: ejector_push_mm}, + speed=5.5, + relative_move=True, + ) + await self._gantry_mover.move_axes( + axis_map={MotorAxis.AXIS_96_CHANNEL_CAM: -1 * ejector_push_mm}, + speed=5.5, + relative_move=True, + ) + + async def execute( + self, params: EvotipSealPipetteParams + ) -> Union[SuccessData[EvotipSealPipetteResult], _ExecuteReturn]: + """Move to and pick up a tip using the requested pipette.""" + pipette_id = params.pipetteId + labware_id = params.labwareId + well_name = params.wellName + + labware_definition = self._state_view.labware.get_definition(params.labwareId) + if not labware_validation.is_evotips(labware_definition.parameters.loadName): + raise UnsupportedLabwareForActionError( + f"Cannot use command: `EvotipSealPipette` with labware: {labware_definition.parameters.loadName}" + ) + + well_location = self._state_view.geometry.convert_pick_up_tip_well_location( + well_location=params.wellLocation + ) + move_result = await move_to_well( + movement=self._movement, + model_utils=self._model_utils, + pipette_id=pipette_id, + labware_id=labware_id, + well_name=well_name, + well_location=well_location, + ) + if isinstance(move_result, DefinedErrorData): + return move_result + + # Aspirate to move plunger to a maximum volume position per pipette type + tip_geometry = self._state_view.geometry.get_nominal_tip_geometry( + pipette_id, labware_id, well_name + ) + maximum_volume = self._state_view.pipettes.get_maximum_volume(pipette_id) + if self._state_view.pipettes.get_mount(pipette_id) == MountType.LEFT: + await self._hardware_api.home(axes=[Axis.P_L]) + else: + await self._hardware_api.home(axes=[Axis.P_R]) + + # Begin relative pickup steps for the resin tips + + channels = self._state_view.tips.get_pipette_active_channels(pipette_id) + mount = self._state_view.pipettes.get_mount(pipette_id) + tip_pick_up_params = params.tipPickUpParams + if tip_pick_up_params is None: + tip_pick_up_params = TipPickUpParams( + prepDistance=_PREP_DISTANCE_DEFAULT, + pressDistance=_PRESS_DISTANCE_DEFAULT, + ejectorPushMm=_EJECTOR_PUSH_MM_DEFAULT, + ) + + if channels != 96: + await self.relative_pickup_tip( + tip_pick_up_params=tip_pick_up_params, + mount=mount, + ) + elif channels == 96: + await self.cam_action_relative_pickup_tip( + tip_pick_up_params=tip_pick_up_params, + mount=mount, + ) + else: + tip_geometry = await self._tip_handler.pick_up_tip( + pipette_id=pipette_id, + labware_id=labware_id, + well_name=well_name, + do_not_ignore_tip_presence=True, + ) + + # cache_tip + if self._state_view.config.use_virtual_pipettes is False: + self._tip_handler.cache_tip(pipette_id, tip_geometry) + hw_instr = self._hardware_api.hardware_instruments[mount.to_hw_mount()] + if hw_instr is not None: + hw_instr.set_current_volume(maximum_volume) + + state_update = StateUpdate() + state_update.update_pipette_tip_state( + pipette_id=pipette_id, + tip_geometry=tip_geometry, + ) + + state_update.set_fluid_aspirated( + pipette_id=pipette_id, + fluid=AspiratedFluid(kind=FluidKind.LIQUID, volume=maximum_volume), + ) + return SuccessData( + public=EvotipSealPipetteResult( + tipVolume=tip_geometry.volume, + tipLength=tip_geometry.length, + tipDiameter=tip_geometry.diameter, + position=move_result.public.position, + ), + state_update=state_update, + ) + + +class EvotipSealPipette( + BaseCommand[ + EvotipSealPipetteParams, + EvotipSealPipetteResult, + StallOrCollisionError, + ] +): + """Seal evotip resin tip command model.""" + + commandType: EvotipSealPipetteCommandType = "evotipSealPipette" + params: EvotipSealPipetteParams + result: Optional[EvotipSealPipetteResult] = None + + _ImplementationCls: Type[ + EvotipSealPipetteImplementation + ] = EvotipSealPipetteImplementation + + +class EvotipSealPipetteCreate(BaseCommandCreate[EvotipSealPipetteParams]): + """Seal evotip resin tip command creation request model.""" + + commandType: EvotipSealPipetteCommandType = "evotipSealPipette" + params: EvotipSealPipetteParams + + _CommandCls: Type[EvotipSealPipette] = EvotipSealPipette diff --git a/api/src/opentrons/protocol_engine/commands/evotip_unseal_pipette.py b/api/src/opentrons/protocol_engine/commands/evotip_unseal_pipette.py new file mode 100644 index 00000000000..e8cde34fd5c --- /dev/null +++ b/api/src/opentrons/protocol_engine/commands/evotip_unseal_pipette.py @@ -0,0 +1,160 @@ +"""Unseal evotip resin tip command request, result, and implementation models.""" + +from __future__ import annotations + +from pydantic import Field +from typing import TYPE_CHECKING, Optional, Type +from typing_extensions import Literal + +from opentrons.protocol_engine.resources.model_utils import ModelUtils +from opentrons.protocol_engine.errors import UnsupportedLabwareForActionError +from opentrons.protocol_engine.types import MotorAxis +from opentrons.types import MountType + +from ..types import DropTipWellLocation +from .pipetting_common import ( + PipetteIdMixin, +) +from .movement_common import ( + DestinationPositionResult, + move_to_well, + StallOrCollisionError, +) +from .command import ( + AbstractCommandImpl, + BaseCommand, + BaseCommandCreate, + DefinedErrorData, + SuccessData, +) +from ..resources import labware_validation + +if TYPE_CHECKING: + from ..state.state import StateView + from ..execution import MovementHandler, TipHandler, GantryMover + + +EvotipUnsealPipetteCommandType = Literal["evotipUnsealPipette"] + + +class EvotipUnsealPipetteParams(PipetteIdMixin): + """Payload required to drop a tip in a specific well.""" + + labwareId: str = Field(..., description="Identifier of labware to use.") + wellName: str = Field(..., description="Name of well to use in labware.") + wellLocation: DropTipWellLocation = Field( + default_factory=DropTipWellLocation, + description="Relative well location at which to drop the tip.", + ) + + +class EvotipUnsealPipetteResult(DestinationPositionResult): + """Result data from the execution of a DropTip command.""" + + pass + + +_ExecuteReturn = ( + SuccessData[EvotipUnsealPipetteResult] | DefinedErrorData[StallOrCollisionError] +) + + +class EvotipUnsealPipetteImplementation( + AbstractCommandImpl[EvotipUnsealPipetteParams, _ExecuteReturn] +): + """Drop tip command implementation.""" + + def __init__( + self, + state_view: StateView, + tip_handler: TipHandler, + movement: MovementHandler, + model_utils: ModelUtils, + gantry_mover: GantryMover, + **kwargs: object, + ) -> None: + self._state_view = state_view + self._tip_handler = tip_handler + self._movement_handler = movement + self._model_utils = model_utils + self._gantry_mover = gantry_mover + + async def execute(self, params: EvotipUnsealPipetteParams) -> _ExecuteReturn: + """Move to and drop a tip using the requested pipette.""" + pipette_id = params.pipetteId + labware_id = params.labwareId + well_name = params.wellName + + well_location = params.wellLocation + labware_definition = self._state_view.labware.get_definition(params.labwareId) + if not labware_validation.is_evotips(labware_definition.parameters.loadName): + raise UnsupportedLabwareForActionError( + f"Cannot use command: `EvotipUnsealPipette` with labware: {labware_definition.parameters.loadName}" + ) + is_partially_configured = self._state_view.pipettes.get_is_partially_configured( + pipette_id=pipette_id + ) + tip_drop_location = self._state_view.geometry.get_checked_tip_drop_location( + pipette_id=pipette_id, + labware_id=labware_id, + well_location=well_location, + partially_configured=is_partially_configured, + ) + + move_result = await move_to_well( + movement=self._movement_handler, + model_utils=self._model_utils, + pipette_id=pipette_id, + labware_id=labware_id, + well_name=well_name, + well_location=tip_drop_location, + ) + if isinstance(move_result, DefinedErrorData): + return move_result + + # Move to an appropriate position + mount = self._state_view.pipettes.get_mount(pipette_id) + + mount_axis = MotorAxis.LEFT_Z if mount == MountType.LEFT else MotorAxis.RIGHT_Z + await self._gantry_mover.move_axes( + axis_map={mount_axis: -14}, speed=10, relative_move=True + ) + + await self._tip_handler.drop_tip( + pipette_id=pipette_id, + home_after=None, + do_not_ignore_tip_presence=False, + ignore_plunger=True, + ) + + return SuccessData( + public=EvotipUnsealPipetteResult(position=move_result.public.position), + state_update=move_result.state_update.set_fluid_unknown( + pipette_id=pipette_id + ).update_pipette_tip_state(pipette_id=params.pipetteId, tip_geometry=None), + ) + + +class EvotipUnsealPipette( + BaseCommand[ + EvotipUnsealPipetteParams, EvotipUnsealPipetteResult, StallOrCollisionError + ] +): + """Evotip unseal command model.""" + + commandType: EvotipUnsealPipetteCommandType = "evotipUnsealPipette" + params: EvotipUnsealPipetteParams + result: Optional[EvotipUnsealPipetteResult] = None + + _ImplementationCls: Type[ + EvotipUnsealPipetteImplementation + ] = EvotipUnsealPipetteImplementation + + +class EvotipUnsealPipetteCreate(BaseCommandCreate[EvotipUnsealPipetteParams]): + """Evotip unseal command creation request model.""" + + commandType: EvotipUnsealPipetteCommandType = "evotipUnsealPipette" + params: EvotipUnsealPipetteParams + + _CommandCls: Type[EvotipUnsealPipette] = EvotipUnsealPipette diff --git a/api/src/opentrons/protocol_engine/errors/__init__.py b/api/src/opentrons/protocol_engine/errors/__init__.py index 419043120a6..d3dcc5abaac 100644 --- a/api/src/opentrons/protocol_engine/errors/__init__.py +++ b/api/src/opentrons/protocol_engine/errors/__init__.py @@ -11,6 +11,7 @@ PickUpTipTipNotAttachedError, TipAttachedError, CommandDoesNotExistError, + UnsupportedLabwareForActionError, LabwareNotLoadedError, LabwareNotLoadedOnModuleError, LabwareNotLoadedOnLabwareError, @@ -104,6 +105,7 @@ "LabwareNotLoadedOnLabwareError", "LabwareNotOnDeckError", "LiquidDoesNotExistError", + "UnsupportedLabwareForActionError", "LabwareDefinitionDoesNotExistError", "LabwareCannotBeStackedError", "LabwareCannotSitOnDeckError", diff --git a/api/src/opentrons/protocol_engine/errors/exceptions.py b/api/src/opentrons/protocol_engine/errors/exceptions.py index 2f7e4b07e56..d8c96d8dd31 100644 --- a/api/src/opentrons/protocol_engine/errors/exceptions.py +++ b/api/src/opentrons/protocol_engine/errors/exceptions.py @@ -387,6 +387,19 @@ def __init__( super().__init__(ErrorCodes.GENERAL_ERROR, message, details, wrapping) +class UnsupportedLabwareForActionError(ProtocolEngineError): + """Raised when trying to use an unsupported labware for a command.""" + + def __init__( + self, + message: Optional[str] = None, + details: Optional[Dict[str, Any]] = None, + wrapping: Optional[Sequence[EnumeratedError]] = None, + ) -> None: + """Build a UnsupportedLabwareForActionError.""" + super().__init__(ErrorCodes.GENERAL_ERROR, message, details, wrapping) + + class WellDoesNotExistError(ProtocolEngineError): """Raised when referencing a well that does not exist.""" diff --git a/api/src/opentrons/protocol_engine/execution/gantry_mover.py b/api/src/opentrons/protocol_engine/execution/gantry_mover.py index 5413de8741c..ca90d0a12cb 100644 --- a/api/src/opentrons/protocol_engine/execution/gantry_mover.py +++ b/api/src/opentrons/protocol_engine/execution/gantry_mover.py @@ -114,6 +114,7 @@ async def move_axes( critical_point: Optional[Dict[MotorAxis, float]] = None, speed: Optional[float] = None, relative_move: bool = False, + expect_stalls: bool = False, ) -> Dict[MotorAxis, float]: """Move a set of axes a given distance.""" ... @@ -341,6 +342,7 @@ async def move_axes( critical_point: Optional[Dict[MotorAxis, float]] = None, speed: Optional[float] = None, relative_move: bool = False, + expect_stalls: bool = False, ) -> Dict[MotorAxis, float]: """Move a set of axes a given distance. @@ -349,6 +351,7 @@ async def move_axes( critical_point: A critical point override for axes speed: Optional speed parameter for the move. relative_move: Whether the axis map needs to be converted from a relative to absolute move. + expect_stalls: Whether it is expected that the move triggers a stall error. """ try: pos_hw = self._convert_axis_map_for_hw(axis_map) @@ -385,6 +388,7 @@ async def move_axes( await self._hardware_api.move_axes( position=absolute_pos, speed=speed, + expect_stalls=expect_stalls, ) except PositionUnknownError as e: @@ -588,6 +592,7 @@ async def move_axes( critical_point: Optional[Dict[MotorAxis, float]] = None, speed: Optional[float] = None, relative_move: bool = False, + expect_stalls: bool = False, ) -> Dict[MotorAxis, float]: """Move the give axes map. No-op in virtual implementation.""" mount = self.pick_mount_from_axis_map(axis_map) diff --git a/api/src/opentrons/protocol_engine/execution/tip_handler.py b/api/src/opentrons/protocol_engine/execution/tip_handler.py index 8a58536c10b..d27925e00fe 100644 --- a/api/src/opentrons/protocol_engine/execution/tip_handler.py +++ b/api/src/opentrons/protocol_engine/execution/tip_handler.py @@ -62,6 +62,7 @@ async def pick_up_tip( pipette_id: str, labware_id: str, well_name: str, + do_not_ignore_tip_presence: bool = True, ) -> TipGeometry: """Pick up the named tip. @@ -75,7 +76,13 @@ async def pick_up_tip( """ ... - async def drop_tip(self, pipette_id: str, home_after: Optional[bool]) -> None: + async def drop_tip( + self, + pipette_id: str, + home_after: Optional[bool], + do_not_ignore_tip_presence: bool = True, + ignore_plunger: bool = False, + ) -> None: """Drop the attached tip into the current location. Pipette should be in place over the destination prior to calling this method. @@ -230,6 +237,7 @@ async def pick_up_tip( pipette_id: str, labware_id: str, well_name: str, + do_not_ignore_tip_presence: bool = True, ) -> TipGeometry: """See documentation on abstract base class.""" hw_mount = self._get_hw_mount(pipette_id) @@ -253,10 +261,11 @@ async def pick_up_tip( await self._hardware_api.tip_pickup_moves( mount=hw_mount, presses=None, increment=None ) - try: - await self.verify_tip_presence(pipette_id, TipPresenceStatus.PRESENT) - except TipNotAttachedError as e: - raise PickUpTipTipNotAttachedError(tip_geometry=tip_geometry) from e + if do_not_ignore_tip_presence: + try: + await self.verify_tip_presence(pipette_id, TipPresenceStatus.PRESENT) + except TipNotAttachedError as e: + raise PickUpTipTipNotAttachedError(tip_geometry=tip_geometry) from e self.cache_tip(pipette_id, tip_geometry) @@ -264,7 +273,13 @@ async def pick_up_tip( return tip_geometry - async def drop_tip(self, pipette_id: str, home_after: Optional[bool]) -> None: + async def drop_tip( + self, + pipette_id: str, + home_after: Optional[bool], + do_not_ignore_tip_presence: bool = True, + ignore_plunger: bool = False, + ) -> None: """See documentation on abstract base class.""" hw_mount = self._get_hw_mount(pipette_id) @@ -275,10 +290,13 @@ async def drop_tip(self, pipette_id: str, home_after: Optional[bool]) -> None: else: kwargs = {} - await self._hardware_api.tip_drop_moves(mount=hw_mount, **kwargs) + await self._hardware_api.tip_drop_moves( + mount=hw_mount, ignore_plunger=ignore_plunger, **kwargs + ) - # Allow TipNotAttachedError to propagate. - await self.verify_tip_presence(pipette_id, TipPresenceStatus.ABSENT) + if do_not_ignore_tip_presence: + # Allow TipNotAttachedError to propagate. + await self.verify_tip_presence(pipette_id, TipPresenceStatus.ABSENT) self.remove_tip(pipette_id) @@ -383,6 +401,7 @@ async def pick_up_tip( pipette_id: str, labware_id: str, well_name: str, + do_not_ignore_tip_presence: bool = True, ) -> TipGeometry: """Pick up a tip at the current location using a virtual pipette. @@ -424,6 +443,8 @@ async def drop_tip( self, pipette_id: str, home_after: Optional[bool], + do_not_ignore_tip_presence: bool = True, + ignore_plunger: bool = False, ) -> None: """Pick up a tip at the current location using a virtual pipette. diff --git a/api/src/opentrons/protocol_engine/resources/labware_validation.py b/api/src/opentrons/protocol_engine/resources/labware_validation.py index 451f3afbfab..b33650e65be 100644 --- a/api/src/opentrons/protocol_engine/resources/labware_validation.py +++ b/api/src/opentrons/protocol_engine/resources/labware_validation.py @@ -14,6 +14,11 @@ def is_absorbance_reader_lid(load_name: str) -> bool: return load_name == "opentrons_flex_lid_absorbance_plate_reader_module" +def is_evotips(load_name: str) -> bool: + """Check if a labware is an evotips tiprack.""" + return load_name == "evotips_opentrons_96_labware" + + def validate_definition_is_labware(definition: LabwareDefinition) -> bool: """Validate that one of the definition's allowed roles is `labware`. diff --git a/api/src/opentrons/protocol_engine/state/pipettes.py b/api/src/opentrons/protocol_engine/state/pipettes.py index 9b7d289e890..fc7b1da20ac 100644 --- a/api/src/opentrons/protocol_engine/state/pipettes.py +++ b/api/src/opentrons/protocol_engine/state/pipettes.py @@ -331,6 +331,11 @@ def _update_volumes(self, state_update: update_types.StateUpdate) -> None: def _update_aspirated( self, update: update_types.PipetteAspiratedFluidUpdate ) -> None: + if self._state.pipette_contents_by_id[update.pipette_id] is None: + self._state.pipette_contents_by_id[ + update.pipette_id + ] = fluid_stack.FluidStack() + self._fluid_stack_log_if_empty(update.pipette_id).add_fluid(update.fluid) def _update_ejected(self, update: update_types.PipetteEjectedFluidUpdate) -> None: diff --git a/api/tests/opentrons/hardware_control/test_ot3_api.py b/api/tests/opentrons/hardware_control/test_ot3_api.py index 200549108db..cbb5838c266 100644 --- a/api/tests/opentrons/hardware_control/test_ot3_api.py +++ b/api/tests/opentrons/hardware_control/test_ot3_api.py @@ -1895,7 +1895,9 @@ async def test_move_axes( await ot3_hardware.move_axes(position=input_position) mock_check_motor.return_value = True - mock_move.assert_called_once_with(target_position=expected_move_pos, speed=None) + mock_move.assert_called_once_with( + target_position=expected_move_pos, speed=None, expect_stalls=False + ) async def test_move_gripper_mount_without_gripper_attached( @@ -1913,14 +1915,14 @@ async def test_move_expect_stall_flag( expected = HWStopCondition.stall if expect_stalls else HWStopCondition.none - await ot3_hardware.move_to(Mount.LEFT, Point(0, 0, 0), _expect_stalls=expect_stalls) + await ot3_hardware.move_to(Mount.LEFT, Point(0, 0, 0), expect_stalls=expect_stalls) mock_backend_move.assert_called_once() _, _, _, condition = mock_backend_move.call_args_list[0][0] assert condition == expected mock_backend_move.reset_mock() await ot3_hardware.move_rel( - Mount.LEFT, Point(10, 0, 0), _expect_stalls=expect_stalls + Mount.LEFT, Point(10, 0, 0), expect_stalls=expect_stalls ) mock_backend_move.assert_called_once() _, _, _, condition = mock_backend_move.call_args_list[0][0] diff --git a/api/tests/opentrons/protocol_engine/commands/test_evotip_dispense.py b/api/tests/opentrons/protocol_engine/commands/test_evotip_dispense.py new file mode 100644 index 00000000000..568ddda83c1 --- /dev/null +++ b/api/tests/opentrons/protocol_engine/commands/test_evotip_dispense.py @@ -0,0 +1,133 @@ +"""Test evotip dispense in place commands.""" +import json + +import pytest +from decoy import Decoy + +from opentrons.protocol_engine import ( + LiquidHandlingWellLocation, + WellOrigin, + WellOffset, + DeckPoint, +) +from opentrons.types import Point +from opentrons.protocol_engine.execution import ( + PipettingHandler, + GantryMover, + MovementHandler, +) + +from opentrons.protocols.models import LabwareDefinition +from opentrons.protocol_engine.commands.command import SuccessData +from opentrons.protocol_engine.commands.evotip_dispense import ( + EvotipDispenseParams, + EvotipDispenseResult, + EvotipDispenseImplementation, +) +from opentrons.protocol_engine.resources import ModelUtils +from opentrons.protocol_engine.state.state import StateView +from opentrons.protocol_engine.state import update_types + +from opentrons_shared_data import load_shared_data + + +@pytest.fixture +def evotips_definition() -> LabwareDefinition: + """A fixturee of the evotips definition.""" + # TODO (chb 2025-01-29): When we migrate all labware to v3 we can clean this up + return LabwareDefinition.model_validate( + json.loads( + load_shared_data( + "labware/definitions/3/evotips_opentrons_96_labware/1.json" + ) + ) + ) + + +@pytest.fixture +def subject( + pipetting: PipettingHandler, + state_view: StateView, + gantry_mover: GantryMover, + model_utils: ModelUtils, + movement: MovementHandler, + **kwargs: object, +) -> EvotipDispenseImplementation: + """Build a command implementation.""" + return EvotipDispenseImplementation( + pipetting=pipetting, + state_view=state_view, + gantry_mover=gantry_mover, + model_utils=model_utils, + movement=movement, + ) + + +async def test_evotip_dispense_implementation( + decoy: Decoy, + movement: MovementHandler, + gantry_mover: GantryMover, + pipetting: PipettingHandler, + state_view: StateView, + subject: EvotipDispenseImplementation, + evotips_definition: LabwareDefinition, +) -> None: + """It should dispense in place.""" + well_location = LiquidHandlingWellLocation( + origin=WellOrigin.TOP, offset=WellOffset(x=0, y=0, z=0) + ) + + data = EvotipDispenseParams( + pipetteId="pipette-id-abc123", + labwareId="labware-id-abc123", + wellName="A3", + volume=100, + flowRate=456, + ) + + decoy.when( + await movement.move_to_well( + pipette_id="pipette-id-abc123", + labware_id="labware-id-abc123", + well_name="A3", + well_location=well_location, + current_well=None, + force_direct=False, + minimum_z_height=None, + speed=None, + operation_volume=None, + ) + ).then_return(Point(x=1, y=2, z=3)) + + decoy.when(state_view.labware.get_definition("labware-id-abc123")).then_return( + evotips_definition + ) + + decoy.when( + await pipetting.dispense_in_place( + pipette_id="pipette-id-abc123", volume=100.0, flow_rate=456.0, push_out=None + ) + ).then_return(100) + + decoy.when(await gantry_mover.get_position("pipette-id-abc123")).then_return( + Point(1, 2, 3) + ) + + result = await subject.execute(data) + + assert result == SuccessData( + public=EvotipDispenseResult(volume=100), + state_update=update_types.StateUpdate( + pipette_location=update_types.PipetteLocationUpdate( + pipette_id="pipette-id-abc123", + new_location=update_types.Well( + labware_id="labware-id-abc123", + well_name="A3", + ), + new_deck_point=DeckPoint.model_construct(x=1, y=2, z=3), + ), + pipette_aspirated_fluid=update_types.PipetteEjectedFluidUpdate( + pipette_id="pipette-id-abc123", volume=100 + ), + ), + ) diff --git a/api/tests/opentrons/protocol_engine/commands/test_evotip_seal_pipette.py b/api/tests/opentrons/protocol_engine/commands/test_evotip_seal_pipette.py new file mode 100644 index 00000000000..3d1bbeb1406 --- /dev/null +++ b/api/tests/opentrons/protocol_engine/commands/test_evotip_seal_pipette.py @@ -0,0 +1,300 @@ +"""Test evotip seal commands.""" + +import pytest +from datetime import datetime + +from decoy import Decoy, matchers +from unittest.mock import sentinel + +from opentrons.protocols.models import LabwareDefinition + +from opentrons_shared_data.errors.exceptions import StallOrCollisionDetectedError + +from opentrons.types import MountType, Point + +from opentrons.protocol_engine import ( + WellLocation, + PickUpTipWellLocation, + WellOffset, + DeckPoint, +) +from opentrons.protocol_engine.errors import PickUpTipTipNotAttachedError +from opentrons.protocol_engine.execution import MovementHandler, GantryMover, TipHandler +from opentrons.protocol_engine.resources import ModelUtils +from opentrons.protocol_engine.state import update_types +from opentrons.protocol_engine.state.state import StateView +from opentrons.protocol_engine.types import TipGeometry, FluidKind, AspiratedFluid + +from opentrons.protocol_engine.commands.movement_common import StallOrCollisionError +from opentrons.protocol_engine.commands.command import DefinedErrorData, SuccessData +from opentrons.protocol_engine.commands.evotip_seal_pipette import ( + EvotipSealPipetteParams, + EvotipSealPipetteResult, + EvotipSealPipetteImplementation, +) +from opentrons.protocol_engine.execution import ( + PipettingHandler, +) +from opentrons.hardware_control import HardwareControlAPI +import json +from opentrons_shared_data import load_shared_data + + +@pytest.fixture +def evotips_definition() -> LabwareDefinition: + """A fixturee of the evotips definition.""" + # TODO (chb 2025-01-29): When we migrate all labware to v3 we can clean this up + return LabwareDefinition.model_validate( + json.loads( + load_shared_data( + "labware/definitions/3/evotips_opentrons_96_labware/1.json" + ) + ) + ) + + +async def test_success( + decoy: Decoy, + state_view: StateView, + movement: MovementHandler, + tip_handler: TipHandler, + model_utils: ModelUtils, + gantry_mover: GantryMover, + evotips_definition: LabwareDefinition, + hardware_api: HardwareControlAPI, + pipetting: PipettingHandler, +) -> None: + """A PickUpTip command should have an execution implementation.""" + subject = EvotipSealPipetteImplementation( + state_view=state_view, + movement=movement, + tip_handler=tip_handler, + model_utils=model_utils, + gantry_mover=gantry_mover, + hardware_api=hardware_api, + pipetting=pipetting, + ) + + decoy.when(state_view.pipettes.get_mount("pipette-id")).then_return(MountType.LEFT) + + decoy.when( + state_view.geometry.convert_pick_up_tip_well_location( + well_location=PickUpTipWellLocation(offset=WellOffset(x=1, y=2, z=3)) + ) + ).then_return(WellLocation(offset=WellOffset(x=1, y=2, z=3))) + + decoy.when(state_view.labware.get_definition("labware-id")).then_return( + evotips_definition + ) + decoy.when( + await movement.move_to_well( + pipette_id="pipette-id", + labware_id="labware-id", + well_name="A3", + well_location=WellLocation(offset=WellOffset(x=1, y=2, z=3)), + current_well=None, + force_direct=False, + minimum_z_height=None, + speed=None, + operation_volume=None, + ) + ).then_return(Point(x=111, y=222, z=333)) + decoy.when( + state_view.geometry.get_nominal_tip_geometry("pipette-id", "labware-id", "A3") + ).then_return(TipGeometry(length=42, diameter=5, volume=300)) + decoy.when(state_view.pipettes.get_maximum_volume("pipette-id")).then_return(1000) + + decoy.when( + await tip_handler.pick_up_tip( + pipette_id="pipette-id", + labware_id="labware-id", + well_name="A3", + ) + ).then_return(TipGeometry(length=42, diameter=5, volume=300)) + + result = await subject.execute( + EvotipSealPipetteParams( + pipetteId="pipette-id", + labwareId="labware-id", + wellName="A3", + wellLocation=PickUpTipWellLocation(offset=WellOffset(x=1, y=2, z=3)), + ) + ) + + assert result == SuccessData( + public=EvotipSealPipetteResult( + tipLength=42, + tipVolume=300, + tipDiameter=5, + position=DeckPoint(x=111, y=222, z=333), + ), + state_update=update_types.StateUpdate( + pipette_tip_state=update_types.PipetteTipStateUpdate( + pipette_id="pipette-id", + tip_geometry=TipGeometry(length=42, diameter=5, volume=300), + ), + pipette_aspirated_fluid=update_types.PipetteAspiratedFluidUpdate( + pipette_id="pipette-id", + fluid=AspiratedFluid(kind=FluidKind.LIQUID, volume=1000), + ), + ), + ) + + +async def test_no_tip_physically_missing_error( + decoy: Decoy, + state_view: StateView, + movement: MovementHandler, + tip_handler: TipHandler, + model_utils: ModelUtils, + gantry_mover: GantryMover, + hardware_api: HardwareControlAPI, + pipetting: PipettingHandler, + evotips_definition: LabwareDefinition, +) -> None: + """It should not return a TipPhysicallyMissingError even though evotips do not sit high enough on the pipette to be detected by the tip sensor.""" + subject = EvotipSealPipetteImplementation( + state_view=state_view, + movement=movement, + tip_handler=tip_handler, + model_utils=model_utils, + gantry_mover=gantry_mover, + hardware_api=hardware_api, + pipetting=pipetting, + ) + + pipette_id = "pipette-id" + labware_id = "labware-id" + well_name = "well-name" + error_id = "error-id" + error_created_at = datetime(1234, 5, 6) + + decoy.when( + state_view.geometry.convert_pick_up_tip_well_location( + well_location=PickUpTipWellLocation(offset=WellOffset()) + ) + ).then_return(WellLocation(offset=WellOffset())) + + decoy.when( + await movement.move_to_well( + pipette_id="pipette-id", + labware_id="labware-id", + well_name="well-name", + well_location=WellLocation(offset=WellOffset()), + current_well=None, + force_direct=False, + minimum_z_height=None, + speed=None, + operation_volume=None, + ) + ).then_return(Point(x=111, y=222, z=333)) + decoy.when( + state_view.geometry.get_nominal_tip_geometry(pipette_id, labware_id, well_name) + ).then_return(TipGeometry(length=42, diameter=5, volume=300)) + + decoy.when( + await tip_handler.pick_up_tip( + pipette_id=pipette_id, labware_id=labware_id, well_name=well_name + ) + ).then_raise(PickUpTipTipNotAttachedError(tip_geometry=sentinel.tip_geometry)) + decoy.when(model_utils.generate_id()).then_return(error_id) + decoy.when(model_utils.get_timestamp()).then_return(error_created_at) + decoy.when(state_view.labware.get_definition(labware_id)).then_return( + evotips_definition + ) + decoy.when(state_view.pipettes.get_maximum_volume(pipette_id)).then_return(1000) + + result = await subject.execute( + EvotipSealPipetteParams( + pipetteId=pipette_id, labwareId=labware_id, wellName=well_name + ) + ) + + assert result == SuccessData( + public=EvotipSealPipetteResult( + tipLength=42, + tipVolume=300, + tipDiameter=5, + position=DeckPoint(x=111, y=222, z=333), + ), + state_update=update_types.StateUpdate( + pipette_tip_state=update_types.PipetteTipStateUpdate( + pipette_id="pipette-id", + tip_geometry=TipGeometry(length=42, diameter=5, volume=300), + ), + pipette_aspirated_fluid=update_types.PipetteAspiratedFluidUpdate( + pipette_id="pipette-id", + fluid=AspiratedFluid(kind=FluidKind.LIQUID, volume=1000), + ), + ), + ) + + +async def test_stall_error( + decoy: Decoy, + state_view: StateView, + movement: MovementHandler, + tip_handler: TipHandler, + model_utils: ModelUtils, + gantry_mover: GantryMover, + hardware_api: HardwareControlAPI, + pipetting: PipettingHandler, + evotips_definition: LabwareDefinition, +) -> None: + """It should return a TipPhysicallyMissingError if the HW API indicates that.""" + subject = EvotipSealPipetteImplementation( + state_view=state_view, + movement=movement, + tip_handler=tip_handler, + model_utils=model_utils, + gantry_mover=gantry_mover, + hardware_api=hardware_api, + pipetting=pipetting, + ) + + pipette_id = "pipette-id" + labware_id = "labware-id" + well_name = "well-name" + error_id = "error-id" + error_created_at = datetime(1234, 5, 6) + + decoy.when( + state_view.geometry.convert_pick_up_tip_well_location( + well_location=PickUpTipWellLocation(offset=WellOffset()) + ) + ).then_return(WellLocation(offset=WellOffset())) + + decoy.when( + await movement.move_to_well( + pipette_id="pipette-id", + labware_id="labware-id", + well_name="well-name", + well_location=WellLocation(offset=WellOffset()), + current_well=None, + force_direct=False, + minimum_z_height=None, + speed=None, + operation_volume=None, + ) + ).then_raise(StallOrCollisionDetectedError()) + + decoy.when(model_utils.generate_id()).then_return(error_id) + decoy.when(model_utils.get_timestamp()).then_return(error_created_at) + decoy.when(state_view.labware.get_definition(labware_id)).then_return( + evotips_definition + ) + + result = await subject.execute( + EvotipSealPipetteParams( + pipetteId=pipette_id, labwareId=labware_id, wellName=well_name + ) + ) + + assert result == DefinedErrorData( + public=StallOrCollisionError.model_construct( + id=error_id, createdAt=error_created_at, wrappedErrors=[matchers.Anything()] + ), + state_update=update_types.StateUpdate( + pipette_location=update_types.CLEAR, + ), + ) diff --git a/api/tests/opentrons/protocol_engine/commands/test_evotip_unseal_pipette.py b/api/tests/opentrons/protocol_engine/commands/test_evotip_unseal_pipette.py new file mode 100644 index 00000000000..5f1c94c3dd6 --- /dev/null +++ b/api/tests/opentrons/protocol_engine/commands/test_evotip_unseal_pipette.py @@ -0,0 +1,330 @@ +"""Test evotip unseal commands.""" + +from datetime import datetime + +import pytest +from decoy import Decoy, matchers + +from opentrons_shared_data.errors.exceptions import StallOrCollisionDetectedError + +from opentrons.protocol_engine import ( + DropTipWellLocation, + DropTipWellOrigin, + WellLocation, + WellOffset, + DeckPoint, +) +from opentrons.protocol_engine.commands.command import DefinedErrorData, SuccessData +from opentrons.protocol_engine.commands.evotip_unseal_pipette import ( + EvotipUnsealPipetteParams, + EvotipUnsealPipetteResult, + EvotipUnsealPipetteImplementation, +) +from opentrons.protocol_engine.commands.movement_common import StallOrCollisionError +from opentrons.protocol_engine.errors.exceptions import TipAttachedError +from opentrons.protocol_engine.resources.model_utils import ModelUtils +from opentrons.protocol_engine.state import update_types +from opentrons.protocol_engine.state.state import StateView +from opentrons.protocol_engine.execution import MovementHandler, GantryMover, TipHandler +from opentrons.protocols.models import LabwareDefinition +import json +from opentrons_shared_data import load_shared_data + +from opentrons.types import Point + + +@pytest.fixture +def mock_state_view(decoy: Decoy) -> StateView: + """Get a mock StateView.""" + return decoy.mock(cls=StateView) + + +@pytest.fixture +def mock_movement_handler(decoy: Decoy) -> MovementHandler: + """Get a mock MovementHandler.""" + return decoy.mock(cls=MovementHandler) + + +@pytest.fixture +def mock_tip_handler(decoy: Decoy) -> TipHandler: + """Get a mock TipHandler.""" + return decoy.mock(cls=TipHandler) + + +@pytest.fixture +def mock_model_utils(decoy: Decoy) -> ModelUtils: + """Get a mock ModelUtils.""" + return decoy.mock(cls=ModelUtils) + + +def test_drop_tip_params_defaults() -> None: + """A drop tip should use a `WellOrigin.DROP_TIP` by default.""" + default_params = EvotipUnsealPipetteParams.model_validate( + {"pipetteId": "abc", "labwareId": "def", "wellName": "ghj"} + ) + + assert default_params.wellLocation == DropTipWellLocation( + origin=DropTipWellOrigin.DEFAULT, offset=WellOffset(x=0, y=0, z=0) + ) + + +def test_drop_tip_params_default_origin() -> None: + """A drop tip should drop a `WellOrigin.DROP_TIP` by default even if an offset is given.""" + default_params = EvotipUnsealPipetteParams.model_validate( + { + "pipetteId": "abc", + "labwareId": "def", + "wellName": "ghj", + "wellLocation": {"offset": {"x": 1, "y": 2, "z": 3}}, + } + ) + + assert default_params.wellLocation == DropTipWellLocation( + origin=DropTipWellOrigin.DEFAULT, offset=WellOffset(x=1, y=2, z=3) + ) + + +@pytest.fixture +def evotips_definition() -> LabwareDefinition: + """A fixturee of the evotips definition.""" + # TODO (chb 2025-01-29): When we migrate all labware to v3 we can clean this up + return LabwareDefinition.model_validate( + json.loads( + load_shared_data( + "labware/definitions/3/evotips_opentrons_96_labware/1.json" + ) + ) + ) + + +async def test_drop_tip_implementation( + decoy: Decoy, + mock_state_view: StateView, + mock_movement_handler: MovementHandler, + mock_tip_handler: TipHandler, + mock_model_utils: ModelUtils, + gantry_mover: GantryMover, + evotips_definition: LabwareDefinition, +) -> None: + """A DropTip command should have an execution implementation.""" + subject = EvotipUnsealPipetteImplementation( + state_view=mock_state_view, + movement=mock_movement_handler, + tip_handler=mock_tip_handler, + model_utils=mock_model_utils, + gantry_mover=gantry_mover, + ) + + params = EvotipUnsealPipetteParams( + pipetteId="abc", + labwareId="123", + wellName="A3", + wellLocation=DropTipWellLocation(offset=WellOffset(x=1, y=2, z=3)), + ) + decoy.when(mock_state_view.labware.get_definition("123")).then_return( + evotips_definition + ) + + decoy.when( + mock_state_view.pipettes.get_is_partially_configured(pipette_id="abc") + ).then_return(False) + + decoy.when( + mock_state_view.geometry.get_checked_tip_drop_location( + pipette_id="abc", + labware_id="123", + well_location=DropTipWellLocation(offset=WellOffset(x=1, y=2, z=3)), + partially_configured=False, + ) + ).then_return(WellLocation(offset=WellOffset(x=4, y=5, z=6))) + + decoy.when( + await mock_movement_handler.move_to_well( + pipette_id="abc", + labware_id="123", + well_name="A3", + well_location=WellLocation(offset=WellOffset(x=4, y=5, z=6)), + current_well=None, + force_direct=False, + minimum_z_height=None, + speed=None, + operation_volume=None, + ) + ).then_return(Point(x=111, y=222, z=333)) + + result = await subject.execute(params) + + assert result == SuccessData( + public=EvotipUnsealPipetteResult(position=DeckPoint(x=111, y=222, z=333)), + state_update=update_types.StateUpdate( + pipette_location=update_types.PipetteLocationUpdate( + pipette_id="abc", + new_location=update_types.Well( + labware_id="123", + well_name="A3", + ), + new_deck_point=DeckPoint(x=111, y=222, z=333), + ), + pipette_tip_state=update_types.PipetteTipStateUpdate( + pipette_id="abc", tip_geometry=None + ), + pipette_aspirated_fluid=update_types.PipetteUnknownFluidUpdate( + pipette_id="abc" + ), + ), + ) + decoy.verify( + await mock_tip_handler.drop_tip( + pipette_id="abc", + home_after=None, + do_not_ignore_tip_presence=False, + ignore_plunger=True, + ), + times=1, + ) + + +async def test_tip_attached_error( + decoy: Decoy, + mock_state_view: StateView, + mock_movement_handler: MovementHandler, + mock_tip_handler: TipHandler, + mock_model_utils: ModelUtils, + gantry_mover: GantryMover, + evotips_definition: LabwareDefinition, +) -> None: + """A Evotip Unseal command should have an execution implementation.""" + subject = EvotipUnsealPipetteImplementation( + state_view=mock_state_view, + movement=mock_movement_handler, + tip_handler=mock_tip_handler, + model_utils=mock_model_utils, + gantry_mover=gantry_mover, + ) + + params = EvotipUnsealPipetteParams( + pipetteId="abc", + labwareId="123", + wellName="A3", + wellLocation=DropTipWellLocation(offset=WellOffset(x=1, y=2, z=3)), + ) + decoy.when(mock_state_view.labware.get_definition("123")).then_return( + evotips_definition + ) + + decoy.when( + mock_state_view.pipettes.get_is_partially_configured(pipette_id="abc") + ).then_return(False) + + decoy.when( + mock_state_view.geometry.get_checked_tip_drop_location( + pipette_id="abc", + labware_id="123", + well_location=DropTipWellLocation(offset=WellOffset(x=1, y=2, z=3)), + partially_configured=False, + ) + ).then_return(WellLocation(offset=WellOffset(x=4, y=5, z=6))) + + decoy.when( + await mock_movement_handler.move_to_well( + pipette_id="abc", + labware_id="123", + well_name="A3", + well_location=WellLocation(offset=WellOffset(x=4, y=5, z=6)), + current_well=None, + force_direct=False, + minimum_z_height=None, + speed=None, + operation_volume=None, + ) + ).then_return(Point(x=111, y=222, z=333)) + decoy.when( + await mock_tip_handler.drop_tip( + pipette_id="abc", + home_after=None, + do_not_ignore_tip_presence=False, + ignore_plunger=True, + ) + ).then_raise(TipAttachedError("Egads!")) + + decoy.when(mock_model_utils.generate_id()).then_return("error-id") + decoy.when(mock_model_utils.get_timestamp()).then_return( + datetime(year=1, month=2, day=3) + ) + + with pytest.raises(TipAttachedError): + await subject.execute(params) + + +async def test_stall_error( + decoy: Decoy, + mock_state_view: StateView, + mock_movement_handler: MovementHandler, + mock_tip_handler: TipHandler, + mock_model_utils: ModelUtils, + gantry_mover: GantryMover, + evotips_definition: LabwareDefinition, +) -> None: + """A DropTip command should have an execution implementation.""" + subject = EvotipUnsealPipetteImplementation( + state_view=mock_state_view, + movement=mock_movement_handler, + tip_handler=mock_tip_handler, + model_utils=mock_model_utils, + gantry_mover=gantry_mover, + ) + + params = EvotipUnsealPipetteParams( + pipetteId="abc", + labwareId="123", + wellName="A3", + wellLocation=DropTipWellLocation(offset=WellOffset(x=1, y=2, z=3)), + ) + decoy.when(mock_state_view.labware.get_definition("123")).then_return( + evotips_definition + ) + + decoy.when( + mock_state_view.pipettes.get_is_partially_configured(pipette_id="abc") + ).then_return(False) + + decoy.when( + mock_state_view.geometry.get_checked_tip_drop_location( + pipette_id="abc", + labware_id="123", + well_location=DropTipWellLocation(offset=WellOffset(x=1, y=2, z=3)), + partially_configured=False, + ) + ).then_return(WellLocation(offset=WellOffset(x=4, y=5, z=6))) + + decoy.when( + await mock_movement_handler.move_to_well( + pipette_id="abc", + labware_id="123", + well_name="A3", + well_location=WellLocation(offset=WellOffset(x=4, y=5, z=6)), + current_well=None, + force_direct=False, + minimum_z_height=None, + speed=None, + operation_volume=None, + ) + ).then_raise(StallOrCollisionDetectedError()) + + decoy.when(mock_model_utils.generate_id()).then_return("error-id") + decoy.when(mock_model_utils.get_timestamp()).then_return( + datetime(year=1, month=2, day=3) + ) + + result = await subject.execute(params) + + assert result == DefinedErrorData( + public=StallOrCollisionError.model_construct( + id="error-id", + createdAt=datetime(year=1, month=2, day=3), + wrappedErrors=[matchers.Anything()], + ), + state_update=update_types.StateUpdate( + pipette_location=update_types.CLEAR, + ), + ) diff --git a/api/tests/opentrons/protocol_engine/execution/test_gantry_mover.py b/api/tests/opentrons/protocol_engine/execution/test_gantry_mover.py index 2c872c003d1..caa8d0cc3b6 100644 --- a/api/tests/opentrons/protocol_engine/execution/test_gantry_mover.py +++ b/api/tests/opentrons/protocol_engine/execution/test_gantry_mover.py @@ -568,7 +568,9 @@ def _current_position(mount: Mount, refresh: bool) -> Dict[HardwareAxis, float]: pos = await subject.move_axes(axis_map, critical_point, 100, relative_move) decoy.verify( - await ot3_hardware_api.move_axes(position=call_to_hw, speed=100), + await ot3_hardware_api.move_axes( + position=call_to_hw, speed=100, expect_stalls=False + ), times=1, ) assert pos == { diff --git a/api/tests/opentrons/protocol_engine/execution/test_tip_handler.py b/api/tests/opentrons/protocol_engine/execution/test_tip_handler.py index 23f701db80b..b0f5d618361 100644 --- a/api/tests/opentrons/protocol_engine/execution/test_tip_handler.py +++ b/api/tests/opentrons/protocol_engine/execution/test_tip_handler.py @@ -257,7 +257,9 @@ async def test_drop_tip( await subject.drop_tip(pipette_id="pipette-id", home_after=True) decoy.verify( - await mock_hardware_api.tip_drop_moves(mount=Mount.RIGHT, home_after=True) + await mock_hardware_api.tip_drop_moves( + mount=Mount.RIGHT, ignore_plunger=False, home_after=True + ) ) decoy.verify(mock_hardware_api.remove_tip(mount=Mount.RIGHT)) decoy.verify( diff --git a/hardware-testing/hardware_testing/production_qc/gripper_assembly_qc_ot3/test_mount.py b/hardware-testing/hardware_testing/production_qc/gripper_assembly_qc_ot3/test_mount.py index 7d0855e54b4..df40b60e61f 100644 --- a/hardware-testing/hardware_testing/production_qc/gripper_assembly_qc_ot3/test_mount.py +++ b/hardware-testing/hardware_testing/production_qc/gripper_assembly_qc_ot3/test_mount.py @@ -120,7 +120,7 @@ async def _save_result(tag: str, target_z: float, include_pass_fail: bool) -> bo mount, Point(z=-Z_AXIS_TRAVEL_DISTANCE), speed=speed, - _expect_stalls=True, + expect_stalls=True, ) down_end_passed = await _save_result( _get_test_tag(current, speed, "down", "end"), @@ -139,7 +139,7 @@ async def _save_result(tag: str, target_z: float, include_pass_fail: bool) -> bo mount, Point(z=Z_AXIS_TRAVEL_DISTANCE), speed=speed, - _expect_stalls=True, + expect_stalls=True, ) up_end_passed = await _save_result( _get_test_tag(current, speed, "up", "end"), diff --git a/hardware-testing/hardware_testing/production_qc/robot_assembly_qc_ot3/test_instruments.py b/hardware-testing/hardware_testing/production_qc/robot_assembly_qc_ot3/test_instruments.py index a9a86cc6d9b..ef169914ba9 100644 --- a/hardware-testing/hardware_testing/production_qc/robot_assembly_qc_ot3/test_instruments.py +++ b/hardware-testing/hardware_testing/production_qc/robot_assembly_qc_ot3/test_instruments.py @@ -201,10 +201,10 @@ async def _test_gripper(api: OT3API, report: CSVReport, section: str) -> None: target_z = 100 await api.home([z_ax, Axis.G]) start_pos = await api.gantry_position(OT3Mount.GRIPPER) - await api.move_to(mount, start_pos._replace(z=target_z), _expect_stalls=True) + await api.move_to(mount, start_pos._replace(z=target_z), expect_stalls=True) enc_pos = await api.encoder_current_position_ot3(OT3Mount.GRIPPER) if abs(enc_pos[Axis.Z_G] - target_z) < 0.25: - await api.move_to(mount, start_pos, _expect_stalls=True) + await api.move_to(mount, start_pos, expect_stalls=True) if abs(enc_pos[Axis.Z_G] - target_z) < 0.25: result = CSVResult.PASS await api.home([z_ax]) diff --git a/hardware-testing/hardware_testing/production_qc/z_stage_qc_ot3.py b/hardware-testing/hardware_testing/production_qc/z_stage_qc_ot3.py index 8a55a831c45..3ec704686c1 100644 --- a/hardware-testing/hardware_testing/production_qc/z_stage_qc_ot3.py +++ b/hardware-testing/hardware_testing/production_qc/z_stage_qc_ot3.py @@ -259,7 +259,7 @@ async def _force_gauge( mount=mount, abs_position=press_pos, speed=FORCE_SPEED, - _expect_stalls=True, + expect_stalls=True, ) finally: thread_sensor = False diff --git a/shared-data/command/schemas/11.json b/shared-data/command/schemas/11.json index ce6a1575062..8b13c42d01b 100644 --- a/shared-data/command/schemas/11.json +++ b/shared-data/command/schemas/11.json @@ -1589,6 +1589,195 @@ "title": "EngageParams", "type": "object" }, + "EvotipDispenseCreate": { + "description": "DispenseInPlace command request model.", + "properties": { + "commandType": { + "const": "evotipDispense", + "default": "evotipDispense", + "enum": ["evotipDispense"], + "title": "Commandtype", + "type": "string" + }, + "intent": { + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" + }, + "key": { + "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", + "title": "Key", + "type": "string" + }, + "params": { + "$ref": "#/$defs/EvotipDispenseParams" + } + }, + "required": ["params"], + "title": "EvotipDispenseCreate", + "type": "object" + }, + "EvotipDispenseParams": { + "description": "Payload required to dispense in place.", + "properties": { + "flowRate": { + "description": "Speed in \u00b5L/s configured for the pipette", + "exclusiveMinimum": 0.0, + "title": "Flowrate", + "type": "number" + }, + "labwareId": { + "description": "Identifier of labware to use.", + "title": "Labwareid", + "type": "string" + }, + "pipetteId": { + "description": "Identifier of pipette to use for liquid handling.", + "title": "Pipetteid", + "type": "string" + }, + "volume": { + "description": "The amount of liquid to dispense, in \u00b5L. Must not be greater than the currently aspirated volume. There is some tolerance for floating point rounding errors.", + "minimum": 0.0, + "title": "Volume", + "type": "number" + }, + "wellLocation": { + "$ref": "#/$defs/LiquidHandlingWellLocation", + "description": "Relative well location at which to perform the operation" + }, + "wellName": { + "description": "Name of well to use in labware.", + "title": "Wellname", + "type": "string" + } + }, + "required": ["labwareId", "wellName", "flowRate", "volume", "pipetteId"], + "title": "EvotipDispenseParams", + "type": "object" + }, + "EvotipSealPipetteCreate": { + "description": "Seal evotip resin tip command creation request model.", + "properties": { + "commandType": { + "const": "evotipSealPipette", + "default": "evotipSealPipette", + "enum": ["evotipSealPipette"], + "title": "Commandtype", + "type": "string" + }, + "intent": { + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" + }, + "key": { + "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", + "title": "Key", + "type": "string" + }, + "params": { + "$ref": "#/$defs/EvotipSealPipetteParams" + } + }, + "required": ["params"], + "title": "EvotipSealPipetteCreate", + "type": "object" + }, + "EvotipSealPipetteParams": { + "description": "Payload needed to seal resin tips to a pipette.", + "properties": { + "labwareId": { + "description": "Identifier of labware to use.", + "title": "Labwareid", + "type": "string" + }, + "pipetteId": { + "description": "Identifier of pipette to use for liquid handling.", + "title": "Pipetteid", + "type": "string" + }, + "tipPickUpParams": { + "anyOf": [ + { + "$ref": "#/$defs/TipPickUpParams" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Specific parameters for " + }, + "wellLocation": { + "$ref": "#/$defs/PickUpTipWellLocation", + "description": "Relative well location at which to pick up the tip." + }, + "wellName": { + "description": "Name of well to use in labware.", + "title": "Wellname", + "type": "string" + } + }, + "required": ["pipetteId", "labwareId", "wellName"], + "title": "EvotipSealPipetteParams", + "type": "object" + }, + "EvotipUnsealPipetteCreate": { + "description": "Evotip unseal command creation request model.", + "properties": { + "commandType": { + "const": "evotipUnsealPipette", + "default": "evotipUnsealPipette", + "enum": ["evotipUnsealPipette"], + "title": "Commandtype", + "type": "string" + }, + "intent": { + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" + }, + "key": { + "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", + "title": "Key", + "type": "string" + }, + "params": { + "$ref": "#/$defs/EvotipUnsealPipetteParams" + } + }, + "required": ["params"], + "title": "EvotipUnsealPipetteCreate", + "type": "object" + }, + "EvotipUnsealPipetteParams": { + "description": "Payload required to drop a tip in a specific well.", + "properties": { + "labwareId": { + "description": "Identifier of labware to use.", + "title": "Labwareid", + "type": "string" + }, + "pipetteId": { + "description": "Identifier of pipette to use for liquid handling.", + "title": "Pipetteid", + "type": "string" + }, + "wellLocation": { + "$ref": "#/$defs/DropTipWellLocation", + "description": "Relative well location at which to drop the tip." + }, + "wellName": { + "description": "Name of well to use in labware.", + "title": "Wellname", + "type": "string" + } + }, + "required": ["pipetteId", "labwareId", "wellName"], + "title": "EvotipUnsealPipetteParams", + "type": "object" + }, "GetNextTipCreate": { "description": "Get next tip command creation request model.", "properties": { @@ -4564,6 +4753,31 @@ "title": "Submerge", "type": "object" }, + "TipPickUpParams": { + "description": "Payload used to specify press-tip parameters for a seal command.", + "properties": { + "ejectorPushMm": { + "default": 0, + "description": "The distance to back off to ensure that the tip presence sensors are not triggered.", + "title": "Ejectorpushmm", + "type": "number" + }, + "prepDistance": { + "default": 0, + "description": "The distance to move down to fit the tips on.", + "title": "Prepdistance", + "type": "number" + }, + "pressDistance": { + "default": 0, + "description": "The distance to press on tips.", + "title": "Pressdistance", + "type": "number" + } + }, + "title": "TipPickUpParams", + "type": "object" + }, "TipPresenceStatus": { "description": "Tip presence status reported by a pipette.", "enum": ["present", "absent", "unknown"], @@ -5721,6 +5935,9 @@ "dispenseInPlace": "#/$defs/DispenseInPlaceCreate", "dropTip": "#/$defs/DropTipCreate", "dropTipInPlace": "#/$defs/DropTipInPlaceCreate", + "evotipDispense": "#/$defs/EvotipDispenseCreate", + "evotipSealPipette": "#/$defs/EvotipSealPipetteCreate", + "evotipUnsealPipette": "#/$defs/EvotipUnsealPipetteCreate", "getNextTip": "#/$defs/GetNextTipCreate", "getTipPresence": "#/$defs/GetTipPresenceCreate", "heaterShaker/closeLabwareLatch": "#/$defs/CloseLabwareLatchCreate", @@ -5914,6 +6131,15 @@ { "$ref": "#/$defs/TryLiquidProbeCreate" }, + { + "$ref": "#/$defs/EvotipSealPipetteCreate" + }, + { + "$ref": "#/$defs/EvotipDispenseCreate" + }, + { + "$ref": "#/$defs/EvotipUnsealPipetteCreate" + }, { "$ref": "#/$defs/opentrons__protocol_engine__commands__heater_shaker__wait_for_temperature__WaitForTemperatureCreate" }, diff --git a/shared-data/labware/definitions/3/evotips_opentrons_96_labware/1.json b/shared-data/labware/definitions/3/evotips_opentrons_96_labware/1.json index 43b2616c6f5..d2ecbdce217 100644 --- a/shared-data/labware/definitions/3/evotips_opentrons_96_labware/1.json +++ b/shared-data/labware/definitions/3/evotips_opentrons_96_labware/1.json @@ -1025,6 +1025,20 @@ }, "gripHeightFromLabwareBottom": 14.5, "gripForce": 15, + "gripperOffsets": { + "default": { + "pickUpOffset": { + "x": 0, + "y": 0, + "z": 15 + }, + "dropOffset": { + "x": 0, + "y": 0, + "z": 15 + } + } + }, "stackingOffsetWithLabware": { "nest_96_wellplate_2ml_deep": { "x": 0, From 9b963ac4f4df9ae992925761261bd1d14ec6e713 Mon Sep 17 00:00:00 2001 From: Brayan Almonte Date: Fri, 31 Jan 2025 10:28:11 -0500 Subject: [PATCH 053/150] fix(api): fix the test_deck_configuration_provider unit test for the waste+stacker fixtures. (#17393) --- .../test_deck_configuration_provider.py | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/api/tests/opentrons/protocol_engine/resources/test_deck_configuration_provider.py b/api/tests/opentrons/protocol_engine/resources/test_deck_configuration_provider.py index 294266f21a8..49ee42808ee 100644 --- a/api/tests/opentrons/protocol_engine/resources/test_deck_configuration_provider.py +++ b/api/tests/opentrons/protocol_engine/resources/test_deck_configuration_provider.py @@ -211,6 +211,32 @@ def test_get_provided_addressable_area_names( {"D3", "flexStackerModuleV1D4"} ), ), + PotentialCutoutFixture( + cutout_id="cutoutD3", + cutout_fixture_id="flexStackerModuleV1WithWasteChuteRightAdapterCovered", + provided_addressable_areas=frozenset( + { + "1ChannelWasteChute", + "8ChannelWasteChute", + "flexStackerModuleV1D4", + "D3", + } + ), + ), + PotentialCutoutFixture( + cutout_id="cutoutD3", + cutout_fixture_id="flexStackerModuleV1WithWasteChuteRightAdapterNoCover", + provided_addressable_areas=frozenset( + { + "1ChannelWasteChute", + "8ChannelWasteChute", + "96ChannelWasteChute", + "gripperWasteChute", + "flexStackerModuleV1D4", + "D3", + } + ), + ), }, lazy_fixture("ot3_standard_deck_def"), ), From 58c9f45673572797cb85704c8ec887ac1a77a452 Mon Sep 17 00:00:00 2001 From: Sarah Breen Date: Fri, 31 Jan 2025 11:50:53 -0500 Subject: [PATCH 054/150] feat(app): Add missing usp hub port to a few module display locations (#17396) --- app/src/molecules/ModuleInfo/ModuleInfo.tsx | 6 +++++- .../SetupModuleAndDeck/SetupModulesList.tsx | 9 +++++++-- .../DeviceDetailsDeckConfiguration/index.tsx | 14 ++++++++------ .../ChooseModuleToConfigureModal.tsx | 18 ++++++++++++------ 4 files changed, 32 insertions(+), 15 deletions(-) diff --git a/app/src/molecules/ModuleInfo/ModuleInfo.tsx b/app/src/molecules/ModuleInfo/ModuleInfo.tsx index 3e68079bd5f..cbde3fad02c 100644 --- a/app/src/molecules/ModuleInfo/ModuleInfo.tsx +++ b/app/src/molecules/ModuleInfo/ModuleInfo.tsx @@ -48,7 +48,11 @@ export const ModuleInfo = (props: ModuleInfoProps): JSX.Element => { if (physicalPort === null && isAttached) { connectionStatus = t('usb_connected_no_port_info') } else if (physicalPort != null && isAttached) { - connectionStatus = t('usb_port_connected', { port: physicalPort.port }) + const portDisplay = + physicalPort?.hubPort != null + ? `${physicalPort.port}.${physicalPort.hubPort}` + : physicalPort?.port + connectionStatus = t('usb_port_connected', { port: portDisplay }) } return ( diff --git a/app/src/organisms/Desktop/Devices/ProtocolRun/SetupModuleAndDeck/SetupModulesList.tsx b/app/src/organisms/Desktop/Devices/ProtocolRun/SetupModuleAndDeck/SetupModulesList.tsx index e172b6ffb11..81299ca291b 100644 --- a/app/src/organisms/Desktop/Devices/ProtocolRun/SetupModuleAndDeck/SetupModulesList.tsx +++ b/app/src/organisms/Desktop/Devices/ProtocolRun/SetupModuleAndDeck/SetupModulesList.tsx @@ -298,6 +298,11 @@ export function ModulesListItem({ // convert slot name to cutout id const cutoutIdForSlotName = getCutoutIdForSlotName(slotName, deckDef) + const portDisplay = + attachedModuleMatch?.usbPort?.hubPort != null + ? `${attachedModuleMatch.usbPort.port}.${attachedModuleMatch.usbPort.hubPort}` + : attachedModuleMatch?.usbPort?.port + return ( <> {showLocationConflictModal && cutoutIdForSlotName != null ? ( @@ -369,10 +374,10 @@ export function ModulesListItem({ : TC_MODULE_LOCATION_OT2 : slotName} - {attachedModuleMatch?.usbPort.port != null ? ( + {portDisplay != null ? ( {t('usb_port_number', { - port: attachedModuleMatch.usbPort.port, + port: portDisplay, })} ) : null} diff --git a/app/src/organisms/DeviceDetailsDeckConfiguration/index.tsx b/app/src/organisms/DeviceDetailsDeckConfiguration/index.tsx index 1e3ef81960a..617018f23a5 100644 --- a/app/src/organisms/DeviceDetailsDeckConfiguration/index.tsx +++ b/app/src/organisms/DeviceDetailsDeckConfiguration/index.tsx @@ -93,12 +93,14 @@ export function DeviceDetailsDeckConfiguration({ ) { return acc } - const displayName = getFixtureDisplayName( - cutoutFixtureId, - modulesData?.data.find( - m => m.serialNumber === opentronsModuleSerialNumber - )?.usbPort.port - ) + const usbPort = modulesData?.data.find( + m => m.serialNumber === opentronsModuleSerialNumber + )?.usbPort + const portDisplay = + usbPort?.hubPort != null + ? `${usbPort.port}.${usbPort.hubPort}` + : usbPort?.port + const displayName = getFixtureDisplayName(cutoutFixtureId, portDisplay) const fixtureGroup = deckDef.cutoutFixtures.find(cf => cf.id === cutoutFixtureId) ?.fixtureGroup ?? {} diff --git a/app/src/organisms/LocationConflictModal/ChooseModuleToConfigureModal.tsx b/app/src/organisms/LocationConflictModal/ChooseModuleToConfigureModal.tsx index b91a63c7610..06c14cb32dd 100644 --- a/app/src/organisms/LocationConflictModal/ChooseModuleToConfigureModal.tsx +++ b/app/src/organisms/LocationConflictModal/ChooseModuleToConfigureModal.tsx @@ -36,7 +36,7 @@ import type { AttachedModule } from '@opentrons/api-client' const EQUIPMENT_POLL_MS = 5000 interface ModuleFixtureOption { moduleModel: ModuleModel - usbPort?: number + usbPort?: number | string serialNumber?: string } interface ChooseModuleToConfigureModalProps { @@ -82,11 +82,17 @@ export const ChooseModuleToConfigureModal = ( ) ?? [] const connectedOptions: ModuleFixtureOption[] = unconfiguredModuleMatches.map( - attachedMod => ({ - moduleModel: attachedMod.moduleModel, - usbPort: attachedMod.usbPort.port, - serialNumber: attachedMod.serialNumber, - }) + attachedMod => { + const portDisplay = + attachedMod.usbPort.hubPort != null + ? `${attachedMod.usbPort.port}.${attachedMod.usbPort.hubPort}` + : attachedMod.usbPort.port + return { + moduleModel: attachedMod.moduleModel, + usbPort: portDisplay, + serialNumber: attachedMod.serialNumber, + } + } ) const passiveOptions: ModuleFixtureOption[] = requiredModuleModel === MAGNETIC_BLOCK_V1 From e5c8d2702bf2c177cab757a945683accea452936 Mon Sep 17 00:00:00 2001 From: Jamey Huffnagle Date: Fri, 31 Jan 2025 13:13:14 -0500 Subject: [PATCH 055/150] refactor(app): support fullscreen styling for LPC flows on the ODD (#17399) Closes EXEC-1095 --- .../LabwarePositionCheck/LPCWizardFlex.tsx | 20 ++++++------ .../ProtocolSetupOffsets/index.tsx | 7 +++-- app/src/pages/ODD/ProtocolSetup/index.tsx | 31 ++++++++++++++----- 3 files changed, 38 insertions(+), 20 deletions(-) diff --git a/app/src/organisms/LabwarePositionCheck/LPCWizardFlex.tsx b/app/src/organisms/LabwarePositionCheck/LPCWizardFlex.tsx index 4706c2eaaf8..f98c68895c4 100644 --- a/app/src/organisms/LabwarePositionCheck/LPCWizardFlex.tsx +++ b/app/src/organisms/LabwarePositionCheck/LPCWizardFlex.tsx @@ -69,18 +69,18 @@ export function LPCWizardFlex(props: LPCWizardFlexProps): JSX.Element { function LPCWizardFlexComponent(props: LPCWizardContentProps): JSX.Element { const isOnDevice = useSelector(getIsOnDevice) - return createPortal( - isOnDevice ? ( - - - - - ) : ( + return isOnDevice ? ( + <> + + + + ) : ( + createPortal( }> - - ), - getTopPortalEl() + , + getTopPortalEl() + ) ) } diff --git a/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupOffsets/index.tsx b/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupOffsets/index.tsx index bbb51edb9a8..b86d9064a58 100644 --- a/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupOffsets/index.tsx +++ b/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupOffsets/index.tsx @@ -77,7 +77,10 @@ export function ProtocolSetupOffsets({ return ( <> {LPCWizard ?? ( - <> + - + )} ) diff --git a/app/src/pages/ODD/ProtocolSetup/index.tsx b/app/src/pages/ODD/ProtocolSetup/index.tsx index 05dad45ae09..9df261ba131 100644 --- a/app/src/pages/ODD/ProtocolSetup/index.tsx +++ b/app/src/pages/ODD/ProtocolSetup/index.tsx @@ -4,6 +4,7 @@ import { useSelector } from 'react-redux' import { useTranslation } from 'react-i18next' import { useNavigate, useParams } from 'react-router-dom' import first from 'lodash/first' +import { css } from 'styled-components' import { RUN_STATUS_IDLE, RUN_STATUS_STOPPED } from '@opentrons/api-client' import { @@ -91,6 +92,7 @@ import { import { useLPCFlows, LPCFlows } from '/app/organisms/LabwarePositionCheck' import type { Dispatch, SetStateAction } from 'react' +import type { FlattenSimpleInterpolation } from 'styled-components' import type { Run } from '@opentrons/api-client' import type { CutoutFixtureId, CutoutId } from '@opentrons/shared-data' import type { OnDeviceRouteParams } from '/app/App/types' @@ -902,16 +904,29 @@ export function ProtocolSetup(): JSX.Element { onConfirmClick={handleProceedToRunClick} /> ) : null} - + {setupComponentByScreen[setupScreen]} ) } + +const buildSetupScreenStyle = ( + setupScreen: SetupScreens +): FlattenSimpleInterpolation => { + const paddingStyle = (): string => { + switch (setupScreen) { + case 'prepare to run': + return `0 ${SPACING.spacing32} ${SPACING.spacing40}` + case 'offsets': + return '' + default: + return `${SPACING.spacing32} ${SPACING.spacing40} ${SPACING.spacing40}` + } + } + + return css` + flex-direction: ${DIRECTION_COLUMN}; + padding: ${paddingStyle()}; + ` +} From a667e6231a78df0bfe67b2d8cfcfb7f332acef5f Mon Sep 17 00:00:00 2001 From: Sarah Breen Date: Fri, 31 Jan 2025 16:57:27 -0500 Subject: [PATCH 056/150] feat(app): Add new evotips command support to run log (#17402) --- .../en/protocol_command_text.json | 3 + .../hooks/useCommandTextString/index.ts | 3 + .../commandText/getPipettingCommandText.ts | 88 +++++++------------ shared-data/command/types/pipetting.ts | 47 ++++++++++ 4 files changed, 85 insertions(+), 56 deletions(-) diff --git a/app/src/assets/localization/en/protocol_command_text.json b/app/src/assets/localization/en/protocol_command_text.json index c3620eac904..51f37c9fa30 100644 --- a/app/src/assets/localization/en/protocol_command_text.json +++ b/app/src/assets/localization/en/protocol_command_text.json @@ -64,11 +64,13 @@ "pause_on": "Pause on {{robot_name}}", "pickup_tip": "Picking up tip(s) from {{well_range}} of {{labware}} in {{labware_location}}", "prepare_to_aspirate": "Preparing {{pipette}} to aspirate", + "pressurizing_to_dispense": "Pressurize pipette to dispense {{volume}} µL from resin tip at {{flow_rate}} µL/sec", "reloading_labware": "Reloading {{labware}}", "return_tip": "Returning tip to {{well_name}} of {{labware}} in {{labware_location}}", "right": "Right", "row_layout": "row layout", "save_position": "Saving position", + "sealing_to_location": "Sealing to {{labware}} in {{location}}", "set_and_await_hs_shake": "Setting Heater-Shaker to shake at {{rpm}} rpm and waiting until reached", "setting_hs_temp": "Setting Target Temperature of Heater-Shaker to {{temp}}", "setting_temperature_module_temp": "Setting Temperature Module to {{temp}} (rounded to nearest integer)", @@ -89,6 +91,7 @@ "turning_rail_lights_off": "Turning rail lights off", "turning_rail_lights_on": "Turning rail lights on", "unlatching_hs_latch": "Unlatching labware on Heater-Shaker", + "unsealing_from_location": "Unsealing from {{labware}} in {{location}}", "wait_for_duration": "Pausing for {{seconds}} seconds. {{message}}", "wait_for_resume": "Pausing protocol", "waiting_for_hs_to_reach": "Waiting for Heater-Shaker to reach target temperature", diff --git a/app/src/local-resources/commands/hooks/useCommandTextString/index.ts b/app/src/local-resources/commands/hooks/useCommandTextString/index.ts index 3b77c607052..86e8314e20c 100644 --- a/app/src/local-resources/commands/hooks/useCommandTextString/index.ts +++ b/app/src/local-resources/commands/hooks/useCommandTextString/index.ts @@ -91,6 +91,9 @@ export function useCommandTextString( case 'dropTipInPlace': case 'pickUpTip': case 'airGapInPlace': + case 'evotipSealPipette': + case 'evotipUnsealPipette': + case 'evotipDispense': return { kind: 'generic', commandText: utils.getPipettingCommandText(fullParams), diff --git a/app/src/local-resources/commands/hooks/useCommandTextString/utils/commandText/getPipettingCommandText.ts b/app/src/local-resources/commands/hooks/useCommandTextString/utils/commandText/getPipettingCommandText.ts index 2a0d87762b2..38730082699 100644 --- a/app/src/local-resources/commands/hooks/useCommandTextString/utils/commandText/getPipettingCommandText.ts +++ b/app/src/local-resources/commands/hooks/useCommandTextString/utils/commandText/getPipettingCommandText.ts @@ -52,19 +52,21 @@ export const getPipettingCommandText = ({ t, }) + const labwareName = + commandTextData != null + ? getLabwareName({ + loadedLabwares: commandTextData.labware ?? [], + labwareId, + allRunDefs, + }) + : null + switch (command?.commandType) { case 'aspirate': { const { volume, flowRate } = command.params return t('aspirate', { well_name: wellName, - labware: - commandTextData != null - ? getLabwareName({ - loadedLabwares: commandTextData.labware ?? [], - labwareId, - allRunDefs, - }) - : null, + labware: labwareName, labware_location: displayLocation, volume, flow_rate: flowRate, @@ -75,14 +77,7 @@ export const getPipettingCommandText = ({ return pushOut != null ? t('dispense_push_out', { well_name: wellName, - labware: - commandTextData != null - ? getLabwareName({ - loadedLabwares: commandTextData.labware ?? [], - labwareId, - allRunDefs, - }) - : null, + labware: labwareName, labware_location: displayLocation, volume, flow_rate: flowRate, @@ -90,14 +85,7 @@ export const getPipettingCommandText = ({ }) : t('dispense', { well_name: wellName, - labware: - commandTextData != null - ? getLabwareName({ - loadedLabwares: commandTextData.labware ?? [], - labwareId, - allRunDefs, - }) - : null, + labware: labwareName, labware_location: displayLocation, volume, flow_rate: flowRate, @@ -107,14 +95,7 @@ export const getPipettingCommandText = ({ const { flowRate } = command.params return t('blowout', { well_name: wellName, - labware: - commandTextData != null - ? getLabwareName({ - loadedLabwares: commandTextData.labware ?? [], - labwareId, - allRunDefs, - }) - : null, + labware: labwareName, labware_location: displayLocation, flow_rate: flowRate, }) @@ -136,26 +117,12 @@ export const getPipettingCommandText = ({ return Boolean(labwareDef?.parameters.isTiprack) ? t('return_tip', { well_name: wellName, - labware: - commandTextData != null - ? getLabwareName({ - loadedLabwares: commandTextData.labware ?? [], - labwareId, - allRunDefs, - }) - : null, + labware: labwareName, labware_location: displayLocation, }) : t('drop_tip', { well_name: wellName, - labware: - commandTextData != null - ? getLabwareName({ - loadedLabwares: commandTextData.labware ?? [], - labwareId, - allRunDefs, - }) - : null, + labware: labwareName, }) } case 'pickUpTip': { @@ -176,14 +143,7 @@ export const getPipettingCommandText = ({ pipetteName ) : null, - labware: - commandTextData != null - ? getLabwareName({ - loadedLabwares: commandTextData.labware ?? [], - labwareId, - allRunDefs, - }) - : null, + labware: labwareName, labware_location: displayLocation, }) } @@ -213,6 +173,22 @@ export const getPipettingCommandText = ({ const { volume } = command.params return t('air_gap_in_place', { volume }) } + case 'evotipSealPipette': { + return t('sealing_to_location', { + labware: labwareName, + location: displayLocation, + }) + } + case 'evotipUnsealPipette': { + return t('unsealing_from_location', { + labware: labwareName, + location: displayLocation, + }) + } + case 'evotipDispense': { + const { flowRate, volume } = command.params + return t('pressurizing_to_dispense', { volume, flow_rate: flowRate }) + } default: { console.warn( 'PipettingCommandText encountered a command with an unrecognized commandType: ', diff --git a/shared-data/command/types/pipetting.ts b/shared-data/command/types/pipetting.ts index d609af1854b..277af530ce9 100644 --- a/shared-data/command/types/pipetting.ts +++ b/shared-data/command/types/pipetting.ts @@ -21,6 +21,9 @@ export type PipettingRunTimeCommand = | LiquidProbeRunTimeCommand | TryLiquidProbeRunTimeCommand | AirGapInPlaceRunTimeCommand + | EvotipSealRunTimeCommand + | EvotipUnsealRunTimeCommand + | EvotipPressurizeRunTimeCommand export type PipettingCreateCommand = | AspirateCreateCommand @@ -41,6 +44,9 @@ export type PipettingCreateCommand = | LiquidProbeCreateCommand | TryLiquidProbeCreateCommand | AirGapInPlaceCreateCommand + | EvotipSealCreateCommand + | EvotipUnsealCreateCommand + | EvotipPressurizeCreateCommand export interface ConfigureForVolumeCreateCommand extends CommonCommandCreateInfo { @@ -237,6 +243,37 @@ export interface TryLiquidProbeRunTimeCommand result?: Record } +export interface EvotipSealCreateCommand extends CommonCommandCreateInfo { + commandType: 'evotipSealPipette' + params: PipetteAccessParams & WellLocationParam +} +export interface EvotipUnsealCreateCommand extends CommonCommandCreateInfo { + commandType: 'evotipUnsealPipette' + params: PipetteAccessParams & WellLocationParam +} + +export interface EvotipPressurizeCreateCommand extends CommonCommandCreateInfo { + commandType: 'evotipDispense' + params: PipetteAccessParams & + WellLocationParam & + FlowRateParams & + VolumeParams +} +export interface EvotipSealRunTimeCommand + extends CommonCommandRunTimeInfo, + EvotipSealCreateCommand { + result?: EvotipSealResult +} +export interface EvotipUnsealRunTimeCommand + extends CommonCommandRunTimeInfo, + EvotipUnsealCreateCommand { + result?: EvotipUnsealResult +} +export interface EvotipPressurizeRunTimeCommand + extends CommonCommandRunTimeInfo, + EvotipPressurizeCreateCommand { + result?: BasicLiquidHandlingResult +} export type AspDispAirgapParams = FlowRateParams & PipetteAccessParams & VolumeParams & @@ -321,3 +358,13 @@ interface TipPresenceResult { // ot2 should alwasy return unknown status?: 'present' | 'absent' | 'unknown' } + +interface EvotipSealResult { + position: AddressableOffsetVector + tipVolume: number + tipLength: number + tipDiameter: number +} +interface EvotipUnsealResult { + position: AddressableOffsetVector +} From f4921c67f2eb627b38af8d3b4783fff0a367f9c6 Mon Sep 17 00:00:00 2001 From: Jethary Alcid <66035149+jerader@users.noreply.github.com> Date: Mon, 3 Feb 2025 11:21:19 -0500 Subject: [PATCH 057/150] feat(protocol-designer): create Export python feature flag (#17404) closes AUTH-1393 --- .../assets/localization/en/feature_flags.json | 4 ++++ .../src/feature-flags/reducers.ts | 2 ++ .../src/feature-flags/selectors.ts | 4 ++++ protocol-designer/src/feature-flags/types.ts | 2 ++ .../src/pages/ProtocolOverview/index.tsx | 21 ++++++++++++++++++- 5 files changed, 32 insertions(+), 1 deletion(-) diff --git a/protocol-designer/src/assets/localization/en/feature_flags.json b/protocol-designer/src/assets/localization/en/feature_flags.json index d2077d224ea..e20b7011977 100644 --- a/protocol-designer/src/assets/localization/en/feature_flags.json +++ b/protocol-designer/src/assets/localization/en/feature_flags.json @@ -35,5 +35,9 @@ "OT_PD_ENABLE_TIMELINE_SCRUBBER": { "title": "Enable timeline scrubber", "description": "See the protocol timeline visualization in overview" + }, + "OT_PD_ENABLE_PYTHON_EXPORT": { + "title": "Enable exporting python", + "description": "Enables the ability to export python for pd/python interop" } } diff --git a/protocol-designer/src/feature-flags/reducers.ts b/protocol-designer/src/feature-flags/reducers.ts index 8760d08c3ea..d3c66da3490 100644 --- a/protocol-designer/src/feature-flags/reducers.ts +++ b/protocol-designer/src/feature-flags/reducers.ts @@ -32,6 +32,8 @@ const initialFlags: Flags = { process.env.OT_PD_ENABLE_LIQUID_CLASSES === '1' || false, OT_PD_ENABLE_TIMELINE_SCRUBBER: process.env.OT_PD_ENABLE_TIMELINE_SCRUBBER === '1' || false, + OT_PD_ENABLE_PYTHON_EXPORT: + process.env.OT_PD_ENABLE_PYTHON_EXPORT === '1' || false, } // @ts-expect-error(sa, 2021-6-10): cannot use string literals as action type // TODO IMMEDIATELY: refactor this to the old fashioned way if we cannot have type safety: https://github.com/redux-utilities/redux-actions/issues/282#issuecomment-595163081 diff --git a/protocol-designer/src/feature-flags/selectors.ts b/protocol-designer/src/feature-flags/selectors.ts index 9cc722d5388..4d3eb124f18 100644 --- a/protocol-designer/src/feature-flags/selectors.ts +++ b/protocol-designer/src/feature-flags/selectors.ts @@ -49,3 +49,7 @@ export const getEnableTimelineScrubber: Selector = createSelector( getFeatureFlagData, flags => flags.OT_PD_ENABLE_TIMELINE_SCRUBBER ?? false ) +export const getEnablePythonExport: Selector = createSelector( + getFeatureFlagData, + flags => flags.OT_PD_ENABLE_PYTHON_EXPORT ?? false +) diff --git a/protocol-designer/src/feature-flags/types.ts b/protocol-designer/src/feature-flags/types.ts index 20dcbaa8d5e..ec62721abc4 100644 --- a/protocol-designer/src/feature-flags/types.ts +++ b/protocol-designer/src/feature-flags/types.ts @@ -38,6 +38,7 @@ export type FlagTypes = | 'OT_PD_ENABLE_REACT_SCAN' | 'OT_PD_ENABLE_LIQUID_CLASSES' | 'OT_PD_ENABLE_TIMELINE_SCRUBBER' + | 'OT_PD_ENABLE_PYTHON_EXPORT' // flags that are not in this list only show in prerelease mode export const userFacingFlags: FlagTypes[] = [ 'OT_PD_DISABLE_MODULE_RESTRICTIONS', @@ -52,5 +53,6 @@ export const allFlags: FlagTypes[] = [ 'OT_PD_ENABLE_REACT_SCAN', 'OT_PD_ENABLE_LIQUID_CLASSES', 'OT_PD_ENABLE_TIMELINE_SCRUBBER', + 'OT_PD_ENABLE_PYTHON_EXPORT', ] export type Flags = Partial> diff --git a/protocol-designer/src/pages/ProtocolOverview/index.tsx b/protocol-designer/src/pages/ProtocolOverview/index.tsx index 48b302be234..01ffd365e60 100644 --- a/protocol-designer/src/pages/ProtocolOverview/index.tsx +++ b/protocol-designer/src/pages/ProtocolOverview/index.tsx @@ -28,7 +28,10 @@ import { import { selectors as fileSelectors } from '../../file-data' import { selectors as stepFormSelectors } from '../../step-forms' import { actions as loadFileActions } from '../../load-file' -import { getEnableTimelineScrubber } from '../../feature-flags/selectors' +import { + getEnablePythonExport, + getEnableTimelineScrubber, +} from '../../feature-flags/selectors' import { selectors as labwareIngredSelectors } from '../../labware-ingred/selectors' import { MaterialsListModal } from '../../organisms/MaterialsListModal' import { LINE_CLAMP_TEXT_STYLE, COLUMN_STYLE } from '../../atoms' @@ -81,6 +84,7 @@ export function ProtocolOverview(): JSX.Element { showEditInstrumentsModal, setShowEditInstrumentsModal, ] = useState(false) + const enablePythonExport = useSelector(getEnablePythonExport) const enableTimelineScrubber = useSelector(getEnableTimelineScrubber) const [showEditMetadataModal, setShowEditMetadataModal] = useState( false @@ -295,6 +299,21 @@ export function ProtocolOverview(): JSX.Element { whiteSpace={NO_WRAP} height="3.5rem" /> + {enablePythonExport ? ( + { + console.log('wire this up') + }} + whiteSpace={NO_WRAP} + height="3.5rem" + iconName="arrow-right" + css={css` + border: 2px solid ${COLORS.blue50}; + `} + /> + ) : null} From c8419868ce3e4115eef3434f861f2e47897d22de Mon Sep 17 00:00:00 2001 From: Jamey Huffnagle Date: Mon, 3 Feb 2025 13:00:40 -0500 Subject: [PATCH 058/150] feat(app): Enable labware views for LPC Redesign (#17384) Closes EXEC-1102 This commit refactors the LPC data layer to support labware for the redesign. For the Redesign, the geometric identity (the URI) of each labware drives the flow. That is, a user selects a geometric identity, and is then presented with the option to LPC the "default offset" or one of the "applied location offsets" that occurs in the run. Alternatively the user may just view labware offset information here. After selecting a specific offset for which the user wants to perform LPC, a singular "do LPC for only this offset" flow occurs. Because the robot actually does care about a labware instance for loading/unloading labware, we do keep track of one and only one labwareId for each uri, even if there are multiple labware with the same uri in the run. --- .../en/labware_position_check.json | 29 +- .../__tests__/ProtocolRunSetup.test.tsx | 8 + .../LPCFlows/LPCFlows.tsx | 12 +- .../LPCFlows/hooks/index.ts | 1 + .../getLPCLabwareInfoFrom.ts | 93 +++++++ .../getUniqueLabwareLocationComboInfo.ts | 56 ++++ .../LPCFlows/hooks/useLPCLabwareInfo/index.ts | 50 ++++ .../LPCFlows/useLPCFlows.ts | 31 ++- .../LPCWizardContainer.tsx | 6 +- .../LabwarePositionCheck/LPCWizardFlex.tsx | 44 ++- .../LabwarePositionCheck/constants.ts | 7 - .../hooks/useLPCCommands/commands/labware.ts | 14 +- .../hooks/useLPCCommands/commands/modules.ts | 32 +-- .../hooks/useLPCCommands/commands/pipettes.ts | 10 +- .../useHandleConfirmLwFinalPosition.ts | 24 +- .../useHandleConfirmLwModulePlacement.ts | 45 ++-- .../hooks/useLPCCommands/useHandleJog.ts | 14 +- .../useLPCCommands/useHandlePrepModules.ts | 48 +--- .../useLPCCommands/useHandleProbeCommands.ts | 50 ++-- .../useHandleResetLwModulesOnDeck.ts | 13 +- .../hooks/useLPCCommands/useHandleStartLPC.ts | 17 +- ...useHandleValidMoveToMaintenancePosition.ts | 21 +- .../hooks/useLPCInitialState/index.ts | 23 +- .../utils/getActivePipetteId.ts | 20 ++ .../getLPCSteps/getProbeBasedLPCSteps.ts | 95 ------- .../utils/getLPCSteps/index.ts | 30 --- .../hooks/useLPCInitialState/utils/index.ts | 2 +- .../LabwarePositionCheck/redux/index.ts | 1 - .../LabwarePositionCheck/redux/types.ts | 11 - .../steps/AttachProbe.tsx | 33 +-- .../steps/BeforeBeginning/index.tsx | 33 +-- .../steps/DetachProbe.tsx | 36 +-- .../index.tsx => HandleLabware/CheckItem.tsx} | 101 ++++--- .../EditOffset}/LiveOffsetValue.tsx | 7 +- .../EditOffset}/index.tsx | 55 ++-- .../AppliedLocationOffsetsContainer.tsx | 151 +++++++++++ .../DefaultLocationOffset.tsx | 66 +++++ .../HandleLabware/LPCLabwareDetails/index.tsx | 16 ++ .../HandleLabware/LPCLabwareList/index.tsx | 71 +++++ .../PlaceItemInstruction.tsx | 25 +- .../PrepareLabware/index.tsx} | 40 +-- .../steps/HandleLabware/contants.ts | 13 + .../steps/HandleLabware/index.tsx | 33 +++ .../steps/LPCComplete/index.tsx | 13 + .../steps/ResultsSummary/OffsetTable.tsx | 147 ---------- .../steps/ResultsSummary/TableComponent.tsx | 38 --- .../steps/ResultsSummary/index.tsx | 169 ------------ .../LabwarePositionCheck/steps/index.ts | 4 +- .../LabwarePositionCheck/types/index.ts | 1 - .../LabwarePositionCheck/types/steps.ts | 48 ---- .../LegacyApplyHistoricOffsets/index.tsx | 2 +- app/src/redux/protocol-runs/actions/lpc.ts | 56 ++++ app/src/redux/protocol-runs/constants/lpc.ts | 5 - .../protocol-runs/constants/lpc/actions.ts | 10 + .../protocol-runs/constants/lpc/index.ts | 2 + .../protocol-runs/constants/lpc/steps.ts | 25 ++ app/src/redux/protocol-runs/reducer/index.ts | 4 + app/src/redux/protocol-runs/reducer/lpc.ts | 103 ++++++- .../protocol-runs/reducer/transforms/lpc.ts | 86 +++--- .../protocol-runs/selectors/lpc/index.ts | 1 + .../protocol-runs/selectors/lpc/labware.ts | 254 ------------------ .../selectors/lpc/labware/index.ts | 2 + .../selectors/lpc/labware/info.ts | 165 ++++++++++++ .../selectors/lpc/labware/offsets.ts | 134 +++++++++ .../protocol-runs/selectors/lpc/pipettes.ts | 57 ++-- .../protocol-runs/selectors/lpc/steps.ts | 15 ++ .../protocol-runs/selectors/lpc/transforms.ts | 58 +++- app/src/redux/protocol-runs/types/lpc.ts | 133 +++++++-- 68 files changed, 1685 insertions(+), 1334 deletions(-) create mode 100644 app/src/organisms/LabwarePositionCheck/LPCFlows/hooks/index.ts create mode 100644 app/src/organisms/LabwarePositionCheck/LPCFlows/hooks/useLPCLabwareInfo/getLPCLabwareInfoFrom.ts create mode 100644 app/src/organisms/LabwarePositionCheck/LPCFlows/hooks/useLPCLabwareInfo/getUniqueLabwareLocationComboInfo.ts create mode 100644 app/src/organisms/LabwarePositionCheck/LPCFlows/hooks/useLPCLabwareInfo/index.ts delete mode 100644 app/src/organisms/LabwarePositionCheck/constants.ts create mode 100644 app/src/organisms/LabwarePositionCheck/hooks/useLPCInitialState/utils/getActivePipetteId.ts delete mode 100644 app/src/organisms/LabwarePositionCheck/hooks/useLPCInitialState/utils/getLPCSteps/getProbeBasedLPCSteps.ts delete mode 100644 app/src/organisms/LabwarePositionCheck/hooks/useLPCInitialState/utils/getLPCSteps/index.ts delete mode 100644 app/src/organisms/LabwarePositionCheck/redux/index.ts delete mode 100644 app/src/organisms/LabwarePositionCheck/redux/types.ts rename app/src/organisms/LabwarePositionCheck/steps/{CheckItem/index.tsx => HandleLabware/CheckItem.tsx} (67%) rename app/src/organisms/LabwarePositionCheck/steps/{CheckItem/JogToWell => HandleLabware/EditOffset}/LiveOffsetValue.tsx (92%) rename app/src/organisms/LabwarePositionCheck/steps/{CheckItem/JogToWell => HandleLabware/EditOffset}/index.tsx (86%) create mode 100644 app/src/organisms/LabwarePositionCheck/steps/HandleLabware/LPCLabwareDetails/AppliedLocationOffsetsContainer.tsx create mode 100644 app/src/organisms/LabwarePositionCheck/steps/HandleLabware/LPCLabwareDetails/DefaultLocationOffset.tsx create mode 100644 app/src/organisms/LabwarePositionCheck/steps/HandleLabware/LPCLabwareDetails/index.tsx create mode 100644 app/src/organisms/LabwarePositionCheck/steps/HandleLabware/LPCLabwareList/index.tsx rename app/src/organisms/LabwarePositionCheck/steps/{CheckItem => HandleLabware}/PlaceItemInstruction.tsx (77%) rename app/src/organisms/LabwarePositionCheck/steps/{CheckItem/PrepareSpace.tsx => HandleLabware/PrepareLabware/index.tsx} (79%) create mode 100644 app/src/organisms/LabwarePositionCheck/steps/HandleLabware/contants.ts create mode 100644 app/src/organisms/LabwarePositionCheck/steps/HandleLabware/index.tsx create mode 100644 app/src/organisms/LabwarePositionCheck/steps/LPCComplete/index.tsx delete mode 100644 app/src/organisms/LabwarePositionCheck/steps/ResultsSummary/OffsetTable.tsx delete mode 100644 app/src/organisms/LabwarePositionCheck/steps/ResultsSummary/TableComponent.tsx delete mode 100644 app/src/organisms/LabwarePositionCheck/steps/ResultsSummary/index.tsx delete mode 100644 app/src/organisms/LabwarePositionCheck/types/steps.ts delete mode 100644 app/src/redux/protocol-runs/constants/lpc.ts create mode 100644 app/src/redux/protocol-runs/constants/lpc/actions.ts create mode 100644 app/src/redux/protocol-runs/constants/lpc/index.ts create mode 100644 app/src/redux/protocol-runs/constants/lpc/steps.ts delete mode 100644 app/src/redux/protocol-runs/selectors/lpc/labware.ts create mode 100644 app/src/redux/protocol-runs/selectors/lpc/labware/index.ts create mode 100644 app/src/redux/protocol-runs/selectors/lpc/labware/info.ts create mode 100644 app/src/redux/protocol-runs/selectors/lpc/labware/offsets.ts create mode 100644 app/src/redux/protocol-runs/selectors/lpc/steps.ts diff --git a/app/src/assets/localization/en/labware_position_check.json b/app/src/assets/localization/en/labware_position_check.json index 4072826650a..7cdd8cce2d1 100644 --- a/app/src/assets/localization/en/labware_position_check.json +++ b/app/src/assets/localization/en/labware_position_check.json @@ -2,7 +2,9 @@ "adapter_in_mod_in_slot": "{{adapter}} in {{module}} in {{slot}}", "adapter_in_slot": "{{adapter}} in {{slot}}", "adapter_in_tc": "{{adapter}} in {{module}}", + "add": "Add", "all_modules_and_labware_from_protocol": "All modules and labware used in the protocol {{protocol_name}}", + "applied_location_offsets": "Applied Location Offsets", "applied_offset_data": "Applied Labware Offset data", "apply_offset_data": "Apply labware offset data", "apply_offsets": "apply offsets", @@ -24,9 +26,10 @@ "confirm_position_and_move": "Confirm position, move to slot {{next_slot}}", "confirm_position_and_pick_up_tip": "Confirm position, pick up tip", "confirm_position_and_return_tip": "Confirm position, return tip to Slot {{next_slot}} and home", + "default_labware_offset": "Default Labware Offset", "detach_probe": "Remove calibration probe", - "ensure_nozzle_position_odd": "Ensure that the {{tip_type}} is centered above and level with {{item_location}}. If it isn't, tap Move pipette and then jog the pipette until it is properly aligned.", "ensure_nozzle_position_desktop": "Ensure that the {{tip_type}} is centered above and level with {{item_location}}. If it isn't, use the controls below or your keyboard to jog the pipette until it is properly aligned.", + "ensure_nozzle_position_odd": "Ensure that the {{tip_type}} is centered above and level with {{item_location}}. If it isn't, tap Move pipette and then jog the pipette until it is properly aligned.", "exit_screen_confirm_exit": "Exit and discard all labware offsets", "exit_screen_go_back": "Go back to labware position check", "exit_screen_subtitle": "If you exit now, all labware offsets will be discarded. This cannot be undone.", @@ -35,9 +38,10 @@ "install_probe": "Take the calibration probe from its storage location. Ensure its collar is fully unlocked. Push the pipette ejector up and press the probe firmly onto the {{location}} pipette nozzle as far as it can go. Twist the collar to lock the probe. Test that the probe is secure by gently pulling it back and forth.", "jog_controls_adjustment": "Need to make an adjustment?", "jupyter_notebook": "Jupyter Notebook", + "labware": "labware", "labware_display_location_text": "Deck Slot {{slot}}", - "labware_offset_data": "labware offset data", "labware_offset": "Labware Offset", + "labware_offset_data": "labware offset data", "labware_offsets_deleted_warning": "Once you begin Labware Position Check, previously created Labware Offsets will be discarded.", "labware_offsets_summary_labware": "Labware", "labware_offsets_summary_location": "Location", @@ -46,23 +50,23 @@ "labware_position_check_description": "Labware Position Check is a guided workflow that checks every labware on the deck for an added degree of precision in your protocol.Labware Position Check first checks tip racks, and then checks all other labware used in your protocol.", "labware_position_check_overview": "Labware Position Check Overview", "labware_position_check_title": "Labware Position Check", - "labware_step_detail_labware_plural": "The tips should be centered above column 1 in {{labware_name}} and level with the top of the labware.", "labware_step_detail_labware": "The tip should be centered above A1 in {{labware_name}} and level with the top of the labware.", + "labware_step_detail_labware_plural": "The tips should be centered above column 1 in {{labware_name}} and level with the top of the labware.", "labware_step_detail_link": "See how to tell if the pipette is centered", "labware_step_detail_modal_heading": "How to tell if the pipette is centered and level", + "labware_step_detail_modal_nozzle": "To ensure that the nozzle is centered, check from a second side of your OT-2.", "labware_step_detail_modal_nozzle_image_1_text": "Viewed from front, it appears centered...", "labware_step_detail_modal_nozzle_image_2_nozzle_text": "Nozzle is not centered", "labware_step_detail_modal_nozzle_image_2_text": "...but viewed from side, it requires adjustment", + "labware_step_detail_modal_nozzle_or_tip": "To ensure the nozzle or tip is level with the top of the labware, position yourself at eye-level and/or slide a sheet of paper between the nozzle and tip.", "labware_step_detail_modal_nozzle_or_tip_image_1_text": "Viewed from standing height, it appears level...", "labware_step_detail_modal_nozzle_or_tip_image_2_nozzle_text": "Nozzle is not level", "labware_step_detail_modal_nozzle_or_tip_image_2_text": "... but viewed from eye-level, it requires adjustment", "labware_step_detail_modal_nozzle_or_tip_image_3_text": "If you’re having trouble, slide 1 sheet of printer paper between the nozzle and the tip. A single piece of paper should barely pass between them.", - "labware_step_detail_modal_nozzle_or_tip": "To ensure the nozzle or tip is level with the top of the labware, position yourself at eye-level and/or slide a sheet of paper between the nozzle and tip.", - "labware_step_detail_modal_nozzle": "To ensure that the nozzle is centered, check from a second side of your OT-2.", - "labware_step_detail_tiprack_plural": "The pipette nozzles should be centered above column 1 in {{tiprack_name}} and level with the top of the tips.", "labware_step_detail_tiprack": "The pipette nozzle should be centered above A1 in {{tiprack_name}} and level with the top of the tip.", - "labware": "labware", + "labware_step_detail_tiprack_plural": "The pipette nozzles should be centered above column 1 in {{tiprack_name}} and level with the top of the tips.", "learn_more": "Learn more", + "legacy_no_offset_data": "No offset data available", "location": "location", "lpc_complete_summary_screen_heading": "Labware Position Check Complete", "module_display_location_text": "{{moduleName}} in Deck Slot {{slot}}", @@ -73,10 +77,10 @@ "new_labware_offset_data": "New labware offset data", "ninety_six_probe_location": "A1 (back left corner)", "no_labware_offsets": "No Labware Offset", + "no_offset_data": "No offset data", "no_offset_data_available": "No labware offset data available", "no_offset_data_on_robot": "This robot has no useable labware offset data for this run.", - "no_offset_data": "No offset data available", - "offsets": "offsets", + "offsets": "Offsets", "pick_up_tip_from_rack_in_location": "Pick up tip from tip rack in {{location}}", "picking_up_tip_title": "Picking up tip in slot {{slot}}", "pipette_nozzle": "pipette nozzle furthest from you", @@ -98,13 +102,14 @@ "robot_has_no_offsets_from_previous_runs": "Labware offset data references previous protocol run labware locations to save you time. If all the labware in this protocol have been checked in previous runs, that data will be applied to this run. You can add new offsets with Labware Position Check in later steps.", "robot_has_offsets_from_previous_runs": "This robot has offsets for labware used in this protocol. If you apply these offsets, you can still adjust them with Labware Position Check.", "robot_in_motion": "Stand back, robot is in motion.", - "run_labware_position_check": "run labware position check", "run": "Run", + "run_labware_position_check": "run labware position check", "secondary_pipette_tipracks_section": "Check tip racks with {{secondary_mount}} Pipette", "see_how_offsets_work": "See how labware offsets work", - "slot_location": "slot location", - "slot_name": "slot {{slotName}}", + "select_labware_from_list": "Select a labware from the list to check its stored offset data", "slot": "Slot {{slotName}}", + "slot_location": "Slot Location", + "slot_name": "slot {{slotName}}", "start_position_check": "begin labware position check, move to Slot {{initial_labware_slot}}", "stored_offset_data": "Apply Stored Labware Offset Data?", "stored_offsets_for_this_protocol": "Stored Labware Offset data that applies to this protocol", diff --git a/app/src/organisms/Desktop/Devices/ProtocolRun/__tests__/ProtocolRunSetup.test.tsx b/app/src/organisms/Desktop/Devices/ProtocolRun/__tests__/ProtocolRunSetup.test.tsx index 84e7fb82e65..0dd2bc9557b 100644 --- a/app/src/organisms/Desktop/Devices/ProtocolRun/__tests__/ProtocolRunSetup.test.tsx +++ b/app/src/organisms/Desktop/Devices/ProtocolRun/__tests__/ProtocolRunSetup.test.tsx @@ -33,6 +33,7 @@ import { useRobot, useIsFlex } from '/app/redux-resources/robots' import { useRequiredSetupStepsInOrder } from '/app/redux-resources/runs' import { useStoredProtocolAnalysis } from '/app/resources/analysis' import { getMissingSetupSteps } from '/app/redux/protocol-runs' +import { useLPCFlows } from '/app/organisms/LabwarePositionCheck' import { SetupLabware } from '../SetupLabware' import { SetupRobotCalibration } from '../SetupRobotCalibration' @@ -67,6 +68,7 @@ vi.mock('/app/resources/deck_configuration/hooks') vi.mock('/app/redux-resources/robots') vi.mock('/app/redux-resources/runs') vi.mock('/app/resources/analysis') +vi.mock('/app/organisms/LabwarePositionCheck') vi.mock('@opentrons/shared-data', async importOriginal => { const actualSharedData = await importOriginal() return { @@ -186,6 +188,12 @@ describe('ProtocolRunSetup', () => { when(vi.mocked(useModuleCalibrationStatus)) .calledWith(ROBOT_NAME, RUN_ID) .thenReturn({ complete: true }) + vi.mocked(useLPCFlows).mockReturnValue({ + launchLPC: vi.fn(), + lpcProps: null, + showLPC: false, + isLaunchingLPC: false, + }) }) afterEach(() => { vi.resetAllMocks() diff --git a/app/src/organisms/LabwarePositionCheck/LPCFlows/LPCFlows.tsx b/app/src/organisms/LabwarePositionCheck/LPCFlows/LPCFlows.tsx index 5c7ab9bdf3c..5dd041ede77 100644 --- a/app/src/organisms/LabwarePositionCheck/LPCFlows/LPCFlows.tsx +++ b/app/src/organisms/LabwarePositionCheck/LPCFlows/LPCFlows.tsx @@ -4,20 +4,28 @@ import type { RobotType, CompletedProtocolAnalysis, DeckConfiguration, + LabwareDefinition2, } from '@opentrons/shared-data' import type { LabwareOffset } from '@opentrons/api-client' +import type { LPCLabwareInfo } from '/app/redux/protocol-runs' + +// Inject the props specific to the legacy LPC flows, too. +export interface LegacySupportLPCFlowsProps extends LPCFlowsProps { + existingOffsets: LabwareOffset[] +} export interface LPCFlowsProps { onCloseClick: () => void runId: string robotType: RobotType deckConfig: DeckConfiguration - existingOffsets: LabwareOffset[] + labwareDefs: LabwareDefinition2[] + labwareInfo: LPCLabwareInfo mostRecentAnalysis: CompletedProtocolAnalysis protocolName: string maintenanceRunId: string } -export function LPCFlows(props: LPCFlowsProps): JSX.Element { +export function LPCFlows(props: LegacySupportLPCFlowsProps): JSX.Element { return } diff --git a/app/src/organisms/LabwarePositionCheck/LPCFlows/hooks/index.ts b/app/src/organisms/LabwarePositionCheck/LPCFlows/hooks/index.ts new file mode 100644 index 00000000000..93372f3db52 --- /dev/null +++ b/app/src/organisms/LabwarePositionCheck/LPCFlows/hooks/index.ts @@ -0,0 +1 @@ +export { useLPCLabwareInfo } from './useLPCLabwareInfo' diff --git a/app/src/organisms/LabwarePositionCheck/LPCFlows/hooks/useLPCLabwareInfo/getLPCLabwareInfoFrom.ts b/app/src/organisms/LabwarePositionCheck/LPCFlows/hooks/useLPCLabwareInfo/getLPCLabwareInfoFrom.ts new file mode 100644 index 00000000000..2d55747c2e6 --- /dev/null +++ b/app/src/organisms/LabwarePositionCheck/LPCFlows/hooks/useLPCLabwareInfo/getLPCLabwareInfoFrom.ts @@ -0,0 +1,93 @@ +import isEqual from 'lodash/isEqual' + +import { getLabwareDisplayName, getLabwareDefURI } from '@opentrons/shared-data' + +import type { LabwareDefinition2 } from '@opentrons/shared-data' +import type { LPCLabwareInfo, OffsetDetails } from '/app/redux/protocol-runs' +import type { LabwareLocationCombo } from '/app/organisms/LegacyApplyHistoricOffsets/hooks/getLabwareLocationCombos' +import type { UseLPCLabwareInfoProps } from '.' + +interface GetLPCLabwareInfoParams { + lwURIs: string[] + currentOffsets: UseLPCLabwareInfoProps['currentOffsets'] + lwLocationCombos: LabwareLocationCombo[] + labwareDefs: UseLPCLabwareInfoProps['labwareDefs'] +} + +export function getLPCLabwareInfoFrom( + params: GetLPCLabwareInfoParams +): LPCLabwareInfo { + return { selectedLabware: null, labware: getLabwareInfoRecords(params) } +} + +function getLabwareInfoRecords( + params: GetLPCLabwareInfoParams +): LPCLabwareInfo['labware'] { + const labwareDetails: LPCLabwareInfo['labware'] = {} + + params.lwURIs.forEach(uri => { + if (!(uri in labwareDetails)) { + labwareDetails[uri] = { + id: getALabwareIdFromUri({ ...params, uri }), + displayName: getDisplayNameFromUri({ ...params, uri }), + offsetDetails: getOffsetDetailsForLabware({ ...params, uri }), + } + } + }) + + return labwareDetails +} + +type GetLPCLabwareInfoForURI = Omit & { + uri: string +} + +function getALabwareIdFromUri({ + uri, + lwLocationCombos, +}: GetLPCLabwareInfoForURI): string { + return ( + lwLocationCombos.find(combo => combo.definitionUri === uri)?.labwareId ?? '' + ) +} + +function getDisplayNameFromUri({ + uri, + labwareDefs, +}: GetLPCLabwareInfoForURI): string { + const matchedDef = labwareDefs?.find( + def => getLabwareDefURI(def) === uri + ) as LabwareDefinition2 + + return getLabwareDisplayName(matchedDef) +} + +// NOTE: A lot of the logic here acts as temporary adapter that resolves the app's current way of getting offset data (scraping the run record) +// and the end goal of treating labware as first class citizens. +function getOffsetDetailsForLabware({ + currentOffsets, + lwLocationCombos, + uri, +}: GetLPCLabwareInfoForURI): OffsetDetails[] { + return lwLocationCombos.flatMap(comboInfo => { + const { definitionUri, location, ...restInfo } = comboInfo + + const existingOffset = + currentOffsets.find( + offset => + uri === offset.definitionUri && + isEqual(offset.location, comboInfo.location) + ) ?? null + + return { + existingOffset: existingOffset ?? null, + workingOffset: null, + locationDetails: { + ...location, + ...restInfo, + definitionUri, + kind: 'location-specific', + }, + } + }) +} diff --git a/app/src/organisms/LabwarePositionCheck/LPCFlows/hooks/useLPCLabwareInfo/getUniqueLabwareLocationComboInfo.ts b/app/src/organisms/LabwarePositionCheck/LPCFlows/hooks/useLPCLabwareInfo/getUniqueLabwareLocationComboInfo.ts new file mode 100644 index 00000000000..36339823640 --- /dev/null +++ b/app/src/organisms/LabwarePositionCheck/LPCFlows/hooks/useLPCLabwareInfo/getUniqueLabwareLocationComboInfo.ts @@ -0,0 +1,56 @@ +import { isEqual } from 'lodash' + +import { getLabwareDefURI } from '@opentrons/shared-data' + +import { getLabwareLocationCombos } from '/app/organisms/LegacyApplyHistoricOffsets/hooks/getLabwareLocationCombos' + +import type { + CompletedProtocolAnalysis, + LabwareDefinition2, +} from '@opentrons/shared-data' +import type { LabwareLocationCombo } from '/app/organisms/LegacyApplyHistoricOffsets/hooks/getLabwareLocationCombos' + +export interface GetUniqueLocationComboInfoParams { + protocolData: CompletedProtocolAnalysis | null + labwareDefs: LabwareDefinition2[] | null +} + +export function getUniqueLabwareLocationComboInfo({ + labwareDefs, + protocolData, +}: GetUniqueLocationComboInfoParams): LabwareLocationCombo[] { + if (protocolData == null || labwareDefs == null) { + return [] + } + + const { commands, labware, modules = [] } = protocolData + const labwareLocationCombos = getLabwareLocationCombos( + commands, + labware, + modules + ) + + // Filter out duplicate labware and labware that is not LPC-able. + return labwareLocationCombos.reduce( + (acc, labwareLocationCombo) => { + const labwareDef = labwareDefs.find( + def => getLabwareDefURI(def) === labwareLocationCombo.definitionUri + ) + if ( + (labwareDef?.allowedRoles ?? []).includes('adapter') || + (labwareDef?.allowedRoles ?? []).includes('lid') + ) { + return acc + } + // remove duplicate definitionUri in same location + const comboAlreadyExists = acc.some( + accLocationCombo => + labwareLocationCombo.definitionUri === + accLocationCombo.definitionUri && + isEqual(labwareLocationCombo.location, accLocationCombo.location) + ) + return comboAlreadyExists ? acc : [...acc, labwareLocationCombo] + }, + [] + ) +} diff --git a/app/src/organisms/LabwarePositionCheck/LPCFlows/hooks/useLPCLabwareInfo/index.ts b/app/src/organisms/LabwarePositionCheck/LPCFlows/hooks/useLPCLabwareInfo/index.ts new file mode 100644 index 00000000000..56e4bbaf697 --- /dev/null +++ b/app/src/organisms/LabwarePositionCheck/LPCFlows/hooks/useLPCLabwareInfo/index.ts @@ -0,0 +1,50 @@ +import { useMemo } from 'react' + +import { getUniqueLabwareLocationComboInfo } from './getUniqueLabwareLocationComboInfo' +import { getLPCLabwareInfoFrom } from './getLPCLabwareInfoFrom' + +import type { LabwareOffset } from '@opentrons/api-client' +import type { LPCLabwareInfo } from '/app/redux/protocol-runs' +import type { GetUniqueLocationComboInfoParams } from './getUniqueLabwareLocationComboInfo' + +export type UseLPCLabwareInfoProps = GetUniqueLocationComboInfoParams & { + currentOffsets: LabwareOffset[] +} + +// TODO(jh, 01-22-25): This interface will change substantially the switch to /labwareOffsets. + +// Structures LPC-able labware info for injection into LPC flows. +export function useLPCLabwareInfo({ + currentOffsets, + labwareDefs, + protocolData, +}: UseLPCLabwareInfoProps): LPCLabwareInfo { + // Analysis-derived data is the source of truth, because we must account for labware that has offsets AND account for labware + // that does not have offsets. This will change with the LPC HTTP API refactors. + const lwURIs = getLabwareURIsFromAnalysis(protocolData) + const lwLocationCombos = useMemo( + () => + getUniqueLabwareLocationComboInfo({ + labwareDefs, + protocolData, + }), + [labwareDefs != null, protocolData != null] + ) + + return useMemo( + () => + getLPCLabwareInfoFrom({ + lwURIs, + currentOffsets, + lwLocationCombos, + labwareDefs, + }), + [lwURIs.length, currentOffsets.length, lwLocationCombos.length] + ) +} + +function getLabwareURIsFromAnalysis( + analysis: UseLPCLabwareInfoProps['protocolData'] +): string[] { + return analysis?.labware.map(lwInfo => lwInfo.definitionUri) ?? [] +} diff --git a/app/src/organisms/LabwarePositionCheck/LPCFlows/useLPCFlows.ts b/app/src/organisms/LabwarePositionCheck/LPCFlows/useLPCFlows.ts index 1b31d79de0a..836faf02327 100644 --- a/app/src/organisms/LabwarePositionCheck/LPCFlows/useLPCFlows.ts +++ b/app/src/organisms/LabwarePositionCheck/LPCFlows/useLPCFlows.ts @@ -1,5 +1,6 @@ -import { useEffect, useState } from 'react' +import { useEffect, useMemo, useState } from 'react' +import { getLabwareDefinitionsFromCommands } from '@opentrons/components' import { useCreateMaintenanceRunLabwareDefinitionMutation, useDeleteMaintenanceRunMutation, @@ -8,14 +9,18 @@ import { import { useCreateTargetedMaintenanceRunMutation, - useNotifyRunQuery, useMostRecentCompletedAnalysis, + useNotifyRunQuery, } from '/app/resources/runs' import { useNotifyCurrentMaintenanceRun } from '/app/resources/maintenance_runs' +import { useNotifyDeckConfigurationQuery } from '/app/resources/deck_configuration' +import { useLPCLabwareInfo } from '/app/organisms/LabwarePositionCheck/LPCFlows/hooks' import type { RobotType } from '@opentrons/shared-data' -import type { LPCFlowsProps } from '/app/organisms/LabwarePositionCheck/LPCFlows/LPCFlows' -import { useNotifyDeckConfigurationQuery } from '/app/resources/deck_configuration' +import type { + LegacySupportLPCFlowsProps, + LPCFlowsProps, +} from '/app/organisms/LabwarePositionCheck/LPCFlows/LPCFlows' interface UseLPCFlowsBase { showLPC: boolean @@ -29,7 +34,7 @@ interface UseLPCFlowsIdle extends UseLPCFlowsBase { } interface UseLPCFlowsLaunched extends UseLPCFlowsBase { showLPC: true - lpcProps: LPCFlowsProps + lpcProps: LegacySupportLPCFlowsProps isLaunchingLPC: false } export type UseLPCFlowsResult = UseLPCFlowsIdle | UseLPCFlowsLaunched @@ -49,11 +54,21 @@ export function useLPCFlows({ const [isLaunching, setIsLaunching] = useState(false) const [hasCreatedLPCRun, setHasCreatedLPCRun] = useState(false) - const { data: runRecord } = useNotifyRunQuery(runId, { staleTime: Infinity }) const deckConfig = useNotifyDeckConfigurationQuery().data + const { data: runRecord } = useNotifyRunQuery(runId, { staleTime: Infinity }) const currentOffsets = runRecord?.data?.labwareOffsets ?? [] const mostRecentAnalysis = useMostRecentCompletedAnalysis(runId) + const labwareDefs = useMemo( + () => getLabwareDefinitionsFromCommands(mostRecentAnalysis?.commands ?? []), + [mostRecentAnalysis != null] + ) + const labwareInfo = useLPCLabwareInfo({ + currentOffsets, + labwareDefs, + protocolData: mostRecentAnalysis, + }) + useMonitorMaintenanceRunForDeletion({ maintenanceRunId, setMaintenanceRunId }) const { @@ -130,10 +145,12 @@ export function useLPCFlows({ runId, robotType, deckConfig, - existingOffsets: currentOffsets, + labwareDefs, + labwareInfo, mostRecentAnalysis, protocolName, maintenanceRunId, + existingOffsets: currentOffsets, }, } : { launchLPC, isLaunchingLPC: isLaunching, lpcProps: null, showLPC } diff --git a/app/src/organisms/LabwarePositionCheck/LPCWizardContainer.tsx b/app/src/organisms/LabwarePositionCheck/LPCWizardContainer.tsx index 2215cd14bc6..d5a703a79ec 100644 --- a/app/src/organisms/LabwarePositionCheck/LPCWizardContainer.tsx +++ b/app/src/organisms/LabwarePositionCheck/LPCWizardContainer.tsx @@ -3,9 +3,11 @@ import { FLEX_ROBOT_TYPE, OT2_ROBOT_TYPE } from '@opentrons/shared-data' import { LPCWizardFlex } from './LPCWizardFlex' import { LegacyLabwarePositionCheck } from '/app/organisms/LegacyLabwarePositionCheck' -import type { LPCFlowsProps } from '/app/organisms/LabwarePositionCheck/LPCFlows' +import type { LegacySupportLPCFlowsProps } from '/app/organisms/LabwarePositionCheck/LPCFlows' -export function LPCWizardContainer(props: LPCFlowsProps): JSX.Element { +export function LPCWizardContainer( + props: LegacySupportLPCFlowsProps +): JSX.Element { switch (props.robotType) { case FLEX_ROBOT_TYPE: return diff --git a/app/src/organisms/LabwarePositionCheck/LPCWizardFlex.tsx b/app/src/organisms/LabwarePositionCheck/LPCWizardFlex.tsx index f98c68895c4..805b2071227 100644 --- a/app/src/organisms/LabwarePositionCheck/LPCWizardFlex.tsx +++ b/app/src/organisms/LabwarePositionCheck/LPCWizardFlex.tsx @@ -7,10 +7,10 @@ import { ModalShell } from '@opentrons/components' import { getTopPortalEl } from '/app/App/portal' import { BeforeBeginning, - CheckItem, + HandleLabware, AttachProbe, DetachProbe, - ResultsSummary, + LPCComplete, } from '/app/organisms/LabwarePositionCheck/steps' import { ExitConfirmation } from './ExitConfirmation' import { RobotMotionLoader } from './RobotMotionLoader' @@ -20,8 +20,12 @@ import { useLPCCommands, useLPCInitialState, } from '/app/organisms/LabwarePositionCheck/hooks' -import { NAV_STEPS } from '/app/organisms/LabwarePositionCheck/constants' -import { closeLPC, proceedStep } from '/app/redux/protocol-runs' +import { + closeLPC, + proceedStep, + LPC_STEP, + selectCurrentStep, +} from '/app/redux/protocol-runs' import { getIsOnDevice } from '/app/redux/config' import type { LPCFlowsProps } from '/app/organisms/LabwarePositionCheck/LPCFlows' @@ -34,7 +38,6 @@ export interface LPCWizardFlexProps extends Omit {} export function LPCWizardFlex(props: LPCWizardFlexProps): JSX.Element { const { onCloseClick, ...rest } = props - // TODO(jh, 01-14-25): Also inject goBack functionality once designs are finalized. const proceed = (): void => { dispatch(proceedStep(props.runId)) } @@ -118,18 +121,13 @@ function LPCWizardHeader({ function LPCWizardContent(props: LPCWizardContentProps): JSX.Element { const { t } = useTranslation('shared') - const currentStep = useSelector( - (state: State) => - state.protocolRuns[props.runId]?.lpc?.steps.current ?? null - ) + const currentStep = useSelector(selectCurrentStep(props.runId)) const { isRobotMoving, errorMessage, showExitConfirmation, } = props.commandUtils - // TODO(jh, 01-14-25): Handle open door behavior. - // Handle special cases that are shared by multiple steps first. if (isRobotMoving) { return @@ -146,24 +144,24 @@ function LPCWizardContent(props: LPCWizardContentProps): JSX.Element { } // Handle step-based routing. - switch (currentStep.section) { - case NAV_STEPS.BEFORE_BEGINNING: - return + switch (currentStep) { + case LPC_STEP.BEFORE_BEGINNING: + return - case NAV_STEPS.CHECK_POSITIONS: - return + case LPC_STEP.ATTACH_PROBE: + return - case NAV_STEPS.ATTACH_PROBE: - return + case LPC_STEP.HANDLE_LABWARE: + return - case NAV_STEPS.DETACH_PROBE: - return + case LPC_STEP.DETACH_PROBE: + return - case NAV_STEPS.RESULTS_SUMMARY: - return + case LPC_STEP.LPC_COMPLETE: + return default: console.error('Unhandled LPC step.') - return + return } } diff --git a/app/src/organisms/LabwarePositionCheck/constants.ts b/app/src/organisms/LabwarePositionCheck/constants.ts deleted file mode 100644 index 9ccd9b81eef..00000000000 --- a/app/src/organisms/LabwarePositionCheck/constants.ts +++ /dev/null @@ -1,7 +0,0 @@ -export const NAV_STEPS = { - BEFORE_BEGINNING: 'BEFORE_BEGINNING', - ATTACH_PROBE: 'ATTACH_PROBE', - CHECK_POSITIONS: 'CHECK_POSITIONS', - DETACH_PROBE: 'DETACH_PROBE', - RESULTS_SUMMARY: 'RESULTS_SUMMARY', -} as const diff --git a/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/commands/labware.ts b/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/commands/labware.ts index 95cc6db6ccc..fb5b8275cb1 100644 --- a/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/commands/labware.ts +++ b/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/commands/labware.ts @@ -1,14 +1,10 @@ import type { CreateCommand } from '@opentrons/shared-data' -import type { CheckPositionsStep } from '/app/organisms/LabwarePositionCheck/types' +import type { OffsetLocationDetails } from '/app/redux/protocol-runs' -export interface BuildMoveLabwareOffDeckParams { - step: CheckPositionsStep -} - -export function moveLabwareOffDeckCommands({ - step, -}: BuildMoveLabwareOffDeckParams): CreateCommand[] { - const { adapterId, labwareId } = step +export function moveLabwareOffDeckCommands( + offsetLocationDetails: OffsetLocationDetails +): CreateCommand[] { + const { adapterId, labwareId } = offsetLocationDetails return adapterId != null ? [ diff --git a/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/commands/modules.ts b/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/commands/modules.ts index 8c5487a66e9..4982886d5f6 100644 --- a/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/commands/modules.ts +++ b/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/commands/modules.ts @@ -5,27 +5,23 @@ import { THERMOCYCLER_MODULE_TYPE, } from '@opentrons/shared-data' -import type { CheckPositionsStep } from '/app/organisms/LabwarePositionCheck/types' import type { CompletedProtocolAnalysis, CreateCommand, } from '@opentrons/shared-data' -import type { LegacyLabwareOffsetLocation } from '@opentrons/api-client' +import type { OffsetLocationDetails } from '/app/redux/protocol-runs' -export interface BuildModulePrepCommandsParams { - step: CheckPositionsStep -} - -export function modulePrepCommands({ - step, -}: BuildModulePrepCommandsParams): CreateCommand[] { - const { moduleId, location } = step +export function modulePrepCommands( + offsetLocationDetails: OffsetLocationDetails +): CreateCommand[] { + const { moduleId, moduleModel } = offsetLocationDetails const moduleType = (moduleId != null && + moduleModel != null && 'moduleModel' in location && location.moduleModel != null && - getModuleType(location.moduleModel)) ?? + getModuleType(moduleModel)) ?? null if (moduleId == null || moduleType == null) { @@ -79,11 +75,9 @@ export const moduleInitDuringLPCCommands = ( // Not all modules require cleanup after each labware LPC. export const moduleCleanupDuringLPCCommands = ( - step: CheckPositionsStep + offsetLocationDetails: OffsetLocationDetails ): CreateCommand[] => { - const { moduleId, location } = step - - return [...heaterShakerCleanupCommands(moduleId, location)] + return [...heaterShakerCleanupCommands(offsetLocationDetails)] } const heaterShakerInitCommands = ( @@ -127,14 +121,16 @@ const thermocyclerInitCommands = ( } const heaterShakerCleanupCommands = ( - moduleId: string | undefined, - location: LegacyLabwareOffsetLocation + offsetLocationDetails: OffsetLocationDetails ): CreateCommand[] => { + const { moduleId, moduleModel } = offsetLocationDetails + const moduleType = (moduleId != null && + moduleModel != null && 'moduleModel' in location && location.moduleModel != null && - getModuleType(location.moduleModel)) ?? + getModuleType(moduleModel)) ?? null return moduleId != null && diff --git a/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/commands/pipettes.ts b/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/commands/pipettes.ts index fba1f7b025f..0bf32bdcbe0 100644 --- a/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/commands/pipettes.ts +++ b/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/commands/pipettes.ts @@ -5,8 +5,8 @@ import type { LoadedPipette, MotorAxes, } from '@opentrons/shared-data' -import type { CheckPositionsStep } from '/app/organisms/LabwarePositionCheck/types' import type { Axis, Sign, StepSize } from '/app/molecules/JogControls/types' +import type { OffsetLocationDetails } from '/app/redux/protocol-runs' const PROBE_LENGTH_MM = 44.5 @@ -15,9 +15,10 @@ export const savePositionCommands = (pipetteId: string): CreateCommand[] => [ ] export const moveToWellCommands = ( - step: CheckPositionsStep + offsetLocationDetails: OffsetLocationDetails, + pipetteId: string ): CreateCommand[] => { - const { pipetteId, labwareId } = step + const { labwareId } = offsetLocationDetails return [ { @@ -115,7 +116,6 @@ export const moveToMaintenancePosition = ( } export const verifyProbeAttachmentAndHomeCommands = ( - pipetteId: string, pipette: LoadedPipette | null ): CreateCommand[] => { const pipetteMount = pipette?.mount @@ -125,7 +125,7 @@ export const verifyProbeAttachmentAndHomeCommands = ( { commandType: 'verifyTipPresence', params: { - pipetteId, + pipetteId: pipette?.id ?? '', expectedState: 'present', followSingularSensor: 'primary', }, diff --git a/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/useHandleConfirmLwFinalPosition.ts b/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/useHandleConfirmLwFinalPosition.ts index 9c159b4c518..133bab43a8e 100644 --- a/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/useHandleConfirmLwFinalPosition.ts +++ b/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/useHandleConfirmLwFinalPosition.ts @@ -11,7 +11,7 @@ import type { CreateCommand, } from '@opentrons/shared-data' import type { UseLPCCommandWithChainRunChildProps } from './types' -import type { BuildMoveLabwareOffDeckParams } from './commands' +import type { OffsetLocationDetails } from '/app/redux/protocol-runs' interface UseHandleConfirmPositionProps extends UseLPCCommandWithChainRunChildProps { @@ -22,10 +22,8 @@ export interface UseHandleConfirmPositionResult { /* Initiate commands to return specific modules to a post-run condition before * non-plunger homing the utilized pipette and saving the LPC position. */ handleConfirmLwFinalPosition: ( - params: BuildMoveLabwareOffDeckParams & { - onSuccess: () => void - pipette: LoadedPipette | null - } + offsetLocationDetails: OffsetLocationDetails, + pipette: LoadedPipette ) => Promise } @@ -34,26 +32,20 @@ export function useHandleConfirmLwFinalPosition({ chainLPCCommands, }: UseHandleConfirmPositionProps): UseHandleConfirmPositionResult { const handleConfirmLwFinalPosition = ( - params: BuildMoveLabwareOffDeckParams & { - onSuccess: () => void - pipette: LoadedPipette | null - } + offsetLocationDetails: OffsetLocationDetails, + pipette: LoadedPipette ): Promise => { - const { onSuccess, pipette, step } = params - const { pipetteId } = step - const confirmCommands: CreateCommand[] = [ - ...savePositionCommands(pipetteId), + ...savePositionCommands(pipette.id), ...retractPipetteAxesSequentiallyCommands(pipette), - ...moduleCleanupDuringLPCCommands(step), - ...moveLabwareOffDeckCommands(params), + ...moduleCleanupDuringLPCCommands(offsetLocationDetails), + ...moveLabwareOffDeckCommands(offsetLocationDetails), ] return chainLPCCommands(confirmCommands, false).then(responses => { const firstResponse = responses[0] if (firstResponse.data.commandType === 'savePosition') { const { position } = firstResponse.data?.result ?? { position: null } - onSuccess() return Promise.resolve(position) } else { diff --git a/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/useHandleConfirmLwModulePlacement.ts b/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/useHandleConfirmLwModulePlacement.ts index eb58121b6bf..b37763a032f 100644 --- a/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/useHandleConfirmLwModulePlacement.ts +++ b/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/useHandleConfirmLwModulePlacement.ts @@ -10,7 +10,7 @@ import type { CreateCommand, } from '@opentrons/shared-data' import type { UseLPCCommandWithChainRunChildProps } from './types' -import type { CheckPositionsStep } from '/app/organisms/LabwarePositionCheck/types' +import type { OffsetLocationDetails } from '/app/redux/protocol-runs' export interface UseHandleConfirmPlacementProps extends UseLPCCommandWithChainRunChildProps { @@ -21,7 +21,8 @@ export interface UseHandleConfirmPlacementResult { /* Initiate commands to finalize pre-protocol run conditions for specific modules before moving the pipette to the initial LPC position. */ handleConfirmLwModulePlacement: ( - params: BuildMoveLabwareCommandParams + offsetLocationDetails: OffsetLocationDetails, + pipetteId: string ) => Promise } @@ -31,14 +32,13 @@ export function useHandleConfirmLwModulePlacement({ setErrorMessage, }: UseHandleConfirmPlacementProps): UseHandleConfirmPlacementResult { const handleConfirmLwModulePlacement = ( - params: BuildMoveLabwareCommandParams + offsetLocationDetails: OffsetLocationDetails, + pipetteId: string ): Promise => { - const { pipetteId } = params.step - const confirmCommands: CreateCommand[] = [ - ...buildMoveLabwareCommand(params), + ...buildMoveLabwareCommand(offsetLocationDetails), ...moduleInitDuringLPCCommands(mostRecentAnalysis), - ...moveToWellCommands(params.step), + ...moveToWellCommands(offsetLocationDetails, pipetteId), ...savePositionCommands(pipetteId), ] @@ -62,17 +62,21 @@ export function useHandleConfirmLwModulePlacement({ return { handleConfirmLwModulePlacement } } -interface BuildMoveLabwareCommandParams { - step: CheckPositionsStep -} +function buildMoveLabwareCommand( + offsetLocationDetails: OffsetLocationDetails +): MoveLabwareCreateCommand[] { + const { labwareId, moduleId, adapterId, slotName } = offsetLocationDetails -function buildMoveLabwareCommand({ - step, -}: BuildMoveLabwareCommandParams): MoveLabwareCreateCommand[] { - const { labwareId, moduleId, adapterId, location } = step + // TODO(jh, 01-29-25): Once default offsets are implemented, we'll have to load them + // into a slot somehow. Talk to Design. + const locationSpecificSlotName = slotName as string - const newLocation = - moduleId != null ? { moduleId } : { slotName: location.slotName } + const newLocationLabware = + moduleId != null ? { moduleId } : { slotName: locationSpecificSlotName } + const newLocationAdapter = + adapterId != null + ? { labwareId: adapterId } + : { slotName: locationSpecificSlotName } if (adapterId != null) { return [ @@ -80,7 +84,7 @@ function buildMoveLabwareCommand({ commandType: 'moveLabware' as const, params: { labwareId: adapterId, - newLocation, + newLocation: newLocationLabware, strategy: 'manualMoveWithoutPause', }, }, @@ -88,10 +92,7 @@ function buildMoveLabwareCommand({ commandType: 'moveLabware' as const, params: { labwareId, - newLocation: - adapterId != null - ? { labwareId: adapterId } - : { slotName: location.slotName }, + newLocation: newLocationAdapter, strategy: 'manualMoveWithoutPause', }, }, @@ -102,7 +103,7 @@ function buildMoveLabwareCommand({ commandType: 'moveLabware' as const, params: { labwareId, - newLocation, + newLocation: newLocationLabware, strategy: 'manualMoveWithoutPause', }, }, diff --git a/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/useHandleJog.ts b/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/useHandleJog.ts index 9d49cd7835e..d88617262ae 100644 --- a/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/useHandleJog.ts +++ b/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/useHandleJog.ts @@ -4,6 +4,7 @@ import { useSelector } from 'react-redux' import { useCreateMaintenanceCommandMutation } from '@opentrons/react-api-client' import { moveRelativeCommand } from './commands' +import { selectActivePipette } from '/app/redux/protocol-runs' import type { Coordinates } from '@opentrons/shared-data' import type { @@ -12,7 +13,6 @@ import type { Sign, StepSize, } from '/app/molecules/JogControls/types' -import type { State } from '/app/redux/types' import type { UseLPCCommandChildProps } from './types' const JOG_COMMAND_TIMEOUT_MS = 10000 @@ -33,11 +33,10 @@ export function useHandleJog({ maintenanceRunId, setErrorMessage, }: UseHandleJogProps): UseHandleJogResult { - const { current: currentStep } = - useSelector((state: State) => state.protocolRuns[runId]?.lpc?.steps) ?? {} - const [isJogging, setIsJogging] = useState(false) const [jogQueue, setJogQueue] = useState Promise>>([]) + const pipette = useSelector(selectActivePipette(runId)) + const pipetteId = pipette?.id const { createMaintenanceCommand: createSilentCommand, } = useCreateMaintenanceCommandMutation() @@ -50,11 +49,6 @@ export function useHandleJog({ onSuccess?: (position: Coordinates | null) => void ): Promise => { return new Promise((resolve, reject) => { - const pipetteId = - currentStep != null && 'pipetteId' in currentStep - ? currentStep.pipetteId - : null - if (pipetteId != null) { createSilentCommand({ maintenanceRunId, @@ -81,7 +75,7 @@ export function useHandleJog({ } }) }, - [currentStep, maintenanceRunId, createSilentCommand, setErrorMessage] + [pipetteId, maintenanceRunId, createSilentCommand, setErrorMessage] ) const processJogQueue = useCallback((): void => { diff --git a/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/useHandlePrepModules.ts b/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/useHandlePrepModules.ts index 0f944bf74f0..6e87000b46f 100644 --- a/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/useHandlePrepModules.ts +++ b/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/useHandlePrepModules.ts @@ -1,56 +1,34 @@ -import { useSelector } from 'react-redux' - import { modulePrepCommands } from './commands' -import { NAV_STEPS } from '/app/organisms/LabwarePositionCheck/constants' -import { selectActiveLwInitialPosition } from '/app/redux/protocol-runs' +import type { CommandData, VectorOffset } from '@opentrons/api-client' import type { CreateCommand } from '@opentrons/shared-data' import type { UseLPCCommandWithChainRunChildProps } from './types' -import type { LabwarePositionCheckStep } from '/app/organisms/LabwarePositionCheck/types' -import type { CommandData } from '@opentrons/api-client' -import type { State } from '/app/redux/types' +import type { OffsetLocationDetails } from '/app/redux/protocol-runs' export interface UseHandlePrepModulesResult { handleCheckItemsPrepModules: ( - step: LabwarePositionCheckStep | null + offsetLocationDetails: OffsetLocationDetails, + initialPosition: VectorOffset | null ) => Promise } // Prep module(s) before LPCing a specific labware involving module(s). export function useHandlePrepModules({ - runId, chainLPCCommands, }: UseLPCCommandWithChainRunChildProps): UseHandlePrepModulesResult { - const selectInitialPositionFrom = useSelector( - (state: State) => (step: LabwarePositionCheckStep | null) => - selectActiveLwInitialPosition(step, runId, state) - ) - const handleCheckItemsPrepModules = ( - step: LabwarePositionCheckStep | null + offsetLocationDetails: OffsetLocationDetails, + initialPosition: VectorOffset | null ): Promise => { - const initialPosition = selectInitialPositionFrom(step) - - if (step?.section === NAV_STEPS.CHECK_POSITIONS) { - const prepCommands: CreateCommand[] = modulePrepCommands({ - step, - }) + const prepCommands: CreateCommand[] = modulePrepCommands( + offsetLocationDetails + ) - if ( - initialPosition == null && - // Only run these commands during the appropriate step. - step.section === NAV_STEPS.CHECK_POSITIONS && - prepCommands.length > 0 - ) { - return chainLPCCommands(prepCommands, false) - } else { - return Promise.resolve([]) - } + if (initialPosition == null && prepCommands.length > 0) { + return chainLPCCommands(prepCommands, false) + } else { + return Promise.resolve([]) } - - return Promise.reject( - new Error(`Cannot prep modules during unsupported step: ${step?.section}`) - ) } return { handleCheckItemsPrepModules } diff --git a/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/useHandleProbeCommands.ts b/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/useHandleProbeCommands.ts index 8fe77d5c60a..9c3abf18996 100644 --- a/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/useHandleProbeCommands.ts +++ b/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/useHandleProbeCommands.ts @@ -9,15 +9,14 @@ import type { CreateCommand, LoadedPipette } from '@opentrons/shared-data' import type { UseLPCCommandWithChainRunChildProps } from './types' export interface UseProbeCommandsResult { - createProbeAttachmentHandler: ( - pipetteId: string, + handleProbeAttachment: ( pipette: LoadedPipette | null, onSuccess: () => void - ) => () => Promise - createProbeDetachmentHandler: ( + ) => Promise + handleProbeDetachment: ( pipette: LoadedPipette | null, onSuccess: () => void - ) => () => Promise + ) => Promise unableToDetect: boolean setShowUnableToDetect: (canDetect: boolean) => void } @@ -27,45 +26,42 @@ export function useHandleProbeCommands({ }: UseLPCCommandWithChainRunChildProps): UseProbeCommandsResult { const [showUnableToDetect, setShowUnableToDetect] = useState(false) - const createProbeAttachmentHandler = ( - pipetteId: string, + const handleProbeAttachment = ( pipette: LoadedPipette | null, onSuccess: () => void - ): (() => Promise) => { + ): Promise => { const attachmentCommands: CreateCommand[] = [ - ...verifyProbeAttachmentAndHomeCommands(pipetteId, pipette), + ...verifyProbeAttachmentAndHomeCommands(pipette), ] - return () => - chainLPCCommands(attachmentCommands, false, true) - .catch(() => { - setShowUnableToDetect(true) - return Promise.reject(new Error('Unable to detect probe.')) - }) - .then(() => { - setShowUnableToDetect(false) - onSuccess() - }) + return chainLPCCommands(attachmentCommands, false, true) + .catch(() => { + setShowUnableToDetect(true) + return Promise.reject(new Error('Unable to detect probe.')) + }) + .then(() => { + setShowUnableToDetect(false) + onSuccess() + }) } - const createProbeDetachmentHandler = ( + const handleProbeDetachment = ( pipette: LoadedPipette | null, onSuccess: () => void - ): (() => Promise) => { + ): Promise => { const detatchmentCommands: CreateCommand[] = [ ...retractPipetteAxesSequentiallyCommands(pipette), ] - return () => - chainLPCCommands(detatchmentCommands, false).then(() => { - onSuccess() - }) + return chainLPCCommands(detatchmentCommands, false).then(() => { + onSuccess() + }) } return { - createProbeAttachmentHandler, + handleProbeAttachment, unableToDetect: showUnableToDetect, setShowUnableToDetect, - createProbeDetachmentHandler, + handleProbeDetachment, } } diff --git a/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/useHandleResetLwModulesOnDeck.ts b/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/useHandleResetLwModulesOnDeck.ts index b64965e0cc9..0aa61672967 100644 --- a/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/useHandleResetLwModulesOnDeck.ts +++ b/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/useHandleResetLwModulesOnDeck.ts @@ -6,14 +6,11 @@ import { import type { CreateCommand } from '@opentrons/shared-data' import type { UseLPCCommandWithChainRunChildProps } from './types' -import type { - BuildMoveLabwareOffDeckParams, - BuildModulePrepCommandsParams, -} from './commands' +import type { OffsetLocationDetails } from '/app/redux/protocol-runs' export interface UseHandleResetLwModulesOnDeckResult { handleResetLwModulesOnDeck: ( - params: BuildModulePrepCommandsParams & BuildMoveLabwareOffDeckParams + offsetLocationDetails: OffsetLocationDetails ) => Promise } @@ -21,12 +18,12 @@ export function useHandleResetLwModulesOnDeck({ chainLPCCommands, }: UseLPCCommandWithChainRunChildProps): UseHandleResetLwModulesOnDeckResult { const handleResetLwModulesOnDeck = ( - params: BuildModulePrepCommandsParams & BuildMoveLabwareOffDeckParams + offsetLocationDetails: OffsetLocationDetails ): Promise => { const resetCommands: CreateCommand[] = [ - ...modulePrepCommands(params), + ...modulePrepCommands(offsetLocationDetails), ...fullHomeCommands(), - ...moveLabwareOffDeckCommands(params as BuildMoveLabwareOffDeckParams), + ...moveLabwareOffDeckCommands(offsetLocationDetails), ] return chainLPCCommands(resetCommands, false).then(() => Promise.resolve()) diff --git a/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/useHandleStartLPC.ts b/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/useHandleStartLPC.ts index df3270555f6..382870b33bc 100644 --- a/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/useHandleStartLPC.ts +++ b/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/useHandleStartLPC.ts @@ -14,20 +14,20 @@ import type { import type { UseLPCCommandWithChainRunChildProps } from './types' export interface UseHandleStartLPCResult { - createStartLPCHandler: ( + handleStartLPC: ( pipette: LoadedPipette | null, onSuccess: () => void - ) => () => Promise + ) => Promise } export function useHandleStartLPC({ chainLPCCommands, mostRecentAnalysis, }: UseLPCCommandWithChainRunChildProps): UseHandleStartLPCResult { - const createStartLPCHandler = ( + const handleStartLPC = ( pipette: LoadedPipette | null, onSuccess: () => void - ): (() => Promise) => { + ): Promise => { const startCommands: CreateCommand[] = [ ...buildInstrumentLabwarePrepCommands(mostRecentAnalysis), ...moduleInitBeforeAnyLPCCommands(mostRecentAnalysis), @@ -35,13 +35,12 @@ export function useHandleStartLPC({ ...moveToMaintenancePosition(pipette), ] - return () => - chainLPCCommands(startCommands, false).then(() => { - onSuccess() - }) + return chainLPCCommands(startCommands, false).then(() => { + onSuccess() + }) } - return { createStartLPCHandler } + return { handleStartLPC } } // Load all pipettes and labware into the maintenance run by utilizing the protocol resource. diff --git a/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/useHandleValidMoveToMaintenancePosition.ts b/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/useHandleValidMoveToMaintenancePosition.ts index 180cf73f892..f549d860984 100644 --- a/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/useHandleValidMoveToMaintenancePosition.ts +++ b/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/useHandleValidMoveToMaintenancePosition.ts @@ -1,16 +1,13 @@ import { moveToMaintenancePosition } from '/app/organisms/LabwarePositionCheck/hooks/useLPCCommands/commands' -import { NAV_STEPS } from '/app/organisms/LabwarePositionCheck/constants' import type { CommandData } from '@opentrons/api-client' import type { LoadedPipette } from '@opentrons/shared-data' -import type { LabwarePositionCheckStep } from '/app/organisms/LabwarePositionCheck/types' import type { UseLPCCommandWithChainRunChildProps } from '/app/organisms/LabwarePositionCheck/hooks/useLPCCommands/types' export interface UseHandleValidMoveToMaintenancePositionResult { /* Only move to maintenance position during probe steps. */ handleValidMoveToMaintenancePosition: ( - pipette: LoadedPipette | null, - step: LabwarePositionCheckStep | null + pipette: LoadedPipette | null ) => Promise } @@ -19,21 +16,9 @@ export function useHandleValidMoveToMaintenancePosition({ }: UseLPCCommandWithChainRunChildProps): UseHandleValidMoveToMaintenancePositionResult { return { handleValidMoveToMaintenancePosition: ( - pipette: LoadedPipette | null, - step: LabwarePositionCheckStep | null + pipette: LoadedPipette | null ): Promise => { - if ( - step?.section === NAV_STEPS.ATTACH_PROBE || - step?.section === NAV_STEPS.DETACH_PROBE - ) { - return chainLPCCommands(moveToMaintenancePosition(pipette), false) - } else { - return Promise.reject( - new Error( - `Does not move to maintenance position if step is not a probe step. Step: ${step?.section}` - ) - ) - } + return chainLPCCommands(moveToMaintenancePosition(pipette), false) }, } } diff --git a/app/src/organisms/LabwarePositionCheck/hooks/useLPCInitialState/index.ts b/app/src/organisms/LabwarePositionCheck/hooks/useLPCInitialState/index.ts index c39cc30d305..9362a9e8319 100644 --- a/app/src/organisms/LabwarePositionCheck/hooks/useLPCInitialState/index.ts +++ b/app/src/organisms/LabwarePositionCheck/hooks/useLPCInitialState/index.ts @@ -1,12 +1,9 @@ import { useEffect } from 'react' import { useDispatch } from 'react-redux' -import { getLabwareDefinitionsFromCommands } from '@opentrons/components' +import { startLPC, LPC_STEPS } from '/app/redux/protocol-runs' +import { getActivePipetteId } from './utils' -import { startLPC } from '/app/redux/protocol-runs' -import { getLPCSteps } from './utils' - -import type { RunTimeCommand } from '@opentrons/shared-data' import type { LPCWizardState } from '/app/redux/protocol-runs' import type { LPCWizardFlexProps } from '/app/organisms/LabwarePositionCheck/LPCWizardFlex' @@ -16,29 +13,23 @@ export interface UseLPCInitialStateProps export function useLPCInitialState({ mostRecentAnalysis, runId, + labwareDefs, ...rest }: UseLPCInitialStateProps): void { const dispatch = useDispatch() useEffect(() => { - const protocolCommands: RunTimeCommand[] = mostRecentAnalysis.commands - const labwareDefs = getLabwareDefinitionsFromCommands(protocolCommands) - const LPCSteps = getLPCSteps({ - protocolData: mostRecentAnalysis, - labwareDefs, - }) + const activePipetteId = getActivePipetteId(mostRecentAnalysis.pipettes) const initialState: LPCWizardState = { ...rest, protocolData: mostRecentAnalysis, labwareDefs, - workingOffsets: [], + activePipetteId, steps: { currentStepIndex: 0, - totalStepCount: LPCSteps.length, - current: LPCSteps[0], - all: LPCSteps, - next: LPCSteps[1], + totalStepCount: LPC_STEPS.length, + all: LPC_STEPS, }, } diff --git a/app/src/organisms/LabwarePositionCheck/hooks/useLPCInitialState/utils/getActivePipetteId.ts b/app/src/organisms/LabwarePositionCheck/hooks/useLPCInitialState/utils/getActivePipetteId.ts new file mode 100644 index 00000000000..901f5080fb0 --- /dev/null +++ b/app/src/organisms/LabwarePositionCheck/hooks/useLPCInitialState/utils/getActivePipetteId.ts @@ -0,0 +1,20 @@ +import { getPipetteNameSpecs } from '@opentrons/shared-data' + +import type { LoadedPipette } from '@opentrons/shared-data' + +// Return the pipetteId for the pipette in the protocol with the highest channel count. +export function getActivePipetteId(pipettes: LoadedPipette[]): string { + // TODO(jh, 01-30-25): Actually handle the error here if it were to happen. + if (pipettes.length < 1) { + throw new Error( + 'no pipettes in protocol, cannot determine primary pipette for LPC' + ) + } + + return pipettes.reduce((acc, pip) => { + return (getPipetteNameSpecs(acc.pipetteName)?.channels ?? 0) > + (getPipetteNameSpecs(pip.pipetteName)?.channels ?? 0) + ? pip + : acc + }, pipettes[0]).id +} diff --git a/app/src/organisms/LabwarePositionCheck/hooks/useLPCInitialState/utils/getLPCSteps/getProbeBasedLPCSteps.ts b/app/src/organisms/LabwarePositionCheck/hooks/useLPCInitialState/utils/getLPCSteps/getProbeBasedLPCSteps.ts deleted file mode 100644 index b6184663762..00000000000 --- a/app/src/organisms/LabwarePositionCheck/hooks/useLPCInitialState/utils/getLPCSteps/getProbeBasedLPCSteps.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { isEqual } from 'lodash' - -import { getLabwareDefURI, getPipetteNameSpecs } from '@opentrons/shared-data' - -import { NAV_STEPS } from '../../../../constants' -import { getLabwareLocationCombos } from '/app/organisms/LegacyApplyHistoricOffsets/hooks/getLabwareLocationCombos' - -import type { LoadedPipette } from '@opentrons/shared-data' -import type { - LabwarePositionCheckStep, - CheckPositionsStep, -} from '/app/organisms/LabwarePositionCheck/types' -import type { LabwareLocationCombo } from '/app/organisms/LegacyApplyHistoricOffsets/hooks/getLabwareLocationCombos' -import type { GetLPCStepsParams } from '.' - -export function getProbeBasedLPCSteps( - params: GetLPCStepsParams -): LabwarePositionCheckStep[] { - const { protocolData } = params - - return [ - { section: NAV_STEPS.BEFORE_BEGINNING }, - { - section: NAV_STEPS.ATTACH_PROBE, - pipetteId: getPrimaryPipetteId(protocolData.pipettes), - }, - ...getAllCheckSectionSteps(params), - { - section: NAV_STEPS.DETACH_PROBE, - pipetteId: getPrimaryPipetteId(protocolData.pipettes), - }, - { section: NAV_STEPS.RESULTS_SUMMARY }, - ] -} - -function getPrimaryPipetteId(pipettes: LoadedPipette[]): string { - if (pipettes.length < 1) { - throw new Error( - 'no pipettes in protocol, cannot determine primary pipette for LPC' - ) - } - - return pipettes.reduce((acc, pip) => { - return (getPipetteNameSpecs(acc.pipetteName)?.channels ?? 0) > - (getPipetteNameSpecs(pip.pipetteName)?.channels ?? 0) - ? pip - : acc - }, pipettes[0]).id -} - -function getAllCheckSectionSteps({ - labwareDefs, - protocolData, -}: GetLPCStepsParams): CheckPositionsStep[] { - const { pipettes, commands, labware, modules = [] } = protocolData - const labwareLocationCombos = getLabwareLocationCombos( - commands, - labware, - modules - ) - const labwareLocations = labwareLocationCombos.reduce( - (acc, labwareLocationCombo) => { - const labwareDef = labwareDefs.find( - def => getLabwareDefURI(def) === labwareLocationCombo.definitionUri - ) - if ( - (labwareDef?.allowedRoles ?? []).includes('adapter') || - (labwareDef?.allowedRoles ?? []).includes('lid') - ) { - return acc - } - // remove duplicate definitionUri in same location - const comboAlreadyExists = acc.some( - accLocationCombo => - labwareLocationCombo.definitionUri === - accLocationCombo.definitionUri && - isEqual(labwareLocationCombo.location, accLocationCombo.location) - ) - return comboAlreadyExists ? acc : [...acc, labwareLocationCombo] - }, - [] - ) - - return labwareLocations.map( - ({ location, labwareId, moduleId, adapterId, definitionUri }) => ({ - section: NAV_STEPS.CHECK_POSITIONS, - labwareId: labwareId, - pipetteId: getPrimaryPipetteId(pipettes), - location, - moduleId, - adapterId, - definitionUri, - }) - ) -} diff --git a/app/src/organisms/LabwarePositionCheck/hooks/useLPCInitialState/utils/getLPCSteps/index.ts b/app/src/organisms/LabwarePositionCheck/hooks/useLPCInitialState/utils/getLPCSteps/index.ts deleted file mode 100644 index 7121d2cdf98..00000000000 --- a/app/src/organisms/LabwarePositionCheck/hooks/useLPCInitialState/utils/getLPCSteps/index.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { getProbeBasedLPCSteps } from './getProbeBasedLPCSteps' - -import type { - CompletedProtocolAnalysis, - LabwareDefinition2, -} from '@opentrons/shared-data' -import type { LabwarePositionCheckStep } from '/app/organisms/LabwarePositionCheck/types' - -export interface GetLPCStepsParams { - protocolData: CompletedProtocolAnalysis - labwareDefs: LabwareDefinition2[] -} - -// Prepare all LPC steps for injection. -export function getLPCSteps( - params: GetLPCStepsParams -): LabwarePositionCheckStep[] { - if ('pipettes' in params.protocolData) { - if (params.protocolData.pipettes.length === 0) { - throw new Error( - 'no pipettes loaded within protocol, labware position check cannot be performed' - ) - } else { - return getProbeBasedLPCSteps(params) - } - } else { - console.error('expected pipettes to be in protocol data') - return [] - } -} diff --git a/app/src/organisms/LabwarePositionCheck/hooks/useLPCInitialState/utils/index.ts b/app/src/organisms/LabwarePositionCheck/hooks/useLPCInitialState/utils/index.ts index 3fd9dba02b5..06380987129 100644 --- a/app/src/organisms/LabwarePositionCheck/hooks/useLPCInitialState/utils/index.ts +++ b/app/src/organisms/LabwarePositionCheck/hooks/useLPCInitialState/utils/index.ts @@ -1 +1 @@ -export * from './getLPCSteps' +export * from './getActivePipetteId' diff --git a/app/src/organisms/LabwarePositionCheck/redux/index.ts b/app/src/organisms/LabwarePositionCheck/redux/index.ts deleted file mode 100644 index 51a3b4100a9..00000000000 --- a/app/src/organisms/LabwarePositionCheck/redux/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '../types' diff --git a/app/src/organisms/LabwarePositionCheck/redux/types.ts b/app/src/organisms/LabwarePositionCheck/redux/types.ts deleted file mode 100644 index d40d18d91d7..00000000000 --- a/app/src/organisms/LabwarePositionCheck/redux/types.ts +++ /dev/null @@ -1,11 +0,0 @@ -import type { LabwarePositionCheckStep } from '/app/organisms/LabwarePositionCheck/types' - -// TODO(jh, 01-16-25): Remove this once `steps` are refactored out of Redux. - -export interface StepsInfo { - currentStepIndex: number - totalStepCount: number - current: LabwarePositionCheckStep - next: LabwarePositionCheckStep | null - all: LabwarePositionCheckStep[] -} diff --git a/app/src/organisms/LabwarePositionCheck/steps/AttachProbe.tsx b/app/src/organisms/LabwarePositionCheck/steps/AttachProbe.tsx index 5ff197f899d..da84e634b34 100644 --- a/app/src/organisms/LabwarePositionCheck/steps/AttachProbe.tsx +++ b/app/src/organisms/LabwarePositionCheck/steps/AttachProbe.tsx @@ -21,9 +21,7 @@ import attachProbe1 from '/app/assets/videos/pipette-wizard-flows/Pipette_Attach import attachProbe8 from '/app/assets/videos/pipette-wizard-flows/Pipette_Attach_Probe_8.webm' import attachProbe96 from '/app/assets/videos/pipette-wizard-flows/Pipette_Attach_Probe_96.webm' -import type { AttachProbeStep, LPCStepProps } from '../types' -import type { State } from '/app/redux/types' -import type { LPCWizardState } from '/app/redux/protocol-runs' +import type { LPCWizardContentProps } from '/app/organisms/LabwarePositionCheck/types' const StyledVideo = styled.video` padding-top: ${SPACING.spacing4}; @@ -44,33 +42,17 @@ export function AttachProbe({ runId, proceed, commandUtils, - step, -}: LPCStepProps): JSX.Element { +}: LPCWizardContentProps): JSX.Element { const { t, i18n } = useTranslation(['labware_position_check', 'shared']) const isOnDevice = useSelector(getIsOnDevice) - const { steps } = useSelector( - (state: State) => state.protocolRuns[runId]?.lpc as LPCWizardState - ) - const { pipetteId } = step + const pipette = useSelector(selectActivePipette(runId)) const { - createProbeAttachmentHandler, - handleCheckItemsPrepModules, + handleProbeAttachment, toggleRobotMoving, setShowUnableToDetect, unableToDetect, } = commandUtils - const pipette = useSelector((state: State) => - selectActivePipette(step, runId, state) - ) - const channels = useSelector((state: State) => - selectActivePipetteChannelCount(step, runId, state) - ) - - const handleProbeAttached = createProbeAttachmentHandler( - pipetteId, - pipette, - proceed - ) + const channels = useSelector(selectActivePipetteChannelCount(runId)) const { probeLocation, probeVideoSrc } = ((): { probeLocation: string @@ -91,14 +73,13 @@ export function AttachProbe({ const handleProbeCheck = (): void => { void toggleRobotMoving(true) - .then(() => handleProbeAttached()) + .then(() => handleProbeAttachment(pipette, proceed)) .finally(() => toggleRobotMoving(false)) } const handleProceed = (): void => { void toggleRobotMoving(true) - .then(() => handleProbeAttached()) - .then(() => handleCheckItemsPrepModules(steps.next)) + .then(() => handleProbeAttachment(pipette, proceed)) .finally(() => toggleRobotMoving(false)) } diff --git a/app/src/organisms/LabwarePositionCheck/steps/BeforeBeginning/index.tsx b/app/src/organisms/LabwarePositionCheck/steps/BeforeBeginning/index.tsx index c63568c4c60..cfda3476d6b 100644 --- a/app/src/organisms/LabwarePositionCheck/steps/BeforeBeginning/index.tsx +++ b/app/src/organisms/LabwarePositionCheck/steps/BeforeBeginning/index.tsx @@ -14,15 +14,13 @@ import { TwoUpTileLayout } from './TwoUpTileLayout' import { ViewOffsets } from './ViewOffsets' import { SmallButton } from '/app/atoms/buttons' import { getIsOnDevice } from '/app/redux/config' -import { selectActivePipette } from '/app/redux/protocol-runs' +import { + selectActivePipette, + selectLabwareOffsetsForAllLw, +} from '/app/redux/protocol-runs' -import type { - LPCStepProps, - BeforeBeginningStep, - LabwarePositionCheckStep, -} from '/app/organisms/LabwarePositionCheck/types' import type { State } from '/app/redux/types' -import type { LPCWizardState } from '/app/redux/protocol-runs' +import type { LPCWizardContentProps } from '/app/organisms/LabwarePositionCheck/types' // TODO(BC, 09/01/23): replace updated support article link for LPC on OT-2/Flex const SUPPORT_PAGE_URL = 'https://support.opentrons.com/s/ot2-calibration' @@ -31,20 +29,15 @@ export function BeforeBeginning({ runId, proceed, commandUtils, -}: LPCStepProps): JSX.Element { +}: LPCWizardContentProps): JSX.Element { const { t, i18n } = useTranslation(['labware_position_check', 'shared']) const isOnDevice = useSelector(getIsOnDevice) - const activePipette = useSelector((state: State) => { - const step = state.protocolRuns[runId]?.lpc?.steps - .current as LabwarePositionCheckStep - return selectActivePipette(step, runId, state) ?? null - }) - const { protocolName, labwareDefs, existingOffsets } = useSelector( - (state: State) => state.protocolRuns[runId]?.lpc as LPCWizardState - ) - const { createStartLPCHandler, toggleRobotMoving } = commandUtils - - const handleStartLPC = createStartLPCHandler(activePipette, proceed) + const activePipette = useSelector(selectActivePipette(runId)) + const existingOffsets = useSelector(selectLabwareOffsetsForAllLw(runId)) + const { protocolName, labwareDefs } = useSelector( + (state: State) => state.protocolRuns[runId]?.lpc + ) ?? { protocolName: '', labwareDefs: [] } + const { handleStartLPC, toggleRobotMoving } = commandUtils const requiredEquipmentList = [ { @@ -59,7 +52,7 @@ export function BeforeBeginning({ const handleProceed = (): void => { void toggleRobotMoving(true) - .then(() => handleStartLPC()) + .then(() => handleStartLPC(activePipette, proceed)) .finally(() => toggleRobotMoving(false)) } diff --git a/app/src/organisms/LabwarePositionCheck/steps/DetachProbe.tsx b/app/src/organisms/LabwarePositionCheck/steps/DetachProbe.tsx index 1659fe375db..d6261151e7a 100644 --- a/app/src/organisms/LabwarePositionCheck/steps/DetachProbe.tsx +++ b/app/src/organisms/LabwarePositionCheck/steps/DetachProbe.tsx @@ -1,3 +1,4 @@ +import { useEffect } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' import { useSelector } from 'react-redux' @@ -19,9 +20,7 @@ import detachProbe1 from '/app/assets/videos/pipette-wizard-flows/Pipette_Detach import detachProbe8 from '/app/assets/videos/pipette-wizard-flows/Pipette_Detach_Probe_8.webm' import detachProbe96 from '/app/assets/videos/pipette-wizard-flows/Pipette_Detach_Probe_96.webm' -import type { DetachProbeStep, LPCStepProps } from '../types' -import type { State } from '/app/redux/types' -import type { StepsInfo } from '/app/organisms/LabwarePositionCheck/redux/types' +import type { LPCWizardContentProps } from '/app/organisms/LabwarePositionCheck/types' const StyledVideo = styled.video` padding-top: ${SPACING.spacing4}; @@ -42,18 +41,23 @@ export const DetachProbe = ({ runId, proceed, commandUtils, -}: LPCStepProps): JSX.Element => { +}: LPCWizardContentProps): JSX.Element => { const { t, i18n } = useTranslation(['labware_position_check', 'shared']) - const { current: currentStep } = useSelector( - (state: State) => state.protocolRuns[runId]?.lpc?.steps as StepsInfo - ) - const { createProbeDetachmentHandler, toggleRobotMoving } = commandUtils - const pipette = useSelector((state: State) => - selectActivePipette(currentStep, runId, state) - ) - const channels = useSelector((state: State) => - selectActivePipetteChannelCount(currentStep, runId, state) - ) + const { + handleProbeDetachment, + toggleRobotMoving, + handleValidMoveToMaintenancePosition, + } = commandUtils + const pipette = useSelector(selectActivePipette(runId)) + const channels = useSelector(selectActivePipetteChannelCount(runId)) + + // TODO(jh, 01-30-25): This will break the flows, but currently, DetachProbe is inaccessible. + // This onClick behavior should be tied directly to the "exit" button. + useEffect(() => { + void toggleRobotMoving(true) + .then(() => handleValidMoveToMaintenancePosition(pipette)) + .finally(() => toggleRobotMoving(false)) + }, []) const probeVideoSrc = ((): string => { switch (channels) { @@ -66,11 +70,9 @@ export const DetachProbe = ({ } })() - const handleProbeDetached = createProbeDetachmentHandler(pipette, proceed) - const handleProceed = (): void => { void toggleRobotMoving(true) - .then(() => handleProbeDetached()) + .then(() => handleProbeDetachment(pipette, proceed)) .finally(() => toggleRobotMoving(false)) } diff --git a/app/src/organisms/LabwarePositionCheck/steps/CheckItem/index.tsx b/app/src/organisms/LabwarePositionCheck/steps/HandleLabware/CheckItem.tsx similarity index 67% rename from app/src/organisms/LabwarePositionCheck/steps/CheckItem/index.tsx rename to app/src/organisms/LabwarePositionCheck/steps/HandleLabware/CheckItem.tsx index fa7366af6fc..b8eabaa54ab 100644 --- a/app/src/organisms/LabwarePositionCheck/steps/CheckItem/index.tsx +++ b/app/src/organisms/LabwarePositionCheck/steps/HandleLabware/CheckItem.tsx @@ -8,63 +8,61 @@ import { getLabwareDisplayLocation, } from '@opentrons/components' -import { NAV_STEPS } from '/app/organisms/LabwarePositionCheck/constants' import { FLEX_ROBOT_TYPE } from '@opentrons/shared-data' import { UnorderedList } from '/app/molecules/UnorderedList' import { + applyOffset, + clearSelectedLabware, setFinalPosition, setInitialPosition, } from '/app/redux/protocol-runs/actions' -import { JogToWell } from './JogToWell' -import { PrepareSpace } from './PrepareSpace' +import { EditOffset } from './EditOffset' +import { PrepareLabware } from './PrepareLabware' import { PlaceItemInstruction } from './PlaceItemInstruction' import { - selectActiveLwInitialPosition, + selectSelectedLwInitialPosition, selectActivePipette, - selectIsActiveLwTipRack, + selectIsSelectedLwTipRack, + selectSelectedLabwareInfo, } from '/app/redux/protocol-runs' import { getIsOnDevice } from '/app/redux/config' import type { DisplayLocationParams } from '@opentrons/components' -import type { - CheckPositionsStep, - LPCStepProps, -} from '/app/organisms/LabwarePositionCheck/types' +import type { LoadedPipette } from '@opentrons/shared-data' import type { State } from '/app/redux/types' -import type { LPCWizardState } from '/app/redux/protocol-runs' +import type { + LPCWizardState, + OffsetLocationDetails, + SelectedLabwareInfo, +} from '/app/redux/protocol-runs' +import type { LPCWizardContentProps } from '/app/organisms/LabwarePositionCheck/types' -export function CheckItem( - props: LPCStepProps -): JSX.Element { - const { runId, proceed, commandUtils, step } = props - const { labwareId, location } = step +export function CheckItem(props: LPCWizardContentProps): JSX.Element { + const { runId, commandUtils } = props const { handleJog, - handleCheckItemsPrepModules, handleConfirmLwModulePlacement, handleConfirmLwFinalPosition, handleResetLwModulesOnDeck, - handleValidMoveToMaintenancePosition, toggleRobotMoving, } = commandUtils const dispatch = useDispatch() const isOnDevice = useSelector(getIsOnDevice) - const { protocolData, labwareDefs, steps } = useSelector( + const { protocolData, labwareDefs } = useSelector( (state: State) => state.protocolRuns[runId]?.lpc as LPCWizardState ) const { t } = useTranslation(['labware_position_check', 'shared']) const { t: commandTextT } = useTranslation('protocol_command_text') - const pipette = useSelector( - (state: State) => selectActivePipette(step, runId, state) ?? null - ) - const initialPosition = useSelector((state: State) => - selectActiveLwInitialPosition(step, runId, state) - ) - const isLwTiprack = useSelector((state: State) => - selectIsActiveLwTipRack(runId, state) - ) + const pipette = useSelector(selectActivePipette(runId)) as LoadedPipette + const pipetteId = pipette.id + const initialPosition = useSelector(selectSelectedLwInitialPosition(runId)) + const isLwTiprack = useSelector(selectIsSelectedLwTipRack(runId)) + const selectedLwInfo = useSelector( + selectSelectedLabwareInfo(runId) + ) as SelectedLabwareInfo + const offsetLocationDetails = selectedLwInfo.offsetLocationDetails as OffsetLocationDetails const buildDisplayParams = (): Omit< DisplayLocationParams, @@ -74,7 +72,7 @@ export function CheckItem( loadedModules: protocolData.modules, loadedLabwares: protocolData.labware, robotType: FLEX_ROBOT_TYPE, - location, + location: offsetLocationDetails, }) const slotOnlyDisplayLocation = getLabwareDisplayLocation({ @@ -89,12 +87,14 @@ export function CheckItem( const handlePrepareProceed = (): void => { void toggleRobotMoving(true) - .then(() => handleConfirmLwModulePlacement({ step })) + .then(() => + handleConfirmLwModulePlacement(offsetLocationDetails, pipetteId) + ) .then(position => { dispatch( setInitialPosition(runId, { - labwareId, - location, + labwareUri: selectedLwInfo.uri, + location: offsetLocationDetails, position, }) ) @@ -102,43 +102,37 @@ export function CheckItem( .finally(() => toggleRobotMoving(false)) } - // TODO(jh, 01-14-25): Revisit next step injection after refactoring the store (after designs settle). const handleJogProceed = (): void => { void toggleRobotMoving(true) - .then(() => - handleConfirmLwFinalPosition({ - step, - onSuccess: proceed, - pipette, - }) - ) + .then(() => handleConfirmLwFinalPosition(offsetLocationDetails, pipette)) .then(position => { dispatch( setFinalPosition(runId, { - labwareId, - location, + labwareUri: selectedLwInfo.uri, + location: offsetLocationDetails, position, }) ) }) + // TODO(jh, 01-30-25): This entire sequence of dispatches can be reduced to one dispatch + // after the API changes, but should be separate until then. See APPLY_OFFSET comment in LPC reducer. .then(() => { - if (steps.next?.section === NAV_STEPS.CHECK_POSITIONS) { - return handleCheckItemsPrepModules(steps.next) - } else { - return handleValidMoveToMaintenancePosition(pipette, steps.next) - } + dispatch(applyOffset(runId, selectedLwInfo.uri)) + }) + .then(() => { + dispatch(clearSelectedLabware(runId)) }) .finally(() => toggleRobotMoving(false)) } const handleGoBack = (): void => { void toggleRobotMoving(true) - .then(() => handleResetLwModulesOnDeck({ step })) + .then(() => handleResetLwModulesOnDeck(offsetLocationDetails)) .then(() => { dispatch( setInitialPosition(runId, { - labwareId, - location, + labwareUri: selectedLwInfo.uri, + location: offsetLocationDetails, position: null, }) ) @@ -146,11 +140,10 @@ export function CheckItem( .finally(() => toggleRobotMoving(false)) } - // TODO(jh 01-15-24): These should be separate steps, but let's wait for designs to settle. return ( {initialPosition != null ? ( - ) : ( - , ]} /> } confirmPlacement={handlePrepareProceed} - {...props} + selectedLwInfo={selectedLwInfo} /> )} diff --git a/app/src/organisms/LabwarePositionCheck/steps/CheckItem/JogToWell/LiveOffsetValue.tsx b/app/src/organisms/LabwarePositionCheck/steps/HandleLabware/EditOffset/LiveOffsetValue.tsx similarity index 92% rename from app/src/organisms/LabwarePositionCheck/steps/CheckItem/JogToWell/LiveOffsetValue.tsx rename to app/src/organisms/LabwarePositionCheck/steps/HandleLabware/EditOffset/LiveOffsetValue.tsx index 18ead803548..3ea93e2774d 100644 --- a/app/src/organisms/LabwarePositionCheck/steps/CheckItem/JogToWell/LiveOffsetValue.tsx +++ b/app/src/organisms/LabwarePositionCheck/steps/HandleLabware/EditOffset/LiveOffsetValue.tsx @@ -19,10 +19,7 @@ import { import { getIsOnDevice } from '/app/redux/config' import type { StyleProps } from '@opentrons/components' -import type { - CheckPositionsStep, - LPCStepProps, -} from '/app/organisms/LabwarePositionCheck/types' +import type { LPCWizardContentProps } from '/app/organisms/LabwarePositionCheck/types' interface OffsetVectorProps extends StyleProps { x: number @@ -31,7 +28,7 @@ interface OffsetVectorProps extends StyleProps { } export function LiveOffsetValue( - props: OffsetVectorProps & LPCStepProps + props: OffsetVectorProps & LPCWizardContentProps ): JSX.Element { const { x, y, z, ...styleProps } = props const { i18n, t } = useTranslation('labware_position_check') diff --git a/app/src/organisms/LabwarePositionCheck/steps/CheckItem/JogToWell/index.tsx b/app/src/organisms/LabwarePositionCheck/steps/HandleLabware/EditOffset/index.tsx similarity index 86% rename from app/src/organisms/LabwarePositionCheck/steps/CheckItem/JogToWell/index.tsx rename to app/src/organisms/LabwarePositionCheck/steps/HandleLabware/EditOffset/index.tsx index 26a0dd599e6..8ca3186b54e 100644 --- a/app/src/organisms/LabwarePositionCheck/steps/CheckItem/JogToWell/index.tsx +++ b/app/src/organisms/LabwarePositionCheck/steps/HandleLabware/EditOffset/index.tsx @@ -35,33 +35,28 @@ import { NeedHelpLink } from '/app/molecules/OT2CalibrationNeedHelpLink' import { JogControls } from '/app/molecules/JogControls' import { LiveOffsetValue } from './LiveOffsetValue' import { - selectActiveLwExistingOffset, - selectActiveLwInitialPosition, + selectSelectedLwExistingOffset, + selectSelectedLwInitialPosition, selectActivePipette, - selectIsActiveLwTipRack, - selectItemLabwareDef, + selectIsSelectedLwTipRack, + selectSelectedLabwareDef, } from '/app/redux/protocol-runs' import { getIsOnDevice } from '/app/redux/config' +import levelProbeWithTip from '/app/assets/images/lpc_level_probe_with_tip.svg' +import levelProbeWithLabware from '/app/assets/images/lpc_level_probe_with_labware.svg' + import type { ReactNode } from 'react' import type { LabwareDefinition2 } from '@opentrons/shared-data' import type { VectorOffset } from '@opentrons/api-client' import type { Jog } from '/app/molecules/JogControls' -import type { - CheckPositionsStep, - LPCStepProps, -} from '/app/organisms/LabwarePositionCheck/types' -import type { LPCWizardState } from '/app/redux/protocol-runs' - -import levelProbeWithTip from '/app/assets/images/lpc_level_probe_with_tip.svg' -import levelProbeWithLabware from '/app/assets/images/lpc_level_probe_with_labware.svg' -import type { State } from '/app/redux/types' +import type { LPCWizardContentProps } from '/app/organisms/LabwarePositionCheck/types' const DECK_MAP_VIEWBOX = '-10 -10 150 105' const LPC_HELP_LINK_URL = 'https://support.opentrons.com/s/article/How-Labware-Offsets-work-on-the-OT-2' -interface JogToWellProps extends LPCStepProps { +interface JogToWellProps extends LPCWizardContentProps { header: ReactNode body: ReactNode handleConfirmPosition: () => void @@ -69,7 +64,7 @@ interface JogToWellProps extends LPCStepProps { handleJog: Jog } -export function JogToWell(props: JogToWellProps): JSX.Element { +export function EditOffset(props: JogToWellProps): JSX.Element { const { runId, header, @@ -79,30 +74,18 @@ export function JogToWell(props: JogToWellProps): JSX.Element { handleJog, } = props const { t } = useTranslation(['labware_position_check', 'shared']) - const { steps } = useSelector( - (state: State) => state.protocolRuns[runId]?.lpc as LPCWizardState - ) - const { current: currentStep } = steps const isOnDevice = useSelector(getIsOnDevice) - const initialPosition = useSelector( - (state: State) => - selectActiveLwInitialPosition(currentStep, runId, state) ?? - IDENTITY_VECTOR - ) - const pipetteName = useSelector( - (state: State) => - selectActivePipette(currentStep, runId, state)?.pipetteName ?? - 'p1000_single' - ) + const initialPosition = + useSelector(selectSelectedLwInitialPosition(runId)) ?? IDENTITY_VECTOR + const pipetteName = + useSelector(selectActivePipette(runId))?.pipetteName ?? 'p1000_single' const itemLwDef = useSelector( - selectItemLabwareDef(runId) - ) as LabwareDefinition2 // Safe if component only used with CheckItem step. - const isTipRack = useSelector((state: State) => - selectIsActiveLwTipRack(runId, state) - ) - const activeLwExistingOffset = useSelector((state: State) => - selectActiveLwExistingOffset(runId, state) + selectSelectedLabwareDef(runId) + ) as LabwareDefinition2 + const isTipRack = useSelector(selectIsSelectedLwTipRack(runId)) + const activeLwExistingOffset = useSelector( + selectSelectedLwExistingOffset(runId) ) const [joggedPosition, setJoggedPosition] = useState( diff --git a/app/src/organisms/LabwarePositionCheck/steps/HandleLabware/LPCLabwareDetails/AppliedLocationOffsetsContainer.tsx b/app/src/organisms/LabwarePositionCheck/steps/HandleLabware/LPCLabwareDetails/AppliedLocationOffsetsContainer.tsx new file mode 100644 index 00000000000..1b7917f6ae3 --- /dev/null +++ b/app/src/organisms/LabwarePositionCheck/steps/HandleLabware/LPCLabwareDetails/AppliedLocationOffsetsContainer.tsx @@ -0,0 +1,151 @@ +import { useTranslation } from 'react-i18next' +import { useDispatch, useSelector } from 'react-redux' +import { css } from 'styled-components' + +import { + Flex, + StyledText, + ListButton, + DeckInfoLabel, + SPACING, + getLabwareDisplayLocation, + JUSTIFY_SPACE_BETWEEN, + DIRECTION_COLUMN, +} from '@opentrons/components' +import { FLEX_ROBOT_TYPE } from '@opentrons/shared-data' + +import { + selectSelectedLabwareInfo, + selectSelectedLwInitialPosition, + selectSelectedOffsetDetails, + setSelectedLabware, +} from '/app/redux/protocol-runs' + +import type { State } from '/app/redux/types' +import type { LPCWizardContentProps } from '/app/organisms/LabwarePositionCheck/types' +import type { + LPCWizardState, + OffsetDetails, + SelectedLabwareInfo, +} from '/app/redux/protocol-runs' + +export function AppliedLocationOffsetsContainer( + props: LPCWizardContentProps +): JSX.Element { + const offsetDetails = useSelector(selectSelectedOffsetDetails(props.runId)) + + return ( + + {offsetDetails.map(offset => ( + + ))} + {/* Gives extra scrollable space. */} + + + ) +} + +interface LabwareLocationItemProps extends LPCWizardContentProps { + offsetDetail: OffsetDetails +} + +function LabwareLocationItemContainer( + props: LabwareLocationItemProps +): JSX.Element { + const { t } = useTranslation('labware_position_check') + + return ( + + + + {t('slot_location')} + + {t('offsets')} + + + + ) +} + +function LabwareLocationItem({ + runId, + offsetDetail, + commandUtils, +}: LabwareLocationItemProps): JSX.Element { + const { t: commandTextT } = useTranslation('protocol_command_text') + const { toggleRobotMoving, handleCheckItemsPrepModules } = commandUtils + const dispatch = useDispatch() + + const { protocolData } = useSelector( + (state: State) => state.protocolRuns[runId]?.lpc as LPCWizardState + ) + const selectedLw = useSelector( + selectSelectedLabwareInfo(runId) + ) as SelectedLabwareInfo + const initialPosition = useSelector(selectSelectedLwInitialPosition(runId)) + + const slotCopy = getLabwareDisplayLocation({ + t: commandTextT, + loadedModules: protocolData.modules, + loadedLabwares: protocolData.labware, + robotType: FLEX_ROBOT_TYPE, + location: { slotName: offsetDetail.locationDetails.slotName as string }, + detailLevel: 'slot-only', + }) + + const handleOnClick = (): void => { + void toggleRobotMoving(true) + .then(() => { + dispatch( + setSelectedLabware( + runId, + selectedLw.uri, + offsetDetail.locationDetails + ) + ) + }) + .then(() => + handleCheckItemsPrepModules( + offsetDetail.locationDetails, + initialPosition + ) + ) + .finally(() => toggleRobotMoving(false)) + } + + return ( + + + {/* TODO(jh, 01-30-31): Add a new detail level to getLabwareDisplayLocation instead of slicing. */} + + + + ) +} + +const APPLIED_LOCATION_CONTAINER_STYLE = css` + flex-direction: ${DIRECTION_COLUMN}; + grid-gap: ${SPACING.spacing24}; +` + +const HEADER_STYLE = css` + padding: 0 1.375rem; + grid-gap: 3.813rem; +` + +const LOCATION_ITEM_CONTAINER_STYLE = css` + flex-direction: ${DIRECTION_COLUMN}; + grid-gap: ${SPACING.spacing8}; +` + +const BUTTON_TEXT_STYLE = css` + justify-content: ${JUSTIFY_SPACE_BETWEEN}; +` + +const BOX_STYLE = css` + height: ${SPACING.spacing40}; +` diff --git a/app/src/organisms/LabwarePositionCheck/steps/HandleLabware/LPCLabwareDetails/DefaultLocationOffset.tsx b/app/src/organisms/LabwarePositionCheck/steps/HandleLabware/LPCLabwareDetails/DefaultLocationOffset.tsx new file mode 100644 index 00000000000..617c3f28d9c --- /dev/null +++ b/app/src/organisms/LabwarePositionCheck/steps/HandleLabware/LPCLabwareDetails/DefaultLocationOffset.tsx @@ -0,0 +1,66 @@ +import { css } from 'styled-components' +import { useTranslation } from 'react-i18next' + +import { + ListButton, + Flex, + Tag, + StyledText, + PrimaryButton, + Icon, + SPACING, + DIRECTION_COLUMN, + JUSTIFY_SPACE_BETWEEN, + ALIGN_CENTER, +} from '@opentrons/components' + +import type { LPCWizardContentProps } from '/app/organisms/LabwarePositionCheck/types' + +export function DefaultLocationOffset( + props: LPCWizardContentProps +): JSX.Element { + const { t } = useTranslation('labware_position_check') + + return ( + + + + + {t('default_labware_offset')} + + + + + + + + + {t('add')} + + + + + ) +} + +const BUTTON_ALL_CONTENT_STYLE = css` + grid-gap: ${SPACING.spacing24}; + justify-content: ${JUSTIFY_SPACE_BETWEEN}; + width: 100%; +` + +const BUTTON_LEFT_CONTENT_STYLE = css` + flex-direction: ${DIRECTION_COLUMN}; + grid-gap: ${SPACING.spacing8}; +` + +const BUTTON_TEXT_CONTAINER_STYLE = css` + grid-gap: ${SPACING.spacing8}; + justify-content: ${JUSTIFY_SPACE_BETWEEN}; + align-items: ${ALIGN_CENTER}; +` + +const ADD_ICON_STYLE = css` + width: 1.75rem; + height: 1.75rem; +` diff --git a/app/src/organisms/LabwarePositionCheck/steps/HandleLabware/LPCLabwareDetails/index.tsx b/app/src/organisms/LabwarePositionCheck/steps/HandleLabware/LPCLabwareDetails/index.tsx new file mode 100644 index 00000000000..2aff38442e7 --- /dev/null +++ b/app/src/organisms/LabwarePositionCheck/steps/HandleLabware/LPCLabwareDetails/index.tsx @@ -0,0 +1,16 @@ +import { Flex } from '@opentrons/components' + +import { AppliedLocationOffsetsContainer } from './AppliedLocationOffsetsContainer' +import { DefaultLocationOffset } from './DefaultLocationOffset' +import { LIST_CONTAINER_STYLE } from '/app/organisms/LabwarePositionCheck/steps/HandleLabware/contants' + +import type { LPCWizardContentProps } from '/app/organisms/LabwarePositionCheck/types' + +export function LPCLabwareDetails(props: LPCWizardContentProps): JSX.Element { + return ( + + + + + ) +} diff --git a/app/src/organisms/LabwarePositionCheck/steps/HandleLabware/LPCLabwareList/index.tsx b/app/src/organisms/LabwarePositionCheck/steps/HandleLabware/LPCLabwareList/index.tsx new file mode 100644 index 00000000000..da16d7232bc --- /dev/null +++ b/app/src/organisms/LabwarePositionCheck/steps/HandleLabware/LPCLabwareList/index.tsx @@ -0,0 +1,71 @@ +import { css } from 'styled-components' +import { useTranslation } from 'react-i18next' +import { useDispatch, useSelector } from 'react-redux' + +import { + Flex, + StyledText, + SPACING, + ListButton, + DIRECTION_COLUMN, +} from '@opentrons/components' + +import { + selectAllLabwareInfo, + setSelectedLabwareName, +} from '/app/redux/protocol-runs' +import { LIST_CONTAINER_STYLE } from '/app/organisms/LabwarePositionCheck/steps/HandleLabware/contants' + +import type { LPCWizardContentProps } from '/app/organisms/LabwarePositionCheck/types' +import type { LabwareDetails } from '/app/redux/protocol-runs' + +export function LPCLabwareList(props: LPCWizardContentProps): JSX.Element { + const { t } = useTranslation('labware_position_check') + const labwareInfo = useSelector(selectAllLabwareInfo(props.runId)) + + return ( + + {t('select_labware_from_list')} + + {Object.entries(labwareInfo).map(([uri, info]) => ( + + ))} + + + ) +} + +interface LabwareItemProps extends LPCWizardContentProps { + uri: string + info: LabwareDetails +} + +function LabwareItem({ uri, info, runId }: LabwareItemProps): JSX.Element { + const dispatch = useDispatch() + + const handleOnClick = (): void => { + dispatch(setSelectedLabwareName(runId, uri)) + } + + return ( + + + {info.displayName} + + + ) +} + +const LIST_STYLE = css` + flex-direction: ${DIRECTION_COLUMN}; + grid-gap: ${SPACING.spacing8}; +` + +const BUTTON_TEXT_STYLE = css` + grid-gap: ${SPACING.spacing24}; +` diff --git a/app/src/organisms/LabwarePositionCheck/steps/CheckItem/PlaceItemInstruction.tsx b/app/src/organisms/LabwarePositionCheck/steps/HandleLabware/PlaceItemInstruction.tsx similarity index 77% rename from app/src/organisms/LabwarePositionCheck/steps/CheckItem/PlaceItemInstruction.tsx rename to app/src/organisms/LabwarePositionCheck/steps/HandleLabware/PlaceItemInstruction.tsx index 7fc4487b278..2ac53d07757 100644 --- a/app/src/organisms/LabwarePositionCheck/steps/CheckItem/PlaceItemInstruction.tsx +++ b/app/src/organisms/LabwarePositionCheck/steps/HandleLabware/PlaceItemInstruction.tsx @@ -5,37 +5,32 @@ import { TYPOGRAPHY, LegacyStyledText } from '@opentrons/components' import { selectActiveAdapterDisplayName, - selectLwDisplayName, + selectSelectedLwDisplayName, } from '/app/redux/protocol-runs' -import type { State } from '/app/redux/types' -import type { - CheckPositionsStep, - LPCStepProps, -} from '/app/organisms/LabwarePositionCheck/types' +import type { SelectedLabwareInfo } from '/app/redux/protocol-runs' -interface PlaceItemInstructionProps extends LPCStepProps { +import type { LPCWizardContentProps } from '/app/organisms/LabwarePositionCheck/types' + +interface PlaceItemInstructionProps extends LPCWizardContentProps { isLwTiprack: boolean slotOnlyDisplayLocation: string fullDisplayLocation: string + labwareInfo: SelectedLabwareInfo } export function PlaceItemInstruction({ runId, - step, isLwTiprack, slotOnlyDisplayLocation, fullDisplayLocation, + labwareInfo, }: PlaceItemInstructionProps): JSX.Element { const { t } = useTranslation('labware_position_check') - const { adapterId } = step - const labwareDisplayName = useSelector((state: State) => - selectLwDisplayName(runId, state) - ) - const adapterDisplayName = useSelector((state: State) => - selectActiveAdapterDisplayName(runId, state) - ) + const { adapterId } = labwareInfo.offsetLocationDetails ?? { adapterId: null } + const labwareDisplayName = useSelector(selectSelectedLwDisplayName(runId)) + const adapterDisplayName = useSelector(selectActiveAdapterDisplayName(runId)) if (isLwTiprack) { return ( diff --git a/app/src/organisms/LabwarePositionCheck/steps/CheckItem/PrepareSpace.tsx b/app/src/organisms/LabwarePositionCheck/steps/HandleLabware/PrepareLabware/index.tsx similarity index 79% rename from app/src/organisms/LabwarePositionCheck/steps/CheckItem/PrepareSpace.tsx rename to app/src/organisms/LabwarePositionCheck/steps/HandleLabware/PrepareLabware/index.tsx index d308d986a11..02143241727 100644 --- a/app/src/organisms/LabwarePositionCheck/steps/CheckItem/PrepareSpace.tsx +++ b/app/src/organisms/LabwarePositionCheck/steps/HandleLabware/PrepareLabware/index.tsx @@ -24,42 +24,46 @@ import { import { SmallButton } from '/app/atoms/buttons' import { NeedHelpLink } from '/app/molecules/OT2CalibrationNeedHelpLink' -import { selectItemLabwareDef } from '/app/redux/protocol-runs' +import { selectSelectedLabwareDef } from '/app/redux/protocol-runs' import { getIsOnDevice } from '/app/redux/config' import type { ReactNode } from 'react' import type { LabwareDefinition2 } from '@opentrons/shared-data' -import type { - CheckPositionsStep, - LPCStepProps, -} from '/app/organisms/LabwarePositionCheck/types' import type { State } from '/app/redux/types' -import type { LPCWizardState } from '/app/redux/protocol-runs' +import type { + LPCWizardState, + OffsetLocationDetails, + SelectedLabwareInfo, +} from '/app/redux/protocol-runs' +import type { LPCWizardContentProps } from '/app/organisms/LabwarePositionCheck/types' const LPC_HELP_LINK_URL = 'https://support.opentrons.com/s/article/How-Labware-Offsets-work-on-the-OT-2' -interface PrepareSpaceProps extends LPCStepProps { +interface PrepareSpaceProps extends LPCWizardContentProps { header: ReactNode body: ReactNode confirmPlacement: () => void + selectedLwInfo: SelectedLabwareInfo } -export function PrepareSpace({ +export function PrepareLabware({ runId, header, body, confirmPlacement, + selectedLwInfo, }: PrepareSpaceProps): JSX.Element { const { i18n, t } = useTranslation(['labware_position_check', 'shared']) - const { protocolData, deckConfig, steps } = useSelector( + const { protocolData, deckConfig } = useSelector( (state: State) => state.protocolRuns[runId]?.lpc as LPCWizardState ) const isOnDevice = useSelector(getIsOnDevice) const labwareDef = useSelector( - selectItemLabwareDef(runId) - ) as LabwareDefinition2 // CheckItem always has lwId on step. - const { location } = steps.current as CheckPositionsStep // safely enforced by iface + selectSelectedLabwareDef(runId) + ) as LabwareDefinition2 + const offsetLocationDetails = selectedLwInfo.offsetLocationDetails as OffsetLocationDetails + const { moduleModel } = offsetLocationDetails return ( @@ -74,20 +78,16 @@ export function PrepareSpace({ modulesOnDeck={protocolData.modules.map(mod => ({ moduleModel: mod.model, moduleLocation: mod.location, - nestedLabwareDef: - 'moduleModel' in location && location.moduleModel != null - ? labwareDef - : null, + nestedLabwareDef: moduleModel != null ? labwareDef : null, innerProps: - 'moduleModel' in location && - location.moduleModel != null && - getModuleType(location.moduleModel) === THERMOCYCLER_MODULE_TYPE + moduleModel != null && + getModuleType(moduleModel) === THERMOCYCLER_MODULE_TYPE ? { lidMotorState: 'open' } : {}, }))} labwareOnDeck={[ { - labwareLocation: location, + labwareLocation: offsetLocationDetails, definition: labwareDef, }, ].filter( diff --git a/app/src/organisms/LabwarePositionCheck/steps/HandleLabware/contants.ts b/app/src/organisms/LabwarePositionCheck/steps/HandleLabware/contants.ts new file mode 100644 index 00000000000..4d2daa14776 --- /dev/null +++ b/app/src/organisms/LabwarePositionCheck/steps/HandleLabware/contants.ts @@ -0,0 +1,13 @@ +import { css } from 'styled-components' + +import { SPACING, DIRECTION_COLUMN } from '@opentrons/components' + +/** + * Styles + */ + +export const LIST_CONTAINER_STYLE = css` + flex-direction: ${DIRECTION_COLUMN}; + padding: ${SPACING.spacing32} ${SPACING.spacing60}; + grid-gap: ${SPACING.spacing24}; +` diff --git a/app/src/organisms/LabwarePositionCheck/steps/HandleLabware/index.tsx b/app/src/organisms/LabwarePositionCheck/steps/HandleLabware/index.tsx new file mode 100644 index 00000000000..e168b19df09 --- /dev/null +++ b/app/src/organisms/LabwarePositionCheck/steps/HandleLabware/index.tsx @@ -0,0 +1,33 @@ +import { useSelector } from 'react-redux' + +import { + selectSelectedLabwareFlowType, + selectSelectedLabwareInfo, +} from '/app/redux/protocol-runs' +import { CheckItem } from './CheckItem' +import { LPCLabwareList } from './LPCLabwareList' +import { LPCLabwareDetails } from './LPCLabwareDetails' + +import type { LPCWizardContentProps } from '/app/organisms/LabwarePositionCheck/types' + +export function HandleLabware(props: LPCWizardContentProps): JSX.Element { + const selectedLw = useSelector(selectSelectedLabwareInfo(props.runId)) + const offsetFlowType = useSelector(selectSelectedLabwareFlowType(props.runId)) + + if (selectedLw == null) { + return + } else if (selectedLw.offsetLocationDetails == null) { + return + } else { + switch (offsetFlowType) { + case 'default': + return + case 'location-specific': + return + default: { + console.error(`Unexpected offsetFlowType: ${offsetFlowType}`) + return + } + } + } +} diff --git a/app/src/organisms/LabwarePositionCheck/steps/LPCComplete/index.tsx b/app/src/organisms/LabwarePositionCheck/steps/LPCComplete/index.tsx new file mode 100644 index 00000000000..f40e117dba0 --- /dev/null +++ b/app/src/organisms/LabwarePositionCheck/steps/LPCComplete/index.tsx @@ -0,0 +1,13 @@ +import { useEffect } from 'react' + +import type { LPCWizardContentProps } from '/app/organisms/LabwarePositionCheck/types' + +export function LPCComplete(props: LPCWizardContentProps): JSX.Element { + useEffect(() => { + setTimeout(() => { + props.onCloseClick() + }, 5000) + }, []) + + return <>LPC COMPLETE +} diff --git a/app/src/organisms/LabwarePositionCheck/steps/ResultsSummary/OffsetTable.tsx b/app/src/organisms/LabwarePositionCheck/steps/ResultsSummary/OffsetTable.tsx deleted file mode 100644 index 46d8d430bbb..00000000000 --- a/app/src/organisms/LabwarePositionCheck/steps/ResultsSummary/OffsetTable.tsx +++ /dev/null @@ -1,147 +0,0 @@ -import { Fragment } from 'react' -import styled from 'styled-components' -import isEqual from 'lodash/isEqual' -import { useTranslation } from 'react-i18next' -import { useSelector } from 'react-redux' - -import { FLEX_ROBOT_TYPE, IDENTITY_VECTOR } from '@opentrons/shared-data' -import { - BORDERS, - COLORS, - Flex, - SPACING, - LegacyStyledText, - TYPOGRAPHY, - getLabwareDisplayLocation, -} from '@opentrons/components' - -import { selectLwDisplayName } from '/app/redux/protocol-runs' - -import type { LabwareDefinition2 } from '@opentrons/shared-data' -import type { LegacyLabwareOffsetCreateData } from '@opentrons/api-client' -import type { - LPCStepProps, - ResultsSummaryStep, -} from '/app/organisms/LabwarePositionCheck/types' -import type { LPCWizardState } from '/app/redux/protocol-runs' -import type { State } from '/app/redux/types' - -interface OffsetTableProps extends LPCStepProps { - offsets: LegacyLabwareOffsetCreateData[] - labwareDefinitions: LabwareDefinition2[] -} - -export function OffsetTable({ - offsets, - runId, - labwareDefinitions, -}: OffsetTableProps): JSX.Element { - const { protocolData } = useSelector( - (state: State) => state.protocolRuns[runId]?.lpc as LPCWizardState - ) - const lwDisplayName = useSelector((state: State) => - selectLwDisplayName(runId, state) - ) - - const { t } = useTranslation('labware_position_check') - - return ( - - - - {t('location')} - {t('labware')} - {t('labware_offset_data')} - - - - - {offsets.map(({ location, vector }, index) => { - const displayLocation = getLabwareDisplayLocation({ - location, - allRunDefs: labwareDefinitions, - detailLevel: 'full', - t, - loadedModules: protocolData.modules, - loadedLabwares: protocolData.labware, - robotType: FLEX_ROBOT_TYPE, - }) - - return ( - - - - {displayLocation} - - - - {lwDisplayName} - - - {isEqual(vector, IDENTITY_VECTOR) ? ( - {t('no_labware_offsets')} - ) : ( - - {[vector.x, vector.y, vector.z].map((axis, index) => ( - - 0 ? SPACING.spacing8 : 0} - marginRight={SPACING.spacing4} - fontWeight={TYPOGRAPHY.fontWeightSemiBold} - > - {['X', 'Y', 'Z'][index]} - - - {axis.toFixed(1)} - - - ))} - - )} - - - ) - })} - -
- ) -} - -const Table = styled('table')` - ${TYPOGRAPHY.labelRegular} - table-layout: auto; - width: 100%; - border-spacing: 0 ${SPACING.spacing4}; - margin: ${SPACING.spacing16} 0; - text-align: left; -` - -const TableHeader = styled('th')` - text-transform: ${TYPOGRAPHY.textTransformUppercase}; - color: ${COLORS.black90}; - font-weight: ${TYPOGRAPHY.fontWeightRegular}; - font-size: ${TYPOGRAPHY.fontSizeCaption}; - padding: ${SPACING.spacing4}; -` - -const TableRow = styled('tr')` - background-color: ${COLORS.grey20}; -` - -const TableDatum = styled('td')` - padding: ${SPACING.spacing4}; - white-space: break-spaces; - text-overflow: wrap; -` - -const LeftRoundedTableDatum = styled(TableDatum)` - border-radius: ${BORDERS.borderRadius4} 0 0 ${BORDERS.borderRadius4}; -` - -const RightRoundedTableDatum = styled(TableDatum)` - border-radius: 0 ${BORDERS.borderRadius4} ${BORDERS.borderRadius4} 0; -` diff --git a/app/src/organisms/LabwarePositionCheck/steps/ResultsSummary/TableComponent.tsx b/app/src/organisms/LabwarePositionCheck/steps/ResultsSummary/TableComponent.tsx deleted file mode 100644 index 7e1dce4d58e..00000000000 --- a/app/src/organisms/LabwarePositionCheck/steps/ResultsSummary/TableComponent.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import { useSelector } from 'react-redux' - -import { TerseOffsetTable } from '/app/organisms/TerseOffsetTable' -import { OffsetTable } from './OffsetTable' -import { getIsOnDevice } from '/app/redux/config' - -import type { LegacyLabwareOffsetCreateData } from '@opentrons/api-client' -import type { - LPCStepProps, - ResultsSummaryStep, -} from '/app/organisms/LabwarePositionCheck/types' -import type { State } from '/app/redux/types' -import type { LPCWizardState } from '/app/redux/protocol-runs' - -interface TableComponentProps extends LPCStepProps { - offsetsToApply: LegacyLabwareOffsetCreateData[] -} - -export function TableComponent(props: TableComponentProps): JSX.Element { - const { offsetsToApply, runId } = props - const isOnDevice = useSelector(getIsOnDevice) - const { labwareDefs } = useSelector( - (state: State) => state.protocolRuns[runId]?.lpc as LPCWizardState - ) - - return isOnDevice ? ( - - ) : ( - - ) -} diff --git a/app/src/organisms/LabwarePositionCheck/steps/ResultsSummary/index.tsx b/app/src/organisms/LabwarePositionCheck/steps/ResultsSummary/index.tsx deleted file mode 100644 index f63d5f8518d..00000000000 --- a/app/src/organisms/LabwarePositionCheck/steps/ResultsSummary/index.tsx +++ /dev/null @@ -1,169 +0,0 @@ -import styled, { css } from 'styled-components' -import { useSelector } from 'react-redux' -import { useTranslation } from 'react-i18next' - -import { - ALIGN_CENTER, - ALIGN_FLEX_END, - COLORS, - DIRECTION_COLUMN, - Flex, - Icon, - JUSTIFY_SPACE_BETWEEN, - OVERFLOW_AUTO, - PrimaryButton, - RESPONSIVENESS, - SPACING, - LegacyStyledText, - TYPOGRAPHY, -} from '@opentrons/components' - -import { NeedHelpLink } from '/app/molecules/OT2CalibrationNeedHelpLink' -import { PythonLabwareOffsetSnippet } from '/app/molecules/PythonLabwareOffsetSnippet' -import { - getIsLabwareOffsetCodeSnippetsOn, - getIsOnDevice, -} from '/app/redux/config' -import { SmallButton } from '/app/atoms/buttons' -import { LabwareOffsetTabs } from '/app/organisms/LabwareOffsetTabs' -import { TableComponent } from './TableComponent' - -import type { - LPCStepProps, - ResultsSummaryStep, -} from '/app/organisms/LabwarePositionCheck/types' -import type { State } from '/app/redux/types' -import type { LPCWizardState } from '/app/redux/protocol-runs' - -// TODO(jh, 01-08-25): This support link will likely need updating as a part of RPRD-173, too. -const LPC_HELP_LINK_URL = - 'https://support.opentrons.com/s/article/How-Labware-Offsets-work-on-the-OT-2' - -export function ResultsSummary( - props: LPCStepProps -): JSX.Element { - const { commandUtils, runId } = props - const isOnDevice = useSelector(getIsOnDevice) - const { protocolData } = useSelector( - (state: State) => state.protocolRuns[runId]?.lpc as LPCWizardState - ) - const { - isApplyingOffsets, - handleApplyOffsetsAndClose, - buildOffsetsToApply, - toggleRobotMoving, - } = commandUtils - const { i18n, t } = useTranslation('labware_position_check') - const offsetsToApply = buildOffsetsToApply() - const isLabwareOffsetCodeSnippetsOn = useSelector( - getIsLabwareOffsetCodeSnippetsOn - ) - - const handleProceed = (): void => { - void toggleRobotMoving(true).then(() => - handleApplyOffsetsAndClose(offsetsToApply) - ) - } - - return ( - - -

{t('new_labware_offset_data')}
- {isLabwareOffsetCodeSnippetsOn ? ( - - } - JupyterComponent={ - - } - CommandLineComponent={ - - } - marginTop={SPACING.spacing16} - /> - ) : ( - - )} -
- {isOnDevice ? ( - - ) : ( - - - - - {isApplyingOffsets ? ( - - ) : null} - - {i18n.format(t('apply_offsets'), 'capitalize')} - - - - - )} -
- ) -} - -const PARENT_CONTAINER_STYLE = css` - flex-direction: ${DIRECTION_COLUMN}; - justify-content: ${JUSTIFY_SPACE_BETWEEN}; - padding: ${SPACING.spacing32}; - min-height: 29.5rem; -` - -const SHARED_CONTAINER_STYLE = css` - flex-direction: ${DIRECTION_COLUMN}; - max-height: 20rem; - overflow-y: ${OVERFLOW_AUTO}; - - &::-webkit-scrollbar { - width: 0.75rem; - background-color: transparent; - } - &::-webkit-scrollbar-thumb { - background: ${COLORS.grey50}; - border-radius: 11px; - } -` - -const DESKTOP_BUTTON_STYLE = css` - width: 100%; - margin-top: ${SPACING.spacing32}; - justify-content: ${JUSTIFY_SPACE_BETWEEN}; - align-items: ${ALIGN_CENTER}; -` - -const Header = styled.h1` - ${TYPOGRAPHY.h1Default} - - @media ${RESPONSIVENESS.touchscreenMediaQuerySpecs} { - ${TYPOGRAPHY.level4HeaderSemiBold} - } -` diff --git a/app/src/organisms/LabwarePositionCheck/steps/index.ts b/app/src/organisms/LabwarePositionCheck/steps/index.ts index 9bf7efbad46..62bf40d486f 100644 --- a/app/src/organisms/LabwarePositionCheck/steps/index.ts +++ b/app/src/organisms/LabwarePositionCheck/steps/index.ts @@ -1,5 +1,5 @@ export { BeforeBeginning } from './BeforeBeginning' +export { HandleLabware } from './HandleLabware' export { AttachProbe } from './AttachProbe' -export { CheckItem } from './CheckItem' export { DetachProbe } from './DetachProbe' -export { ResultsSummary } from './ResultsSummary' +export { LPCComplete } from './LPCComplete' diff --git a/app/src/organisms/LabwarePositionCheck/types/index.ts b/app/src/organisms/LabwarePositionCheck/types/index.ts index 4da2755de80..f71cb81b5a5 100644 --- a/app/src/organisms/LabwarePositionCheck/types/index.ts +++ b/app/src/organisms/LabwarePositionCheck/types/index.ts @@ -1,2 +1 @@ -export * from './steps' export * from './content' diff --git a/app/src/organisms/LabwarePositionCheck/types/steps.ts b/app/src/organisms/LabwarePositionCheck/types/steps.ts deleted file mode 100644 index 17caa519d1b..00000000000 --- a/app/src/organisms/LabwarePositionCheck/types/steps.ts +++ /dev/null @@ -1,48 +0,0 @@ -import type { LegacyLabwareOffsetLocation } from '@opentrons/api-client' -import type { NAV_STEPS } from '../constants' -import type { LPCWizardContentProps } from './content' - -export type LabwarePositionCheckStep = - | BeforeBeginningStep - | AttachProbeStep - | CheckPositionsStep - | DetachProbeStep - | ResultsSummaryStep - -export type LPCStepProps = Omit< - LPCWizardContentProps, - 'step' -> & { - step: Extract -} - -export interface PerformLPCStep { - pipetteId: string - labwareId: string - location: LegacyLabwareOffsetLocation - definitionUri: string - adapterId?: string - moduleId?: string -} - -export interface BeforeBeginningStep { - section: typeof NAV_STEPS.BEFORE_BEGINNING -} - -export interface AttachProbeStep { - section: typeof NAV_STEPS.ATTACH_PROBE - pipetteId: string -} - -export interface CheckPositionsStep extends PerformLPCStep { - section: typeof NAV_STEPS.CHECK_POSITIONS -} - -export interface DetachProbeStep { - section: typeof NAV_STEPS.DETACH_PROBE - pipetteId: string -} - -export interface ResultsSummaryStep { - section: typeof NAV_STEPS.RESULTS_SUMMARY -} diff --git a/app/src/organisms/LegacyApplyHistoricOffsets/index.tsx b/app/src/organisms/LegacyApplyHistoricOffsets/index.tsx index de216131c79..fc60b5b8a64 100644 --- a/app/src/organisms/LegacyApplyHistoricOffsets/index.tsx +++ b/app/src/organisms/LegacyApplyHistoricOffsets/index.tsx @@ -97,7 +97,7 @@ export function LegacyApplyHistoricOffsets( - {t(noOffsetData ? 'no_offset_data' : 'apply_offset_data')} + {t(noOffsetData ? 'legacy_no_offset_data' : 'apply_offset_data')} } diff --git a/app/src/redux/protocol-runs/actions/lpc.ts b/app/src/redux/protocol-runs/actions/lpc.ts index 5ec472e094c..d5a90ec07b5 100644 --- a/app/src/redux/protocol-runs/actions/lpc.ts +++ b/app/src/redux/protocol-runs/actions/lpc.ts @@ -4,6 +4,11 @@ import { SET_FINAL_POSITION, START_LPC, FINISH_LPC, + GO_BACK_STEP, + SET_SELECTED_LABWARE, + CLEAR_SELECTED_LABWARE, + SET_SELECTED_LABWARE_NAME, + APPLY_OFFSET, } from '../constants' import type { @@ -14,12 +19,55 @@ import type { PositionParams, ProceedStepAction, FinishLPCAction, + GoBackStepAction, + SelectedLabwareAction, + ClearSelectedLabwareAction, + SelectedLabwareNameAction, + OffsetLocationDetails, + ApplyOffsetAction, } from '../types' export const proceedStep = (runId: string): ProceedStepAction => ({ type: PROCEED_STEP, payload: { runId }, }) + +export const goBackStep = (runId: string): GoBackStepAction => ({ + type: GO_BACK_STEP, + payload: { runId }, +}) + +export const setSelectedLabwareName = ( + runId: string, + labwareUri: string +): SelectedLabwareNameAction => ({ + type: SET_SELECTED_LABWARE_NAME, + payload: { + runId, + labwareUri, + }, +}) + +export const setSelectedLabware = ( + runId: string, + labwareUri: string, + location: OffsetLocationDetails | null +): SelectedLabwareAction => ({ + type: SET_SELECTED_LABWARE, + payload: { + runId, + labwareUri, + location, + }, +}) + +export const clearSelectedLabware = ( + runId: string +): ClearSelectedLabwareAction => ({ + type: CLEAR_SELECTED_LABWARE, + payload: { runId }, +}) + export const setInitialPosition = ( runId: string, params: PositionParams @@ -36,6 +84,14 @@ export const setFinalPosition = ( payload: { ...params, runId }, }) +export const applyOffset = ( + runId: string, + labwareUri: string +): ApplyOffsetAction => ({ + type: APPLY_OFFSET, + payload: { runId, labwareUri }, +}) + export const startLPC = ( runId: string, state: LPCWizardState diff --git a/app/src/redux/protocol-runs/constants/lpc.ts b/app/src/redux/protocol-runs/constants/lpc.ts deleted file mode 100644 index 669c8ec503a..00000000000 --- a/app/src/redux/protocol-runs/constants/lpc.ts +++ /dev/null @@ -1,5 +0,0 @@ -export const START_LPC = 'START_LPC' -export const FINISH_LPC = 'FINISH_LPC' -export const PROCEED_STEP = 'PROCEED_STEP' -export const SET_INITIAL_POSITION = 'SET_INITIAL_POSITION' -export const SET_FINAL_POSITION = 'SET_FINAL_POSITION' diff --git a/app/src/redux/protocol-runs/constants/lpc/actions.ts b/app/src/redux/protocol-runs/constants/lpc/actions.ts new file mode 100644 index 00000000000..6fd006a9759 --- /dev/null +++ b/app/src/redux/protocol-runs/constants/lpc/actions.ts @@ -0,0 +1,10 @@ +export const START_LPC = 'START_LPC' +export const FINISH_LPC = 'FINISH_LPC' +export const PROCEED_STEP = 'PROCEED_STEP' +export const GO_BACK_STEP = 'GO_BACK_STEP' +export const SET_SELECTED_LABWARE_NAME = 'SET_SELECTED_LABWARE_NAME' +export const SET_SELECTED_LABWARE = 'SET_SELECTED_LABWARE' +export const CLEAR_SELECTED_LABWARE = 'CLEAR_SELECTED_LABWARE' +export const SET_INITIAL_POSITION = 'SET_INITIAL_POSITION' +export const SET_FINAL_POSITION = 'SET_FINAL_POSITION' +export const APPLY_OFFSET = 'APPLY_OFFSET' diff --git a/app/src/redux/protocol-runs/constants/lpc/index.ts b/app/src/redux/protocol-runs/constants/lpc/index.ts new file mode 100644 index 00000000000..3469ff9cd4a --- /dev/null +++ b/app/src/redux/protocol-runs/constants/lpc/index.ts @@ -0,0 +1,2 @@ +export * from './actions' +export * from './steps' diff --git a/app/src/redux/protocol-runs/constants/lpc/steps.ts b/app/src/redux/protocol-runs/constants/lpc/steps.ts new file mode 100644 index 00000000000..e2ce6f337e1 --- /dev/null +++ b/app/src/redux/protocol-runs/constants/lpc/steps.ts @@ -0,0 +1,25 @@ +/** + * A step is associated with a view or multiple views that are a part of the + * core flow. They are driven by CTA and are not side effects of robot state. + * + * Advancing a step advances the step counter, going back a step lowers + * the step counter. If advancing/going back to a different view does not alter the step counter, + * then the view should either be associated with an existing step or should be independent of any step (ex, "robot in motion"). + * + */ +export const LPC_STEP = { + BEFORE_BEGINNING: 'BEFORE_BEGINNING', + ATTACH_PROBE: 'ATTACH_PROBE', + HANDLE_LABWARE: 'HANDLE_LABWARE', + DETACH_PROBE: 'DETACH_PROBE', + LPC_COMPLETE: 'LPC_COMPLETE', +} as const + +// All LPC steps, in order. +export const LPC_STEPS = [ + LPC_STEP.BEFORE_BEGINNING, + LPC_STEP.ATTACH_PROBE, + LPC_STEP.HANDLE_LABWARE, + LPC_STEP.DETACH_PROBE, + LPC_STEP.LPC_COMPLETE, +] diff --git a/app/src/redux/protocol-runs/reducer/index.ts b/app/src/redux/protocol-runs/reducer/index.ts index 48facfbe8d1..6626b30bc0b 100644 --- a/app/src/redux/protocol-runs/reducer/index.ts +++ b/app/src/redux/protocol-runs/reducer/index.ts @@ -32,6 +32,10 @@ export const protocolRunReducer: Reducer = ( case Constants.START_LPC: case Constants.FINISH_LPC: case Constants.PROCEED_STEP: + case Constants.GO_BACK_STEP: + case Constants.SET_SELECTED_LABWARE_NAME: + case Constants.SET_SELECTED_LABWARE: + case Constants.CLEAR_SELECTED_LABWARE: case Constants.SET_INITIAL_POSITION: case Constants.SET_FINAL_POSITION: { const runId = action.payload.runId diff --git a/app/src/redux/protocol-runs/reducer/lpc.ts b/app/src/redux/protocol-runs/reducer/lpc.ts index ca27fac6273..60c766b7295 100644 --- a/app/src/redux/protocol-runs/reducer/lpc.ts +++ b/app/src/redux/protocol-runs/reducer/lpc.ts @@ -1,15 +1,25 @@ import { PROCEED_STEP, + SET_SELECTED_LABWARE, SET_INITIAL_POSITION, SET_FINAL_POSITION, FINISH_LPC, START_LPC, + GO_BACK_STEP, + SET_SELECTED_LABWARE_NAME, + CLEAR_SELECTED_LABWARE, + APPLY_OFFSET, } from '../constants' -import { updateWorkingOffset } from './transforms' +import { updateOffsetsForURI } from './transforms' -import type { LPCWizardAction, LPCWizardState } from '../types' +import type { + LPCWizardAction, + LPCWizardState, + SelectedLabwareInfo, +} from '../types' // TODO(jh, 01-17-25): A lot of this state should live above the LPC slice, in the general protocolRuns slice instead. +// We should make selectors for that state, too! export function LPCReducer( state: LPCWizardState | undefined, action: LPCWizardAction @@ -27,28 +37,101 @@ export function LPCReducer( ? currentStepIndex + 1 : currentStepIndex - const nextStepIdx = - newStepIdx + 1 < totalStepCount ? newStepIdx + 1 : null - const nextStep = - nextStepIdx != null ? state.steps.all[nextStepIdx] : null + return { + ...state, + steps: { + ...state.steps, + currentStepIndex: newStepIdx, + }, + } + } + + case GO_BACK_STEP: { + const { currentStepIndex } = state.steps + const newStepIdx = currentStepIndex > 0 ? currentStepIndex - 1 : 0 return { ...state, steps: { ...state.steps, currentStepIndex: newStepIdx, - current: state.steps.all[newStepIdx], - next: nextStep, + }, + } + } + + case SET_SELECTED_LABWARE_NAME: { + const lwUri = action.payload.labwareUri + const thisLwInfo = state.labwareInfo.labware[lwUri] + + const selectedLabware: SelectedLabwareInfo = { + uri: action.payload.labwareUri, + id: thisLwInfo.id, + offsetLocationDetails: null, + } + + return { + ...state, + labwareInfo: { + ...state.labwareInfo, + selectedLabware, + }, + } + } + + case SET_SELECTED_LABWARE: { + const lwUri = action.payload.labwareUri + const thisLwInfo = state.labwareInfo.labware[lwUri] + + const selectedLabware: SelectedLabwareInfo = { + uri: action.payload.labwareUri, + id: thisLwInfo.id, + offsetLocationDetails: action.payload.location, + } + + return { + ...state, + labwareInfo: { + ...state.labwareInfo, + selectedLabware, + }, + } + } + + case CLEAR_SELECTED_LABWARE: { + return { + ...state, + labwareInfo: { + ...state.labwareInfo, + selectedLabware: null, }, } } case SET_INITIAL_POSITION: - case SET_FINAL_POSITION: + case SET_FINAL_POSITION: { + const lwUri = action.payload.labwareUri + return { ...state, - workingOffsets: updateWorkingOffset(state.workingOffsets, action), + labwareInfo: { + ...state.labwareInfo, + labware: { + ...state.labwareInfo.labware, + [lwUri]: { + ...state.labwareInfo.labware[lwUri], + offsetDetails: updateOffsetsForURI(state, action), + }, + }, + }, } + } + + case APPLY_OFFSET: { + // TODO(jh, 01-30-25): Update the existing offset in the store, and clear the + // the working offset state. This will break the legacy LPC "apply all offsets" + // functionality, so this must be implemented simultaneously with the API changes. + break + } case FINISH_LPC: return undefined diff --git a/app/src/redux/protocol-runs/reducer/transforms/lpc.ts b/app/src/redux/protocol-runs/reducer/transforms/lpc.ts index 3d08fadee62..7ca2eece148 100644 --- a/app/src/redux/protocol-runs/reducer/transforms/lpc.ts +++ b/app/src/redux/protocol-runs/reducer/transforms/lpc.ts @@ -1,47 +1,65 @@ +import type { + LPCWizardAction, + LPCWizardState, + OffsetDetails, +} from '../../types' import isEqual from 'lodash/isEqual' +import { + SET_FINAL_POSITION, + SET_INITIAL_POSITION, +} from '/app/redux/protocol-runs' -import type { LPCWizardAction, WorkingOffset } from '../../types' - -export function updateWorkingOffset( - workingOffsets: WorkingOffset[], +// Handle positional updates, only updating the working offset that matches the location specified in the action. +export function updateOffsetsForURI( + state: LPCWizardState, action: Extract< LPCWizardAction, { type: 'SET_INITIAL_POSITION' | 'SET_FINAL_POSITION' } > -): WorkingOffset[] { +): OffsetDetails[] { const { type, payload } = action - const { labwareId, location, position } = payload - const existingRecordIndex = workingOffsets.findIndex( - record => - record.labwareId === labwareId && isEqual(record.location, location) + const { labwareUri, position, location } = payload + const { offsetDetails } = state.labwareInfo.labware[labwareUri] + const relevantDetailsIdx = offsetDetails.findIndex(detail => + isEqual(location, detail.locationDetails) ) - if (existingRecordIndex < 0) { - return [ - ...workingOffsets, - { - labwareId, - location, - initialPosition: type === 'SET_INITIAL_POSITION' ? position : null, - finalPosition: type === 'SET_FINAL_POSITION' ? position : null, - }, - ] + if (relevantDetailsIdx < 0) { + console.warn(`No matching location found for ${labwareUri}`) + return offsetDetails } else { - const updatedOffset = { - ...workingOffsets[existingRecordIndex], - ...(type === 'SET_INITIAL_POSITION' && { - initialPosition: position, - finalPosition: null, - }), - ...(type === 'SET_FINAL_POSITION' && { - finalPosition: position, - }), - } - - return [ - ...workingOffsets.slice(0, existingRecordIndex), - updatedOffset, - ...workingOffsets.slice(existingRecordIndex + 1), + const relevantDetail = offsetDetails[relevantDetailsIdx] + const newOffsetDetails = [ + ...offsetDetails.slice(0, relevantDetailsIdx), + ...offsetDetails.slice(relevantDetailsIdx + 1), ] + + if (relevantDetail.workingOffset == null) { + const newWorkingDetail = { + initialPosition: type === SET_INITIAL_POSITION ? position : null, + finalPosition: type === SET_FINAL_POSITION ? position : null, + } + + return [ + ...newOffsetDetails, + { ...relevantDetail, workingOffset: newWorkingDetail }, + ] + } else { + const newWorkingDetail = + type === SET_INITIAL_POSITION + ? { + initialPosition: position, + finalPosition: null, + } + : { + ...relevantDetail.workingOffset, + finalPosition: position, + } + + return [ + ...newOffsetDetails, + { ...relevantDetail, workingOffset: newWorkingDetail }, + ] + } } } diff --git a/app/src/redux/protocol-runs/selectors/lpc/index.ts b/app/src/redux/protocol-runs/selectors/lpc/index.ts index 5bd4a518ac2..0b9e54e22e1 100644 --- a/app/src/redux/protocol-runs/selectors/lpc/index.ts +++ b/app/src/redux/protocol-runs/selectors/lpc/index.ts @@ -1,2 +1,3 @@ export * from './labware' export * from './pipettes' +export * from './steps' diff --git a/app/src/redux/protocol-runs/selectors/lpc/labware.ts b/app/src/redux/protocol-runs/selectors/lpc/labware.ts deleted file mode 100644 index fd831163cc2..00000000000 --- a/app/src/redux/protocol-runs/selectors/lpc/labware.ts +++ /dev/null @@ -1,254 +0,0 @@ -import { createSelector } from 'reselect' -import isEqual from 'lodash/isEqual' - -import { - getIsTiprack, - getLabwareDisplayName, - getLabwareDefURI, - getVectorSum, - getVectorDifference, - IDENTITY_VECTOR, -} from '@opentrons/shared-data' - -import { getCurrentOffsetForLabwareInLocation } from '/app/transformations/analysis' -import { getItemLabwareDef } from './transforms' - -import type { Selector } from 'reselect' -import type { - VectorOffset, - LegacyLabwareOffsetLocation, -} from '@opentrons/api-client' -import type { LabwareDefinition2, Coordinates } from '@opentrons/shared-data' -import type { State } from '../../../types' - -// TODO(jh, 01-16-25): Revisit once LPC `step` refactors are completed. -// eslint-disable-next-line opentrons/no-imports-across-applications -import type { LabwarePositionCheckStep } from '/app/organisms/LabwarePositionCheck/types' - -// TODO(jh, 01-13-25): Remove the explicit type casting after restructuring "step". -// TODO(jh, 01-17-25): As LPC selectors become finalized, wrap them in createSelector. - -export const selectActiveLwInitialPosition = ( - step: LabwarePositionCheckStep | null, - runId: string, - state: State -): VectorOffset | null => { - const { workingOffsets } = state.protocolRuns[runId]?.lpc ?? {} - - if (step != null && workingOffsets != null) { - const labwareId = 'labwareId' in step ? step.labwareId : '' - const location = 'location' in step ? step.location : '' - - return ( - workingOffsets.find( - o => - o.labwareId === labwareId && - isEqual(o.location, location) && - o.initialPosition != null - )?.initialPosition ?? null - ) - } else { - if (workingOffsets == null) { - console.warn('LPC state not initalized before selector use.') - } - - return null - } -} - -export const selectActiveLwExistingOffset = ( - runId: string, - state: State -): VectorOffset => { - const { existingOffsets, steps } = state.protocolRuns[runId]?.lpc ?? {} - - if (existingOffsets == null || steps == null) { - console.warn('LPC state not initalized before selector use.') - return IDENTITY_VECTOR - } else if ( - !('labwareId' in steps.current) || - !('location' in steps.current) || - !('slotName' in steps.current.location) - ) { - console.warn( - `No labwareId or location in current step: ${steps.current.section}` - ) - return IDENTITY_VECTOR - } else { - const lwUri = getLabwareDefURI( - getItemLabwareDefFrom(runId, state) as LabwareDefinition2 - ) - - return ( - getCurrentOffsetForLabwareInLocation( - existingOffsets, - lwUri, - steps.current.location - )?.vector ?? IDENTITY_VECTOR - ) - } -} - -export interface SelectOffsetsToApplyResult { - definitionUri: string - location: LegacyLabwareOffsetLocation - vector: Coordinates -} - -export const selectOffsetsToApply = ( - runId: string -): Selector => - createSelector( - (state: State) => state.protocolRuns[runId]?.lpc?.workingOffsets, - (state: State) => state.protocolRuns[runId]?.lpc?.protocolData, - (state: State) => state.protocolRuns[runId]?.lpc?.existingOffsets, - (workingOffsets, protocolData, existingOffsets) => { - if ( - workingOffsets == null || - protocolData == null || - existingOffsets == null - ) { - console.warn('LPC state not initalized before selector use.') - return [] - } - - return workingOffsets.map( - ({ initialPosition, finalPosition, labwareId, location }) => { - const definitionUri = - protocolData.labware.find(l => l.id === labwareId)?.definitionUri ?? - null - - if ( - finalPosition == null || - initialPosition == null || - definitionUri == null - ) { - throw new Error( - `cannot create offset for labware with id ${labwareId}, in location ${JSON.stringify( - location - )}, with initial position ${String( - initialPosition - )}, and final position ${String(finalPosition)}` - ) - } else { - const existingOffset = - getCurrentOffsetForLabwareInLocation( - existingOffsets, - definitionUri, - location - )?.vector ?? IDENTITY_VECTOR - const vector = getVectorSum( - existingOffset, - getVectorDifference(finalPosition, initialPosition) - ) - return { definitionUri, location, vector } - } - } - ) - } - ) - -export const selectIsActiveLwTipRack = ( - runId: string, - state: State -): boolean => { - const { current } = state.protocolRuns[runId]?.lpc?.steps ?? {} - - if (current != null && 'labwareId' in current) { - return getIsTiprack( - getItemLabwareDefFrom(runId, state) as LabwareDefinition2 - ) - } else { - console.warn( - 'No labwareId in step or LPC state not initalized before selector use.' - ) - return false - } -} - -export const selectLwDisplayName = (runId: string, state: State): string => { - const { current } = state.protocolRuns[runId]?.lpc?.steps ?? {} - - if (current != null && 'labwareId' in current) { - return getLabwareDisplayName( - getItemLabwareDefFrom(runId, state) as LabwareDefinition2 - ) - } else { - console.warn( - 'No labwareId in step or LPC state not initalized before selector use.' - ) - return '' - } -} - -export const selectActiveAdapterDisplayName = ( - runId: string, - state: State -): string => { - const { protocolData, labwareDefs, steps } = - state.protocolRuns[runId]?.lpc ?? {} - - if (protocolData == null || labwareDefs == null || steps == null) { - console.warn('LPC state not initialized before selector use.') - return '' - } - - return 'adapterId' in steps.current && steps.current.adapterId != null - ? getItemLabwareDef({ - labwareId: steps.current.adapterId, - loadedLabware: protocolData.labware, - labwareDefs, - })?.metadata.displayName ?? '' - : '' -} - -export const selectItemLabwareDef = ( - runId: string -): Selector => - createSelector( - (state: State) => state.protocolRuns[runId]?.lpc?.steps.current, - (state: State) => state.protocolRuns[runId]?.lpc?.labwareDefs, - (state: State) => state.protocolRuns[runId]?.lpc?.protocolData.labware, - (current, labwareDefs, loadedLabware) => { - const labwareId = - current != null && 'labwareId' in current ? current.labwareId : '' - - if (labwareId === '' || labwareDefs == null || loadedLabware == null) { - console.warn( - `No labwareId associated with step: ${current?.section} or LPC state not initialized before selector use.` - ) - return null - } - - return getItemLabwareDef({ - labwareId, - labwareDefs, - loadedLabware, - }) - } - ) - -const getItemLabwareDefFrom = ( - runId: string, - state: State -): LabwareDefinition2 | null => { - const current = state.protocolRuns[runId]?.lpc?.steps.current - const labwareDefs = state.protocolRuns[runId]?.lpc?.labwareDefs - const loadedLabware = state.protocolRuns[runId]?.lpc?.protocolData.labware - - const labwareId = - current != null && 'labwareId' in current ? current.labwareId : '' - - if (labwareId === '' || labwareDefs == null || loadedLabware == null) { - console.warn( - `No labwareId associated with step: ${current?.section} or LPC state not initialized before selector use.` - ) - return null - } - - return getItemLabwareDef({ - labwareId, - labwareDefs, - loadedLabware, - }) -} diff --git a/app/src/redux/protocol-runs/selectors/lpc/labware/index.ts b/app/src/redux/protocol-runs/selectors/lpc/labware/index.ts new file mode 100644 index 00000000000..0cb1066ebb1 --- /dev/null +++ b/app/src/redux/protocol-runs/selectors/lpc/labware/index.ts @@ -0,0 +1,2 @@ +export * from './offsets' +export * from './info' diff --git a/app/src/redux/protocol-runs/selectors/lpc/labware/info.ts b/app/src/redux/protocol-runs/selectors/lpc/labware/info.ts new file mode 100644 index 00000000000..1dce07cc514 --- /dev/null +++ b/app/src/redux/protocol-runs/selectors/lpc/labware/info.ts @@ -0,0 +1,165 @@ +import { createSelector } from 'reselect' + +import { getIsTiprack, getLabwareDisplayName } from '@opentrons/shared-data' + +import { + getItemLabwareDef, + getSelectedLabwareOffsetDetails, + getSelectedLabwareDefFrom, +} from '../transforms' + +import type { Selector } from 'reselect' +import type { + LegacyLabwareOffsetLocation, + VectorOffset, +} from '@opentrons/api-client' +import type { State } from '/app/redux/types' +import type { Coordinates, LabwareDefinition2 } from '@opentrons/shared-data' +import type { + LPCFlowType, + LPCLabwareInfo, + SelectedLabwareInfo, +} from '/app/redux/protocol-runs' + +export const selectAllLabwareInfo = ( + runId: string +): Selector => + createSelector( + (state: State) => state.protocolRuns[runId]?.lpc?.labwareInfo.labware, + labware => labware ?? {} + ) + +export const selectSelectedLabwareInfo = ( + runId: string +): Selector => + createSelector( + (state: State) => + state.protocolRuns[runId]?.lpc?.labwareInfo.selectedLabware, + selectedLabware => selectedLabware ?? null + ) + +export const selectSelectedLwInitialPosition = ( + runId: string +): Selector => + createSelector( + (state: State) => getSelectedLabwareOffsetDetails(runId, state), + details => { + const workingOffset = details?.workingOffset + + if (workingOffset == null) { + return null + } else { + return workingOffset.initialPosition + } + } + ) + +export interface SelectOffsetsToApplyResult { + definitionUri: string + location: LegacyLabwareOffsetLocation + vector: Coordinates +} + +export const selectSelectedLabwareFlowType = ( + runId: string +): Selector => + createSelector( + (state: State) => + state.protocolRuns[runId]?.lpc?.labwareInfo.selectedLabware, + selectedLabware => { + if (selectedLabware?.offsetLocationDetails == null) { + return null + } else { + if (selectedLabware.offsetLocationDetails.kind === 'default') { + return 'default' + } else { + return 'location-specific' + } + } + } + ) + +export const selectSelectedLabwareDisplayName = ( + runId: string +): Selector => + createSelector( + (state: State) => state.protocolRuns[runId]?.lpc?.labwareInfo.labware, + (state: State) => + state.protocolRuns[runId]?.lpc?.labwareInfo.selectedLabware?.uri, + (lw, uri) => { + if (lw == null || uri == null) { + console.warn('Cannot access invalid labware') + return '' + } else { + return lw[uri].displayName + } + } + ) + +export const selectIsSelectedLwTipRack = ( + runId: string +): Selector => + createSelector( + (state: State) => getSelectedLabwareDefFrom(runId, state), + def => (def != null ? getIsTiprack(def) : false) + ) + +export const selectSelectedLwDisplayName = ( + runId: string +): Selector => + createSelector( + (state: State) => getSelectedLabwareDefFrom(runId, state), + def => (def != null ? getLabwareDisplayName(def) : '') + ) + +export const selectActiveAdapterDisplayName = ( + runId: string +): Selector => + createSelector( + (state: State) => + state.protocolRuns[runId]?.lpc?.labwareInfo.selectedLabware, + (state: State) => state?.protocolRuns[runId]?.lpc?.labwareDefs, + (state: State) => state?.protocolRuns[runId]?.lpc?.protocolData, + (selectedLabware, labwareDefs, analysis) => { + const adapterId = selectedLabware?.offsetLocationDetails?.adapterId + + if (selectedLabware == null || labwareDefs == null || analysis == null) { + console.warn('No selected labware or store not properly initialized.') + return '' + } + + return adapterId != null + ? getItemLabwareDef({ + labwareId: adapterId, + loadedLabware: analysis.labware, + labwareDefs, + })?.metadata.displayName ?? '' + : '' + } + ) + +export const selectSelectedLabwareDef = ( + runId: string +): Selector => + createSelector( + (state: State) => + state.protocolRuns[runId]?.lpc?.labwareInfo.selectedLabware, + (state: State) => state.protocolRuns[runId]?.lpc?.labwareDefs, + (state: State) => state.protocolRuns[runId]?.lpc?.protocolData.labware, + (selectedLabware, labwareDefs, loadedLabware) => { + if ( + selectedLabware == null || + labwareDefs == null || + loadedLabware == null + ) { + console.warn('No selected labware or store not properly initialized.') + return null + } else { + return getItemLabwareDef({ + labwareId: selectedLabware.id, + labwareDefs, + loadedLabware, + }) + } + } + ) diff --git a/app/src/redux/protocol-runs/selectors/lpc/labware/offsets.ts b/app/src/redux/protocol-runs/selectors/lpc/labware/offsets.ts new file mode 100644 index 00000000000..ad0f85f3c83 --- /dev/null +++ b/app/src/redux/protocol-runs/selectors/lpc/labware/offsets.ts @@ -0,0 +1,134 @@ +import { createSelector } from 'reselect' + +import { + getVectorDifference, + getVectorSum, + IDENTITY_VECTOR, +} from '@opentrons/shared-data' + +import { + getSelectedLabwareOffsetDetails, + getOffsetDetailsForAllLabware, +} from '../transforms' + +import type { Selector } from 'reselect' +import type { VectorOffset, LabwareOffset } from '@opentrons/api-client' +import type { State } from '/app/redux/types' +import type { + LabwareDetails, + OffsetDetails, + SelectOffsetsToApplyResult, +} from '/app/redux/protocol-runs' + +export const selectSelectedOffsetDetails = ( + runId: string +): Selector => + createSelector( + (state: State) => + state.protocolRuns[runId]?.lpc?.labwareInfo.selectedLabware?.uri, + (state: State) => state.protocolRuns[runId]?.lpc?.labwareInfo.labware, + (uri, lw) => { + if (uri == null || lw == null) { + console.warn('Failed to access labware details.') + return [] + } else { + return lw[uri].offsetDetails ?? [] + } + } + ) + +export const selectSelectedLwExistingOffset = ( + runId: string +): Selector => + createSelector( + (state: State) => getSelectedLabwareOffsetDetails(runId, state), + details => { + const existingVector = details?.existingOffset?.vector + + if (existingVector == null) { + console.warn('No existing offset vector found for active labware') + return IDENTITY_VECTOR + } else { + return existingVector ?? IDENTITY_VECTOR + } + } + ) + +export const selectOffsetsToApply = ( + runId: string +): Selector => + createSelector( + (state: State) => getOffsetDetailsForAllLabware(runId, state), + (state: State) => state.protocolRuns[runId]?.lpc?.protocolData, + (allDetails, protocolData): SelectOffsetsToApplyResult[] => { + if (protocolData == null) { + console.warn('LPC state not initalized before selector use.') + return [] + } + + return allDetails.flatMap( + ({ workingOffset, existingOffset, locationDetails }) => { + const definitionUri = locationDetails.definitionUri + const { initialPosition, finalPosition } = workingOffset ?? {} + + if ( + finalPosition == null || + initialPosition == null || + definitionUri == null || + existingOffset == null || + // The slotName is null when applying a default offset. This condition + // is effectively a stub to maintain compatability with the legacy HTTP API, + // and will be refactored soon. + locationDetails.slotName == null + ) { + console.error( + `Cannot generate offsets for labware with incomplete details. ID: ${locationDetails.labwareId}` + ) + return [] + } + + const existingOffsetVector = existingOffset.vector + const finalVector = getVectorSum( + existingOffsetVector, + getVectorDifference(finalPosition, initialPosition) + ) + return [ + { + definitionUri, + location: { ...locationDetails }, + vector: finalVector, + }, + ] + } + ) + } + ) + +// TODO(jh, 01-29-25): Revisit this once "View Offsets" is refactored out of LPC. +export const selectLabwareOffsetsForAllLw = ( + runId: string +): Selector => + createSelector( + (state: State) => state.protocolRuns[runId]?.lpc?.labwareInfo.labware, + (labware): LabwareOffset[] => { + if (labware == null) { + console.warn('Labware info not initialized in state') + return [] + } + + return Object.values(labware).flatMap((details: LabwareDetails) => + details.offsetDetails.map(offsetDetail => ({ + id: details.id, + createdAt: offsetDetail?.existingOffset?.createdAt ?? '', + definitionUri: offsetDetail.locationDetails.definitionUri, + location: { + slotName: + offsetDetail.locationDetails.slotName ?? 'DEFAULT_OFFSET_STUB', + moduleModel: offsetDetail.locationDetails.moduleModel, + definitionUri: offsetDetail.locationDetails.definitionUri, + }, + vector: offsetDetail?.existingOffset?.vector ?? IDENTITY_VECTOR, + })) + ) + } + ) diff --git a/app/src/redux/protocol-runs/selectors/lpc/pipettes.ts b/app/src/redux/protocol-runs/selectors/lpc/pipettes.ts index 1070e80946e..748081b18cb 100644 --- a/app/src/redux/protocol-runs/selectors/lpc/pipettes.ts +++ b/app/src/redux/protocol-runs/selectors/lpc/pipettes.ts @@ -1,39 +1,36 @@ +import { createSelector } from 'reselect' + import { getPipetteNameSpecs } from '@opentrons/shared-data' +import type { Selector } from 'reselect' import type { LoadedPipette, PipetteChannels } from '@opentrons/shared-data' - -// TODO(jh, 01-16-25): Revisit once LPC `step` refactors are completed. -// eslint-disable-next-line opentrons/no-imports-across-applications -import type { LabwarePositionCheckStep } from '/app/organisms/LabwarePositionCheck/types' import type { State } from '../../../types' export const selectActivePipette = ( - step: LabwarePositionCheckStep, - runId: string, - state: State -): LoadedPipette | null => { - const { protocolData } = state.protocolRuns[runId]?.lpc ?? {} - const pipetteId = 'pipetteId' in step ? step.pipetteId : '' - - if (pipetteId === '') { - console.warn(`No matching pipette found for pipetteId ${pipetteId}`) - } else if (protocolData == null) { - console.warn('LPC state not initalized before selector use.') - } - - return ( - protocolData?.pipettes.find(pipette => pipette.id === pipetteId) ?? null + runId: string +): Selector => + createSelector( + (state: State) => state.protocolRuns[runId]?.lpc?.activePipetteId, + (state: State) => state.protocolRuns[runId]?.lpc?.protocolData, + (activePipetteId, protocolData) => { + if (activePipetteId == null || protocolData == null) { + console.warn('LPC state not initalized before selector use.') + return null + } else { + return ( + protocolData?.pipettes.find( + pipette => pipette.id === activePipetteId + ) ?? null + ) + } + } ) -} export const selectActivePipetteChannelCount = ( - step: LabwarePositionCheckStep, - runId: string, - state: State -): PipetteChannels => { - const pipetteName = selectActivePipette(step, runId, state)?.pipetteName - - return pipetteName != null - ? getPipetteNameSpecs(pipetteName)?.channels ?? 1 - : 1 -} + runId: string +): Selector => + createSelector( + (state: State) => selectActivePipette(runId)(state)?.pipetteName, + pipetteName => + pipetteName != null ? getPipetteNameSpecs(pipetteName)?.channels ?? 1 : 1 + ) diff --git a/app/src/redux/protocol-runs/selectors/lpc/steps.ts b/app/src/redux/protocol-runs/selectors/lpc/steps.ts new file mode 100644 index 00000000000..a4d34160140 --- /dev/null +++ b/app/src/redux/protocol-runs/selectors/lpc/steps.ts @@ -0,0 +1,15 @@ +import { createSelector } from 'reselect' + +import { LPC_STEP } from '/app/redux/protocol-runs' + +import type { Selector } from 'reselect' +import type { State } from '../../../types' +import type { LPCStep } from '/app/redux/protocol-runs' + +export const selectCurrentStep = (runId: string): Selector => + createSelector( + (state: State) => state.protocolRuns[runId]?.lpc?.steps.currentStepIndex, + (state: State) => state.protocolRuns[runId]?.lpc?.steps.all, + (currentIdx, allSteps) => + allSteps?.[currentIdx ?? 0] ?? LPC_STEP.BEFORE_BEGINNING + ) diff --git a/app/src/redux/protocol-runs/selectors/lpc/transforms.ts b/app/src/redux/protocol-runs/selectors/lpc/transforms.ts index 780e5336133..9705fd82b17 100644 --- a/app/src/redux/protocol-runs/selectors/lpc/transforms.ts +++ b/app/src/redux/protocol-runs/selectors/lpc/transforms.ts @@ -1,9 +1,13 @@ +import isEqual from 'lodash/isEqual' + import { getLabwareDefURI } from '@opentrons/shared-data' import type { CompletedProtocolAnalysis, LabwareDefinition2, } from '@opentrons/shared-data' +import type { State } from '/app/redux/types' +import type { LabwareDetails, OffsetDetails } from '/app/redux/protocol-runs' interface GetLabwareDefsForLPCParams { labwareId: string @@ -11,11 +15,11 @@ interface GetLabwareDefsForLPCParams { labwareDefs: LabwareDefinition2[] } -export function getItemLabwareDef({ +export const getItemLabwareDef = ({ labwareId, loadedLabware, labwareDefs, -}: GetLabwareDefsForLPCParams): LabwareDefinition2 | null { +}: GetLabwareDefsForLPCParams): LabwareDefinition2 | null => { const labwareDefUri = loadedLabware.find(l => l.id === labwareId)?.definitionUri ?? null @@ -27,3 +31,53 @@ export function getItemLabwareDef({ labwareDefs.find(def => getLabwareDefURI(def) === labwareDefUri) ?? null ) } + +export const getSelectedLabwareOffsetDetails = ( + runId: string, + state: State +): OffsetDetails | null => { + const selectedLabware = + state.protocolRuns[runId]?.lpc?.labwareInfo.selectedLabware + const offsetDetails = + state.protocolRuns[runId]?.lpc?.labwareInfo.labware[ + selectedLabware?.uri ?? '' + ].offsetDetails + + return ( + offsetDetails?.find(offset => + isEqual(offset.locationDetails, selectedLabware?.offsetLocationDetails) + ) ?? null + ) +} + +export const getSelectedLabwareDefFrom = ( + runId: string, + state: State +): LabwareDefinition2 | null => { + const selectedLabware = + state.protocolRuns[runId]?.lpc?.labwareInfo.selectedLabware + const labwareDefs = state?.protocolRuns[runId]?.lpc?.labwareDefs + const analysis = state?.protocolRuns[runId]?.lpc?.protocolData + + if (selectedLabware == null || labwareDefs == null || analysis == null) { + console.warn('No selected labware or store not properly initialized.') + return null + } else { + return getItemLabwareDef({ + labwareId: selectedLabware.id, + labwareDefs, + loadedLabware: analysis.labware, + }) + } +} + +export const getOffsetDetailsForAllLabware = ( + runId: string, + state: State +): OffsetDetails[] => { + const labware = state?.protocolRuns[runId]?.lpc?.labwareInfo.labware ?? {} + + return Object(labware).values( + (details: LabwareDetails) => details.offsetDetails + ) +} diff --git a/app/src/redux/protocol-runs/types/lpc.ts b/app/src/redux/protocol-runs/types/lpc.ts index 0e31a166bf1..843ae3e8aaf 100644 --- a/app/src/redux/protocol-runs/types/lpc.ts +++ b/app/src/redux/protocol-runs/types/lpc.ts @@ -1,38 +1,100 @@ import type { DeckConfiguration, + ModuleModel, LabwareDefinition2, CompletedProtocolAnalysis, } from '@opentrons/shared-data' -import type { - LegacyLabwareOffsetLocation, - VectorOffset, - LabwareOffset, -} from '@opentrons/api-client' +import type { VectorOffset } from '@opentrons/api-client' +import type { LPC_STEP } from '/app/redux/protocol-runs' -// TODO(jh, 01-16-25): Make sure there's no cross importing after `steps` is refactored. -// eslint-disable-next-line opentrons/no-imports-across-applications -import type { StepsInfo } from '/app/organisms/LabwarePositionCheck/redux/types' +type LabwareURI = string +type LabwareId = string -export interface PositionParams { - labwareId: string - location: LegacyLabwareOffsetLocation - position: VectorOffset | null +export type LPCStep = keyof typeof LPC_STEP + +export type LPCFlowType = 'default' | 'location-specific' +export type LPCOffsetKind = 'default' | 'location-specific' | 'hardcoded' + +export interface StepInfo { + currentStepIndex: number + totalStepCount: number + all: LPCStep[] +} + +export interface ExistingOffset { + createdAt: string + vector: VectorOffset } export interface WorkingOffset { - labwareId: string - location: LegacyLabwareOffsetLocation initialPosition: VectorOffset | null finalPosition: VectorOffset | null } +export interface PositionParams { + labwareUri: string + location: OffsetLocationDetails + position: VectorOffset | null +} + +interface LPCLabwareOffsetDetails { + kind: LPCOffsetKind + labwareId: string + definitionUri: string + moduleModel?: ModuleModel + moduleId?: string + adapterId?: string +} + +export interface LPCLabwareOffsetDefaultDetails + extends LPCLabwareOffsetDetails { + slotName: null + kind: 'default' +} + +export interface LPCLabwareOffsetAppliedLocationDetails + extends LPCLabwareOffsetDetails { + slotName: string + kind: 'location-specific' +} + +export interface OffsetDetails { + existingOffset: ExistingOffset | null + workingOffset: WorkingOffset | null + locationDetails: OffsetLocationDetails +} + +export interface LabwareDetails { + id: LabwareId + displayName: string + offsetDetails: OffsetDetails[] +} + +export type OffsetLocationDetails = + | LPCLabwareOffsetDefaultDetails + | LPCLabwareOffsetAppliedLocationDetails + +export interface SelectedLabwareInfo { + uri: LabwareURI + id: LabwareId + /* Indicates the type of LPC offset flow the user is performing, a "default" flow, a "location-specific" flow, or no active flow. + * There is no `slotName` when a user performs the default offset flow. + * Until the user is in a default or location-specific offset flow, there are no location details. */ + offsetLocationDetails: OffsetLocationDetails | null +} + +export interface LPCLabwareInfo { + selectedLabware: SelectedLabwareInfo | null + labware: Record +} + export interface LPCWizardState { - workingOffsets: WorkingOffset[] + steps: StepInfo + activePipetteId: string + labwareInfo: LPCLabwareInfo protocolData: CompletedProtocolAnalysis labwareDefs: LabwareDefinition2[] deckConfig: DeckConfiguration - steps: StepsInfo - existingOffsets: LabwareOffset[] protocolName: string maintenanceRunId: string } @@ -52,6 +114,33 @@ export interface ProceedStepAction { payload: { runId: string } } +export interface GoBackStepAction { + type: 'GO_BACK_STEP' + payload: { runId: string } +} + +export interface SelectedLabwareNameAction { + type: 'SET_SELECTED_LABWARE_NAME' + payload: { + runId: string + labwareUri: LabwareURI + } +} + +export interface SelectedLabwareAction { + type: 'SET_SELECTED_LABWARE' + payload: { + runId: string + labwareUri: LabwareURI + location: OffsetLocationDetails | null + } +} + +export interface ClearSelectedLabwareAction { + type: 'CLEAR_SELECTED_LABWARE' + payload: { runId: string } +} + export interface InitialPositionAction { type: 'SET_INITIAL_POSITION' payload: PositionParams & { runId: string } @@ -62,9 +151,19 @@ export interface FinalPositionAction { payload: PositionParams & { runId: string } } +export interface ApplyOffsetAction { + type: 'APPLY_OFFSET' + payload: { runId: string; labwareUri: LabwareURI } +} + export type LPCWizardAction = | StartLPCAction | FinishLPCAction + | SelectedLabwareNameAction + | SelectedLabwareAction + | ClearSelectedLabwareAction | InitialPositionAction | FinalPositionAction + | ApplyOffsetAction | ProceedStepAction + | GoBackStepAction From 82995e755ef9c4eee3570ad4e43e5c6bfc1caea5 Mon Sep 17 00:00:00 2001 From: syao1226 <146495172+syao1226@users.noreply.github.com> Date: Mon, 3 Feb 2025 14:16:26 -0500 Subject: [PATCH 059/150] feat(protocol-designer): add submerge for aspirate and dispense (#17368) re AUTH-904, AUTH-905 # Overview In this PR, I added a Submerge section for aspirating and dispensing in the transfer step, but only when the liquid classes feature flag is enabled. ## Test Plan and Hands on Testing -Enable the liquid classes feature flag in the settings -Add a transfer step and verify that the submerge field appears for both aspirating and dispensing ## Changelog -Added submerge criteria: Submerge speed and Submerge delay duration -Added new submerge fields to 8_5_0 migration and updated fixture files ## Review requests ## Risk assessment --------- Co-authored-by: shiyaochen Co-authored-by: shiyaochen --- .../protocol/8/doItAllV3MigratedToV8.json | 4 + .../protocol/8/doItAllV4MigratedToV8.json | 4 + .../protocol/8/doItAllV7MigratedToV8.json | 4 + .../fixtures/protocol/8/doItAllV8.json | 4 + .../protocol/8/example_1_1_0MigratedToV8.json | 4 + .../8/newAdvancedSettingsAndMultiTemp.json | 4 + .../8/ninetySixChannelFullAndColumn.json | 8 ++ .../assets/localization/en/application.json | 1 + .../localization/en/protocol_steps.json | 2 + .../src/assets/localization/en/tooltip.json | 2 + protocol-designer/src/form-types.ts | 8 ++ .../src/load-file/migration/8_5_0.ts | 4 + .../StepTools/MoveLiquidTools/index.tsx | 74 ++++++++++++++++++- .../test/createPresavedStepForm.test.ts | 4 + .../formLevel/getDefaultsForStepType.ts | 4 + .../test/getDefaultsForStepType.test.ts | 4 + .../src/ui/steps/test/selectors.test.ts | 43 +++++++++++ 17 files changed, 177 insertions(+), 1 deletion(-) diff --git a/protocol-designer/fixtures/protocol/8/doItAllV3MigratedToV8.json b/protocol-designer/fixtures/protocol/8/doItAllV3MigratedToV8.json index e4419499678..941eacee730 100644 --- a/protocol-designer/fixtures/protocol/8/doItAllV3MigratedToV8.json +++ b/protocol-designer/fixtures/protocol/8/doItAllV3MigratedToV8.json @@ -149,6 +149,8 @@ "aspirate_mix_times": "2", "aspirate_mix_volume": "30", "aspirate_mmFromBottom": 1, + "aspirate_submerge_delay_seconds": null, + "aspirate_submerge_speed": null, "aspirate_touchTip_checkbox": true, "aspirate_touchTip_mmFromTop": -2, "aspirate_wellOrder_first": "t2b", @@ -173,6 +175,8 @@ "dispense_mix_times": null, "dispense_mix_volume": null, "dispense_mmFromBottom": 0.5, + "dispense_submerge_delay_seconds": null, + "dispense_submerge_speed": null, "dispense_touchTip_checkbox": true, "dispense_touchTip_mmFromTop": null, "dispense_wellOrder_first": "t2b", diff --git a/protocol-designer/fixtures/protocol/8/doItAllV4MigratedToV8.json b/protocol-designer/fixtures/protocol/8/doItAllV4MigratedToV8.json index 15032ca53cd..57386d3909a 100644 --- a/protocol-designer/fixtures/protocol/8/doItAllV4MigratedToV8.json +++ b/protocol-designer/fixtures/protocol/8/doItAllV4MigratedToV8.json @@ -181,6 +181,8 @@ "aspirate_mix_times": null, "aspirate_mix_volume": null, "aspirate_mmFromBottom": 1, + "aspirate_submerge_delay_seconds": null, + "aspirate_submerge_speed": null, "aspirate_touchTip_checkbox": false, "aspirate_touchTip_mmFromTop": null, "aspirate_wellOrder_first": "t2b", @@ -205,6 +207,8 @@ "dispense_mix_times": null, "dispense_mix_volume": null, "dispense_mmFromBottom": 0.5, + "dispense_submerge_delay_seconds": null, + "dispense_submerge_speed": null, "dispense_touchTip_checkbox": false, "dispense_touchTip_mmFromTop": null, "dispense_wellOrder_first": "t2b", diff --git a/protocol-designer/fixtures/protocol/8/doItAllV7MigratedToV8.json b/protocol-designer/fixtures/protocol/8/doItAllV7MigratedToV8.json index 1434bdfd45e..7d0746d8a29 100644 --- a/protocol-designer/fixtures/protocol/8/doItAllV7MigratedToV8.json +++ b/protocol-designer/fixtures/protocol/8/doItAllV7MigratedToV8.json @@ -199,6 +199,8 @@ "aspirate_mix_times": null, "aspirate_mix_volume": null, "aspirate_mmFromBottom": null, + "aspirate_submerge_delay_seconds": null, + "aspirate_submerge_speed": null, "aspirate_touchTip_checkbox": false, "aspirate_touchTip_mmFromTop": null, "aspirate_wellOrder_first": "t2b", @@ -223,6 +225,8 @@ "dispense_mix_times": null, "dispense_mix_volume": null, "dispense_mmFromBottom": null, + "dispense_submerge_delay_seconds": null, + "dispense_submerge_speed": null, "dispense_touchTip_checkbox": false, "dispense_touchTip_mmFromTop": null, "dispense_wellOrder_first": "t2b", diff --git a/protocol-designer/fixtures/protocol/8/doItAllV8.json b/protocol-designer/fixtures/protocol/8/doItAllV8.json index ce0ea883b0f..ea1bf2b3b9a 100644 --- a/protocol-designer/fixtures/protocol/8/doItAllV8.json +++ b/protocol-designer/fixtures/protocol/8/doItAllV8.json @@ -159,6 +159,8 @@ "aspirate_mix_times": null, "aspirate_mix_volume": null, "aspirate_mmFromBottom": null, + "aspirate_submerge_delay_seconds": null, + "aspirate_submerge_speed": null, "aspirate_touchTip_checkbox": false, "aspirate_touchTip_mmFromTop": null, "aspirate_wellOrder_first": "t2b", @@ -183,6 +185,8 @@ "dispense_mix_times": null, "dispense_mix_volume": null, "dispense_mmFromBottom": null, + "dispense_submerge_delay_seconds": null, + "dispense_submerge_speed": null, "dispense_touchTip_checkbox": false, "dispense_touchTip_mmFromTop": null, "dispense_wellOrder_first": "t2b", diff --git a/protocol-designer/fixtures/protocol/8/example_1_1_0MigratedToV8.json b/protocol-designer/fixtures/protocol/8/example_1_1_0MigratedToV8.json index 512e74a6821..fc926eb59c6 100644 --- a/protocol-designer/fixtures/protocol/8/example_1_1_0MigratedToV8.json +++ b/protocol-designer/fixtures/protocol/8/example_1_1_0MigratedToV8.json @@ -119,6 +119,8 @@ "aspirate_mix_times": 3, "aspirate_mix_volume": "2", "aspirate_mmFromBottom": 1, + "aspirate_submerge_delay_seconds": null, + "aspirate_submerge_speed": null, "aspirate_touchTip_checkbox": true, "aspirate_touchTip_mmFromTop": -12.8, "aspirate_wellOrder_first": "t2b", @@ -143,6 +145,8 @@ "dispense_mix_times": 2, "dispense_mix_volume": "3", "dispense_mmFromBottom": 2.5, + "dispense_submerge_delay_seconds": null, + "dispense_submerge_speed": null, "dispense_touchTip_checkbox": true, "dispense_touchTip_mmFromTop": null, "dispense_wellOrder_first": "b2t", diff --git a/protocol-designer/fixtures/protocol/8/newAdvancedSettingsAndMultiTemp.json b/protocol-designer/fixtures/protocol/8/newAdvancedSettingsAndMultiTemp.json index bf2f4da7476..90e2e0a5f52 100644 --- a/protocol-designer/fixtures/protocol/8/newAdvancedSettingsAndMultiTemp.json +++ b/protocol-designer/fixtures/protocol/8/newAdvancedSettingsAndMultiTemp.json @@ -63,6 +63,8 @@ "aspirate_mix_times": null, "aspirate_mix_volume": null, "aspirate_mmFromBottom": 29, + "aspirate_submerge_delay_seconds": null, + "aspirate_submerge_speed": null, "aspirate_touchTip_checkbox": false, "aspirate_touchTip_mmFromTop": null, "aspirate_wellOrder_first": "t2b", @@ -87,6 +89,8 @@ "dispense_mix_times": null, "dispense_mix_volume": null, "dispense_mmFromBottom": null, + "dispense_submerge_delay_seconds": null, + "dispense_submerge_speed": null, "dispense_touchTip_checkbox": false, "dispense_touchTip_mmFromTop": null, "dispense_wellOrder_first": "t2b", diff --git a/protocol-designer/fixtures/protocol/8/ninetySixChannelFullAndColumn.json b/protocol-designer/fixtures/protocol/8/ninetySixChannelFullAndColumn.json index d22281b0369..52a16c9b234 100644 --- a/protocol-designer/fixtures/protocol/8/ninetySixChannelFullAndColumn.json +++ b/protocol-designer/fixtures/protocol/8/ninetySixChannelFullAndColumn.json @@ -62,6 +62,8 @@ "aspirate_mix_times": null, "aspirate_mix_volume": null, "aspirate_mmFromBottom": null, + "aspirate_submerge_delay_seconds": null, + "aspirate_submerge_speed": null, "aspirate_touchTip_checkbox": false, "aspirate_touchTip_mmFromTop": null, "aspirate_wellOrder_first": "t2b", @@ -86,6 +88,8 @@ "dispense_mix_times": null, "dispense_mix_volume": null, "dispense_mmFromBottom": null, + "dispense_submerge_delay_seconds": null, + "dispense_submerge_speed": null, "dispense_touchTip_checkbox": false, "dispense_touchTip_mmFromTop": null, "dispense_wellOrder_first": "t2b", @@ -120,6 +124,8 @@ "aspirate_mix_times": null, "aspirate_mix_volume": null, "aspirate_mmFromBottom": null, + "aspirate_submerge_delay_seconds": null, + "aspirate_submerge_speed": null, "aspirate_touchTip_checkbox": false, "aspirate_touchTip_mmFromTop": null, "aspirate_wellOrder_first": "t2b", @@ -144,6 +150,8 @@ "dispense_mix_times": null, "dispense_mix_volume": null, "dispense_mmFromBottom": null, + "dispense_submerge_delay_seconds": null, + "dispense_submerge_speed": null, "dispense_touchTip_checkbox": false, "dispense_touchTip_mmFromTop": null, "dispense_wellOrder_first": "t2b", diff --git a/protocol-designer/src/assets/localization/en/application.json b/protocol-designer/src/assets/localization/en/application.json index 256a2fa60db..8a84f5af2a4 100644 --- a/protocol-designer/src/assets/localization/en/application.json +++ b/protocol-designer/src/assets/localization/en/application.json @@ -58,6 +58,7 @@ "microliter": "µL", "microliterPerSec": "µL/s", "millimeter": "mm", + "millimeterPerSec": "mm/s", "nanometer": "nm", "minutes": "m", "rpm": "rpm", diff --git a/protocol-designer/src/assets/localization/en/protocol_steps.json b/protocol-designer/src/assets/localization/en/protocol_steps.json index fe5630f4465..897502f7f03 100644 --- a/protocol-designer/src/assets/localization/en/protocol_steps.json +++ b/protocol-designer/src/assets/localization/en/protocol_steps.json @@ -107,6 +107,8 @@ "speed": "Speed", "starting_deck": "Starting deck", "step_substeps": "{{stepType}} details", + "submerge": "Submerge", + "submerge_speed": "Submerge speed", "temperature": "Temperature", "temperature_module": { "active": "{{module}}set to", diff --git a/protocol-designer/src/assets/localization/en/tooltip.json b/protocol-designer/src/assets/localization/en/tooltip.json index 67780f3fb2d..849844a0c34 100644 --- a/protocol-designer/src/assets/localization/en/tooltip.json +++ b/protocol-designer/src/assets/localization/en/tooltip.json @@ -37,6 +37,7 @@ "aspirate_mmFromBottom": "Adjust tip position for aspirate", "aspirate_touchTip_checkbox": "Touch tip to each side of the well after aspirating", "aspirate_touchTip_mmFromTop": "Distance from the top of the well", + "aspirate_submerge": "Lower the tip into the liquid before aspirating", "aspirate_wells": "First select a source labware", "blowout_checkbox": "Blow extra air through the tip", "blowout_flowRate": "Blowout speed", @@ -50,6 +51,7 @@ "dispense_labware": "Pipette unable to access labware in staging area", "dispense_mix_checkbox": "Aspirate and dispense repeatedly after main dispense", "dispense_mmFromBottom": "Adjust tip position for dispense", + "dispense_submerge": "Lower the tip into the liquid before dispensing", "dispense_touchTip_checkbox": "Touch tip to each side of the well after dispensing", "dispense_touchTip_mmFromTop": "Distance from the top of the well", "dispense_wells": "First select a destination labware", diff --git a/protocol-designer/src/form-types.ts b/protocol-designer/src/form-types.ts index 45424a89117..21b1a84556f 100644 --- a/protocol-designer/src/form-types.ts +++ b/protocol-designer/src/form-types.ts @@ -32,6 +32,8 @@ export type StepFieldName = string // | 'aspirate_mix_times' // | 'aspirate_mix_volume' // | 'aspirate_mmFromBottom' +// | 'aspirate_submerge_delay_seconds' +// | 'aspirate_submerge_speed' // | 'aspirate_touchTip_checkbox' // | 'aspirate_touchTip_mmFromTop' // | 'aspirate_wellOrder_first' @@ -51,6 +53,8 @@ export type StepFieldName = string // | 'dispense_mix_times' // | 'dispense_mix_volume' // | 'dispense_mmFromBottom' +// | 'dispense_submerge_delay_seconds' +// | 'dispense_submerge_speed' // | 'dispense_touchTip_checkbox' // | 'dispense_touchTip_mmFromTop' // | 'dispense_wellOrder_first' @@ -252,6 +256,8 @@ export interface HydratedMoveLiquidFormData extends AnnotationFields { aspirate_mix_times?: number | null aspirate_mix_volume?: number | null aspirate_mmFromBottom?: number | null + aspirate_submerge_delay_seconds?: number | null + aspirate_submerge_speed?: number | null aspirate_touchTip_mmFromTop?: number | null aspirate_wells_grouped?: boolean | null aspirate_x_position?: number | null @@ -266,6 +272,8 @@ export interface HydratedMoveLiquidFormData extends AnnotationFields { dispense_mix_times?: number | null dispense_mix_volume?: number | null dispense_mmFromBottom?: number | null + dispense_submerge_delay_seconds?: number | null + dispense_submerge_speed?: number | null dispense_touchTip_mmFromTop?: number | null dispense_x_position?: number | null dispense_y_position?: number | null diff --git a/protocol-designer/src/load-file/migration/8_5_0.ts b/protocol-designer/src/load-file/migration/8_5_0.ts index 2f6e8d38553..f3ae52323ba 100644 --- a/protocol-designer/src/load-file/migration/8_5_0.ts +++ b/protocol-designer/src/load-file/migration/8_5_0.ts @@ -110,6 +110,10 @@ export const migrateFile = ( matchingDispenseLabwareWellDepth, 1 ), + aspirate_submerge_delay_seconds: null, + dispense_submerge_delay_seconds: null, + aspirate_submerge_speed: null, + dispense_submerge_speed: null, }, } } diff --git a/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/StepTools/MoveLiquidTools/index.tsx b/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/StepTools/MoveLiquidTools/index.tsx index 700f59ff1b7..652baebd843 100644 --- a/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/StepTools/MoveLiquidTools/index.tsx +++ b/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/StepTools/MoveLiquidTools/index.tsx @@ -1,15 +1,24 @@ import { useSelector } from 'react-redux' import { useTranslation } from 'react-i18next' import { + ALIGN_CENTER, + COLORS, DIRECTION_COLUMN, Divider, Flex, + Icon, + ListItem, SPACING, StyledText, Tabs, + Tooltip, + useHoverTooltip, } from '@opentrons/components' import { getTrashOrLabware } from '@opentrons/step-generation' -import { getEnableReturnTip } from '../../../../../../feature-flags/selectors' +import { + getEnableLiquidClasses, + getEnableReturnTip, +} from '../../../../../../feature-flags/selectors' import { getAdditionalEquipmentEntities, getLabwareEntities, @@ -61,11 +70,13 @@ export function MoveLiquidTools(props: StepFormProps): JSX.Element { tab, setTab, } = props + const [targetProps, tooltipProps] = useHoverTooltip() const { t, i18n } = useTranslation(['protocol_steps', 'form', 'tooltip']) const { path } = formData const additionalEquipmentEntities = useSelector( getAdditionalEquipmentEntities ) + const enableLiquidClasses = useSelector(getEnableLiquidClasses) const enableReturnTip = useSelector(getEnableReturnTip) const labwares = useSelector(getLabwareEntities) const pipettes = useSelector(getPipetteEntities) @@ -316,6 +327,67 @@ export function MoveLiquidTools(props: StepFormProps): JSX.Element { ] } /> + {enableLiquidClasses ? ( + <> + + + + + {t('protocol_steps:submerge')} + + + + + + {t(`tooltip:step_fields.defaults.${tab}_submerge`)} + + + + + + + + + + + ) : null} { aspirate_mix_times: null, aspirate_mix_volume: null, aspirate_mmFromBottom: null, + aspirate_submerge_delay_seconds: null, + aspirate_submerge_speed: null, aspirate_touchTip_checkbox: false, aspirate_touchTip_mmFromTop: null, aspirate_wellOrder_first: 't2b', @@ -177,6 +179,8 @@ describe('createPresavedStepForm', () => { dispense_mix_times: null, dispense_mix_volume: null, dispense_mmFromBottom: null, + dispense_submerge_delay_seconds: null, + dispense_submerge_speed: null, dispense_touchTip_checkbox: false, dispense_touchTip_mmFromTop: null, dispense_wellOrder_first: 't2b', diff --git a/protocol-designer/src/steplist/formLevel/getDefaultsForStepType.ts b/protocol-designer/src/steplist/formLevel/getDefaultsForStepType.ts index 571cdf819f7..4344adc75ed 100644 --- a/protocol-designer/src/steplist/formLevel/getDefaultsForStepType.ts +++ b/protocol-designer/src/steplist/formLevel/getDefaultsForStepType.ts @@ -61,6 +61,8 @@ export function getDefaultsForStepType( aspirate_mix_times: null, aspirate_mix_volume: null, aspirate_mmFromBottom: null, + aspirate_submerge_delay_seconds: null, + aspirate_submerge_speed: null, aspirate_touchTip_checkbox: false, aspirate_touchTip_mmFromTop: null, aspirate_wellOrder_first: DEFAULT_WELL_ORDER_FIRST_OPTION, @@ -85,6 +87,8 @@ export function getDefaultsForStepType( dispense_mix_times: null, dispense_mix_volume: null, dispense_mmFromBottom: null, + dispense_submerge_delay_seconds: null, + dispense_submerge_speed: null, dispense_touchTip_checkbox: false, dispense_touchTip_mmFromTop: null, dispense_wellOrder_first: DEFAULT_WELL_ORDER_FIRST_OPTION, diff --git a/protocol-designer/src/steplist/formLevel/test/getDefaultsForStepType.test.ts b/protocol-designer/src/steplist/formLevel/test/getDefaultsForStepType.test.ts index aeb24f5e708..6601817e2c7 100644 --- a/protocol-designer/src/steplist/formLevel/test/getDefaultsForStepType.test.ts +++ b/protocol-designer/src/steplist/formLevel/test/getDefaultsForStepType.test.ts @@ -34,6 +34,8 @@ describe('getDefaultsForStepType', () => { aspirate_mix_times: null, aspirate_mix_volume: null, aspirate_mmFromBottom: null, + aspirate_submerge_delay_seconds: null, + aspirate_submerge_speed: null, aspirate_touchTip_checkbox: false, aspirate_touchTip_mmFromTop: null, @@ -46,6 +48,8 @@ describe('getDefaultsForStepType', () => { dispense_mix_times: null, dispense_mix_volume: null, dispense_mmFromBottom: null, + dispense_submerge_delay_seconds: null, + dispense_submerge_speed: null, dispense_touchTip_checkbox: false, dispense_touchTip_mmFromTop: null, diff --git a/protocol-designer/src/ui/steps/test/selectors.test.ts b/protocol-designer/src/ui/steps/test/selectors.test.ts index 1e1dd3f152b..ec34f06fdd5 100644 --- a/protocol-designer/src/ui/steps/test/selectors.test.ts +++ b/protocol-designer/src/ui/steps/test/selectors.test.ts @@ -432,18 +432,23 @@ describe('_getSavedMultiSelectFieldValues', () => { }, aspirate_x_position: { isIndeterminate: false, + value: undefined, }, aspirate_y_position: { isIndeterminate: false, + value: undefined, }, dispense_x_position: { isIndeterminate: false, + value: undefined, }, dispense_y_position: { isIndeterminate: false, + value: undefined, }, blowout_z_offset: { isIndeterminate: false, + value: undefined, }, aspirate_wells: { isIndeterminate: true, @@ -512,6 +517,14 @@ describe('_getSavedMultiSelectFieldValues', () => { value: -1, isIndeterminate: false, }, + aspirate_submerge_delay_seconds: { + isIndeterminate: false, + value: undefined, + }, + aspirate_submerge_speed: { + isIndeterminate: false, + value: undefined, + }, // dispense settings dispense_labware: { value: 'dispense_labware_id', @@ -573,6 +586,14 @@ describe('_getSavedMultiSelectFieldValues', () => { value: -1, isIndeterminate: false, }, + dispense_submerge_delay_seconds: { + isIndeterminate: false, + value: undefined, + }, + dispense_submerge_speed: { + isIndeterminate: false, + value: undefined, + }, blowout_checkbox: { value: true, isIndeterminate: false, @@ -689,6 +710,7 @@ describe('_getSavedMultiSelectFieldValues', () => { }, tipRack: { isIndeterminate: false, + value: undefined, }, blowout_flowRate: { isIndeterminate: true, @@ -710,18 +732,23 @@ describe('_getSavedMultiSelectFieldValues', () => { }, aspirate_x_position: { isIndeterminate: false, + value: undefined, }, aspirate_y_position: { isIndeterminate: false, + value: undefined, }, dispense_x_position: { isIndeterminate: false, + value: undefined, }, dispense_y_position: { isIndeterminate: false, + value: undefined, }, blowout_z_offset: { isIndeterminate: false, + value: undefined, }, preWetTip: { isIndeterminate: true, @@ -762,6 +789,14 @@ describe('_getSavedMultiSelectFieldValues', () => { isIndeterminate: false, value: -1, }, + aspirate_submerge_delay_seconds: { + isIndeterminate: false, + value: undefined, + }, + aspirate_submerge_speed: { + isIndeterminate: false, + value: undefined, + }, // dispense settings dispense_labware: { isIndeterminate: true, @@ -814,6 +849,14 @@ describe('_getSavedMultiSelectFieldValues', () => { isIndeterminate: false, value: -1, }, + dispense_submerge_delay_seconds: { + isIndeterminate: false, + value: undefined, + }, + dispense_submerge_speed: { + isIndeterminate: false, + value: undefined, + }, blowout_checkbox: { isIndeterminate: true, }, From 3bab4df85131063be1edae87aa29c921ec715e06 Mon Sep 17 00:00:00 2001 From: Jethary Alcid <66035149+jerader@users.noreply.github.com> Date: Mon, 3 Feb 2025 14:20:27 -0500 Subject: [PATCH 060/150] feat(protocol-designer): introduce LiquidEntities and update ingredients JSON key to match (#17385) closes AUTH-1382 This PR introduces `liquidEntities` to `InvariantContext` so step-generation will have access to liquids and the liquid `pythonName`. As a result, the previous selector that stored liquid info, `allIngredientNamesIds` has been deprecated. Additionally, `pythonName` is assigned during liquid creation via the `EDIT_LIQUID_GROUP` action and if a user deletes a liquid, the `deleteLiquidGroup` thunk is called which: deletes the liquid, edits all subsequent liquids with the new `liquidEntities` object. --- .../utils/generateQuickTransferArgs.ts | 1 + .../cypress/support/SetupSteps.ts | 2 +- .../protocol/8/doItAllV3MigratedToV8.json | 5 +- .../protocol/8/doItAllV4MigratedToV8.json | 5 +- .../protocol/8/doItAllV7MigratedToV8.json | 8 +-- .../fixtures/protocol/8/doItAllV8.json | 12 ++-- .../protocol/8/example_1_1_0MigratedToV8.json | 10 +-- .../8/thermocyclerOnOt2V7MigratedToV8.json | 4 +- .../src/file-data/selectors/fileCreator.ts | 33 +++++++--- .../src/file-data/selectors/utils.ts | 9 ++- .../__tests__/ingredients.test.ts | 19 +++--- .../__tests__/selectors.test.ts | 45 ------------- .../src/labware-ingred/actions/actions.ts | 58 +++++++++++----- .../src/labware-ingred/reducers/index.ts | 10 +++ .../src/labware-ingred/selectors.ts | 33 ++++------ protocol-designer/src/labware-ingred/types.ts | 29 +++----- .../src/load-file/migration/8_5_0.ts | 24 ++++++- .../migration/utils/getLoadLiquidCommands.ts | 4 +- .../AssignLiquidsModal/LiquidToolbox.tsx | 12 ++-- .../organisms/DefineLiquidsModal/index.tsx | 65 ++++++------------ .../MaterialsListModal.stories.tsx | 6 +- .../__tests__/MaterialsListModal.test.tsx | 15 +++-- .../organisms/MaterialsListModal/index.tsx | 18 ++--- .../organisms/SlotDetailsContainer/index.tsx | 10 +-- .../pages/Designer/LiquidsOverflowMenu.tsx | 66 ++++++++++--------- .../__tests__/LiquidsOverflowMenu.test.tsx | 16 +++-- .../ProtocolOverview/LiquidDefinitions.tsx | 6 +- .../ProtocolOverview/ScrubberContainer.tsx | 9 +-- .../__tests__/LiquidDefinitions.test.tsx | 17 +++-- .../src/pages/ProtocolOverview/index.tsx | 7 +- .../src/step-forms/selectors/index.ts | 20 ++++++ .../fixtureGeneration.test.ts.snap | 1 + .../getIsSafePipetteMovement.test.ts | 2 + step-generation/src/__tests__/glue.test.ts | 1 + step-generation/src/__tests__/utils.test.ts | 1 + .../src/fixtures/robotStateFixtures.ts | 1 + step-generation/src/types.ts | 14 ++++ ...onstructInvariantContextFromRunCommands.ts | 3 + 38 files changed, 319 insertions(+), 282 deletions(-) delete mode 100644 protocol-designer/src/labware-ingred/__tests__/selectors.test.ts diff --git a/app/src/organisms/ODD/QuickTransferFlow/utils/generateQuickTransferArgs.ts b/app/src/organisms/ODD/QuickTransferFlow/utils/generateQuickTransferArgs.ts index a2150fd22e8..c541a498e3e 100644 --- a/app/src/organisms/ODD/QuickTransferFlow/utils/generateQuickTransferArgs.ts +++ b/app/src/organisms/ODD/QuickTransferFlow/utils/generateQuickTransferArgs.ts @@ -220,6 +220,7 @@ function getInvariantContextAndRobotState( moduleEntities: {}, pipetteEntities, additionalEquipmentEntities, + liquidEntities: {}, config: { OT_PD_DISABLE_MODULE_RESTRICTIONS: false }, } const moduleLocations = {} diff --git a/protocol-designer/cypress/support/SetupSteps.ts b/protocol-designer/cypress/support/SetupSteps.ts index 13dfa4bb998..9d53a4fa8f6 100644 --- a/protocol-designer/cypress/support/SetupSteps.ts +++ b/protocol-designer/cypress/support/SetupSteps.ts @@ -138,7 +138,7 @@ export enum SetupLocators { MagblockImage = 'img[alt="magneticBlockType"]', HeaterShakerImage = 'img[alt="heaterShakerModuleType"]', TemperatureModuleImage = 'img[alt="temperatureModuleType"]', - LiquidNameInput = 'input[name="name"]', + LiquidNameInput = 'input[name="displayName"]', ModalShellArea = 'div[aria-label="ModalShell_ModalArea"]', SaveButton = 'button[type="submit"]', LiquidsDropdown = 'div[tabindex="0"].sc-bqWxrE', // Add new locator for the dropdown diff --git a/protocol-designer/fixtures/protocol/8/doItAllV3MigratedToV8.json b/protocol-designer/fixtures/protocol/8/doItAllV3MigratedToV8.json index 941eacee730..eb34f8a175c 100644 --- a/protocol-designer/fixtures/protocol/8/doItAllV3MigratedToV8.json +++ b/protocol-designer/fixtures/protocol/8/doItAllV3MigratedToV8.json @@ -33,9 +33,10 @@ }, "ingredients": { "0": { - "name": "Water", + "displayName": "Water", + "displayColor": "#b925ff", "description": null, - "serialize": false, + "pythonName": "liquid_1", "liquidGroupId": "0" } }, diff --git a/protocol-designer/fixtures/protocol/8/doItAllV4MigratedToV8.json b/protocol-designer/fixtures/protocol/8/doItAllV4MigratedToV8.json index 57386d3909a..b008ecabf73 100644 --- a/protocol-designer/fixtures/protocol/8/doItAllV4MigratedToV8.json +++ b/protocol-designer/fixtures/protocol/8/doItAllV4MigratedToV8.json @@ -33,9 +33,10 @@ }, "ingredients": { "0": { - "name": "Water", + "displayName": "Water", + "displayColor": "#b925ff", "description": null, - "serialize": false, + "pythonName": "liquid_1", "liquidGroupId": "0" } }, diff --git a/protocol-designer/fixtures/protocol/8/doItAllV7MigratedToV8.json b/protocol-designer/fixtures/protocol/8/doItAllV7MigratedToV8.json index 7d0746d8a29..5b51d300ff3 100644 --- a/protocol-designer/fixtures/protocol/8/doItAllV7MigratedToV8.json +++ b/protocol-designer/fixtures/protocol/8/doItAllV7MigratedToV8.json @@ -36,17 +36,17 @@ }, "ingredients": { "0": { - "name": "Water", + "displayName": "Water", "displayColor": "#b925ff", "description": null, - "serialize": false, + "pythonName": "liquid_1", "liquidGroupId": "0" }, "1": { - "name": "Samples", + "displayName": "Samples", "displayColor": "#ffd600", "description": null, - "serialize": false, + "pythonName": "liquid_2", "liquidGroupId": "1" } }, diff --git a/protocol-designer/fixtures/protocol/8/doItAllV8.json b/protocol-designer/fixtures/protocol/8/doItAllV8.json index ea1bf2b3b9a..d0323f3faf5 100644 --- a/protocol-designer/fixtures/protocol/8/doItAllV8.json +++ b/protocol-designer/fixtures/protocol/8/doItAllV8.json @@ -33,18 +33,18 @@ }, "ingredients": { "0": { - "name": "h20", + "displayName": "h20", "displayColor": "#b925ff", "description": null, - "serialize": false, - "liquidGroupId": "0" + "pythonName": "liquid_0", + "liquidGroupId": "1" }, "1": { - "name": "sample", + "displayName": "sample", "displayColor": "#ffd600", "description": null, - "serialize": false, - "liquidGroupId": "1" + "liquidGroupId": "2", + "pythonName": "liquid_1" } }, "ingredLocations": { diff --git a/protocol-designer/fixtures/protocol/8/example_1_1_0MigratedToV8.json b/protocol-designer/fixtures/protocol/8/example_1_1_0MigratedToV8.json index fc926eb59c6..5aaf3a768f6 100644 --- a/protocol-designer/fixtures/protocol/8/example_1_1_0MigratedToV8.json +++ b/protocol-designer/fixtures/protocol/8/example_1_1_0MigratedToV8.json @@ -36,15 +36,17 @@ }, "ingredients": { "0": { - "name": "samples", + "displayName": "samples", "description": null, - "serialize": false, + "displayColor": "#b925ff", + "pythonName": "liquid_1", "liquidGroupId": "0" }, "1": { - "name": "dna", + "displayName": "dna", "description": null, - "serialize": false, + "pythonName": "liquid_2", + "displayColor": "#ffd600", "liquidGroupId": "1" } }, diff --git a/protocol-designer/fixtures/protocol/8/thermocyclerOnOt2V7MigratedToV8.json b/protocol-designer/fixtures/protocol/8/thermocyclerOnOt2V7MigratedToV8.json index 09c4773fc37..8a5e9916bb7 100644 --- a/protocol-designer/fixtures/protocol/8/thermocyclerOnOt2V7MigratedToV8.json +++ b/protocol-designer/fixtures/protocol/8/thermocyclerOnOt2V7MigratedToV8.json @@ -33,10 +33,10 @@ }, "ingredients": { "0": { - "name": "123", + "displayName": "123", "displayColor": "#b925ff", "description": null, - "serialize": false, + "pythonName": "liquid_1", "liquidGroupId": "0" } }, diff --git a/protocol-designer/src/file-data/selectors/fileCreator.ts b/protocol-designer/src/file-data/selectors/fileCreator.ts index 8ae0e1b560a..d63501dbc1e 100644 --- a/protocol-designer/src/file-data/selectors/fileCreator.ts +++ b/protocol-designer/src/file-data/selectors/fileCreator.ts @@ -27,10 +27,12 @@ import { getFileMetadata, getRobotType } from './fileFields' import { getInitialRobotState, getRobotStateTimeline } from './commands' import { getLoadCommands } from './utils' +import type { SecondOrderCommandAnnotation } from '@opentrons/shared-data/commandAnnotation/types' import type { PipetteEntity, LabwareEntities, PipetteEntities, + LiquidEntities, } from '@opentrons/step-generation' import type { CommandAnnotationV1Mixin, @@ -43,10 +45,23 @@ import type { ProtocolBase, ProtocolFile, } from '@opentrons/shared-data' +import type { DismissedWarningState } from '../../dismiss/reducers' import type { LabwareDefByDefURI } from '../../labware-defs' import type { Selector } from '../../types' -import type { DesignerApplicationData } from '../../load-file/migration/utils/getLoadLiquidCommands' -import type { SecondOrderCommandAnnotation } from '@opentrons/shared-data/commandAnnotation/types' + +// DesignerApplication type for version 8_5 +export interface DesignerApplicationDataV8_5 { + ingredients: LiquidEntities + ingredLocations: { + [labwareId: string]: { + [wellName: string]: { [liquidId: string]: { volume: number } } + } + } + savedStepForms: Record + orderedStepIds: string[] + pipetteTiprackAssignments: Record + dismissedWarnings: DismissedWarningState +} // TODO: BC: 2018-02-21 uncomment this assert, causes test failures // console.assert(!isEmpty(process.env.OT_PD_VERSION), 'Could not find application version!') @@ -92,7 +107,7 @@ export const createFile: Selector = createSelector( getRobotStateTimeline, getRobotType, dismissSelectors.getAllDismissedWarnings, - ingredSelectors.getLiquidGroupsById, + stepFormSelectors.getLiquidEntities, ingredSelectors.getLiquidsByLabwareId, stepFormSelectors.getSavedStepForms, stepFormSelectors.getOrderedStepIds, @@ -108,7 +123,7 @@ export const createFile: Selector = createSelector( robotStateTimeline, robotType, dismissedWarnings, - ingredients, + liquidEntities, ingredLocations, savedStepForms, orderedStepIds, @@ -127,7 +142,7 @@ export const createFile: Selector = createSelector( moduleEntities, labwareEntities, labwareNicknamesById, - ingredients, + liquidEntities, ingredLocations ) @@ -159,7 +174,7 @@ export const createFile: Selector = createSelector( p.tiprackDefURI ), dismissedWarnings, - ingredients, + ingredients: liquidEntities, ingredLocations, savedStepForms, orderedStepIds: savedOrderedStepIds, @@ -167,12 +182,12 @@ export const createFile: Selector = createSelector( } const liquids: ProtocolFile['liquids'] = reduce( - ingredients, + liquidEntities, (acc, liquidData, liquidId) => { return { ...acc, [liquidId]: { - displayName: liquidData.name, + displayName: liquidData.displayName, description: liquidData.description ?? '', displayColor: liquidData.displayColor ?? swatchColors(liquidId), }, @@ -253,7 +268,7 @@ export const createFile: Selector = createSelector( commandAnnotations, } - const protocolBase: ProtocolBase = { + const protocolBase: ProtocolBase = { $otSharedSchema: '#/protocol/schemas/8', schemaVersion: 8, metadata: { diff --git a/protocol-designer/src/file-data/selectors/utils.ts b/protocol-designer/src/file-data/selectors/utils.ts index 57a8ba89947..8d852731fad 100644 --- a/protocol-designer/src/file-data/selectors/utils.ts +++ b/protocol-designer/src/file-data/selectors/utils.ts @@ -20,8 +20,8 @@ import type { RobotState, ModuleEntities, TimelineFrame, + LiquidEntities, } from '@opentrons/step-generation' -import type { LiquidGroupsById } from '../../labware-ingred/types' interface Pipettes { [pipetteId: string]: { name: PipetteName } @@ -33,7 +33,7 @@ export const getLoadCommands = ( moduleEntities: ModuleEntities, labwareEntities: LabwareEntities, labwareNicknamesById: Record, - ingredients: LiquidGroupsById, + liquidEntities: LiquidEntities, ingredLocations: LabwareLiquidState ): CreateCommand[] => { const pipettes: Pipettes = mapValues( @@ -161,7 +161,10 @@ export const getLoadCommands = ( [] ) - const loadLiquidCommands = getLoadLiquidCommands(ingredients, ingredLocations) + const loadLiquidCommands = getLoadLiquidCommands( + liquidEntities, + ingredLocations + ) const loadModuleCommands = map( initialRobotState.modules, diff --git a/protocol-designer/src/labware-ingred/__tests__/ingredients.test.ts b/protocol-designer/src/labware-ingred/__tests__/ingredients.test.ts index c81883001ac..c73cecda598 100644 --- a/protocol-designer/src/labware-ingred/__tests__/ingredients.test.ts +++ b/protocol-designer/src/labware-ingred/__tests__/ingredients.test.ts @@ -1,5 +1,6 @@ import { describe, it, expect, vi } from 'vitest' import { ingredients, ingredLocations } from '../reducers' +import type { LiquidEntities } from '@opentrons/step-generation' vi.mock('../../labware-defs/utils') describe('DUPLICATE_LABWARE action', () => { @@ -13,24 +14,20 @@ describe('DUPLICATE_LABWARE action', () => { }, } - const prevIngredState = { + const prevIngredState: LiquidEntities = { ingred3: { - name: 'Buffer', - wellDetailsByLocation: null, - concentration: '50 mol/ng', + displayName: 'Buffer', description: '', - liquidClass: null, displayColor: '#b925ff', - serialize: false, + liquidGroupId: '0', + pythonName: 'liquid_1', }, ingred4: { - name: 'Other Ingred', - wellDetailsByLocation: null, - concentration: '100%', + displayName: 'Other Ingred', description: '', - liquidClass: null, displayColor: '#ffd600', - serialize: false, + liquidGroupId: '1', + pythonName: 'liquid_2', }, } diff --git a/protocol-designer/src/labware-ingred/__tests__/selectors.test.ts b/protocol-designer/src/labware-ingred/__tests__/selectors.test.ts deleted file mode 100644 index 362c06abec4..00000000000 --- a/protocol-designer/src/labware-ingred/__tests__/selectors.test.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { describe, it, expect } from 'vitest' -import { selectors } from '../selectors' -// FIXTURES -const baseIngredFields = { - groupId: '0', - name: 'Some Ingred', - description: null, - serialize: false, -} -const allIngredientsXXSingleIngred = { - '0': { ...baseIngredFields }, -} -// ============================== -describe('allIngredientNamesIds selector', () => { - it('selects names & ids from allIngredients selector result', () => { - expect( - // @ts-expect-error(sa, 2021-6-20): resultFunc not part of Selector type - selectors.allIngredientNamesIds.resultFunc( - // flow def for resultFunc is wrong and/or resultFun isn't typeable - allIngredientsXXSingleIngred as any - ) - ).toEqual([ - { - ingredientId: '0', - name: 'Some Ingred', - }, - ]) - }) -}) -describe('allIngredientGroupFields', () => { - it('no ingreds - return empty obj', () => { - // @ts-expect-error(sa, 2021-6-20): resultFunc not part of Selector type - expect(selectors.allIngredientGroupFields.resultFunc({} as any)).toEqual({}) - }) - it('select fields from all ingred groups', () => { - expect( - // @ts-expect-error(sa, 2021-6-20): resultFunc not part of Selector type - selectors.allIngredientGroupFields.resultFunc( - allIngredientsXXSingleIngred as any - ) - ).toEqual({ - '0': { ...baseIngredFields }, - }) - }) -}) diff --git a/protocol-designer/src/labware-ingred/actions/actions.ts b/protocol-designer/src/labware-ingred/actions/actions.ts index 2064751568b..ea6e606415a 100644 --- a/protocol-designer/src/labware-ingred/actions/actions.ts +++ b/protocol-designer/src/labware-ingred/actions/actions.ts @@ -1,4 +1,5 @@ import { createAction } from 'redux-actions' +import { getLiquidEntities } from '../../step-forms/selectors' import { selectors } from '../selectors' import type { StepFieldName } from '../../form-types' import type { DeckSlot, ThunkAction } from '../../types' @@ -124,33 +125,60 @@ export const removeWellsContents: ( type: 'REMOVE_WELLS_CONTENTS', payload, }) + +export interface EditMultipleLiquidGroupsAction { + type: 'EDIT_MULTIPLE_LIQUID_GROUPS_PYTHON_NAME' + payload: Record // Updated liquid group pythonName +} + export interface DeleteLiquidGroupAction { type: 'DELETE_LIQUID_GROUP' payload: string // liquid group id } export const deleteLiquidGroup: ( liquidGroupId: string -) => ThunkAction = liquidGroupId => ( - dispatch, - getState -) => { - const allLiquidGroupsOnDeck = selectors.getLiquidGroupsOnDeck(getState()) - const liquidIsOnDeck = allLiquidGroupsOnDeck.includes(liquidGroupId) - // TODO: Ian 2018-10-22 we will eventually want to replace - // this window.confirm with a modal +) => ThunkAction< + DeleteLiquidGroupAction | EditMultipleLiquidGroupsAction +> = liquidGroupId => (dispatch, getState) => { + const allLiquidGroups = selectors.getLiquidGroupsOnDeck(getState()) + const liquidEntities = getLiquidEntities(getState()) + const liquidIsOnDeck = allLiquidGroups.includes(liquidGroupId) + + if (!Object.keys(allLiquidGroups).includes(liquidGroupId)) { + return + } + const okToDelete = liquidIsOnDeck ? global.confirm( 'This liquid has been placed on the deck, are you sure you want to delete it?' ) : true - if (okToDelete) { - return dispatch({ - type: 'DELETE_LIQUID_GROUP', - payload: liquidGroupId, - }) + if (!okToDelete) { + return } + + // filter out the deleted group and create an updated liquid entities object + const { [liquidGroupId]: _, ...remainingLiquidEntities } = liquidEntities + + const updatedLiquidGroupPythonName = Object.keys(remainingLiquidEntities) + .sort() // sort to ensure correct order + .reduce>((acc, oldId, index) => { + acc[oldId] = { + ...remainingLiquidEntities[oldId], + pythonName: `liquid_${index + 1}`, + } + return acc + }, {}) + + // delete user selected group, then update pythonName for rest of liquids + dispatch({ type: 'DELETE_LIQUID_GROUP', payload: liquidGroupId }) + dispatch({ + type: 'EDIT_MULTIPLE_LIQUID_GROUPS_PYTHON_NAME', + payload: updatedLiquidGroupPythonName, + }) } + // NOTE: assumes you want to set a uniform volume of the same liquid in one labware export interface SetWellContentsPayload { liquidGroupId: string @@ -203,9 +231,7 @@ export interface EditLiquidGroupAction { } // NOTE: with no ID, a new one is assigned export const editLiquidGroup: ( - args: IngredInputs & { - liquidGroupId: string | null | undefined - } + args: IngredInputs ) => ThunkAction = args => (dispatch, getState) => { const { liquidGroupId, ...payloadArgs } = args // NOTE: separate liquidGroupId for flow to understand unpacking :/ diff --git a/protocol-designer/src/labware-ingred/reducers/index.ts b/protocol-designer/src/labware-ingred/reducers/index.ts index 47cf1884284..ad7db0864da 100644 --- a/protocol-designer/src/labware-ingred/reducers/index.ts +++ b/protocol-designer/src/labware-ingred/reducers/index.ts @@ -40,6 +40,7 @@ import type { SelectFixtureAction, ZoomedIntoSlotAction, GenerateNewProtocolAction, + EditMultipleLiquidGroupsAction, } from '../actions' // REDUCERS // modeLabwareSelection: boolean. If true, we're selecting labware to add to a slot @@ -293,6 +294,15 @@ export const ingredients: Reducer = handleActions( const liquidGroupId = action.payload return omit(state, liquidGroupId) }, + EDIT_MULTIPLE_LIQUID_GROUPS_PYTHON_NAME: ( + state: IngredientsState, + action: EditMultipleLiquidGroupsAction + ): IngredientsState => { + return { + ...state, + ...action.payload, + } + }, LOAD_FILE: ( state: IngredientsState, action: LoadFileAction diff --git a/protocol-designer/src/labware-ingred/selectors.ts b/protocol-designer/src/labware-ingred/selectors.ts index 80325e33b96..a9c674a293b 100644 --- a/protocol-designer/src/labware-ingred/selectors.ts +++ b/protocol-designer/src/labware-ingred/selectors.ts @@ -5,7 +5,10 @@ import max from 'lodash/max' import reduce from 'lodash/reduce' import type { Selector } from 'reselect' import type { DropdownOption } from '@opentrons/components' -import type { LabwareLiquidState } from '@opentrons/step-generation' +import type { + LabwareLiquidState, + LiquidEntity, +} from '@opentrons/step-generation' import type { CutoutId } from '@opentrons/shared-data' import type { RootState, @@ -18,18 +21,16 @@ import type { import type { AllIngredGroupFields, IngredInputs, - LiquidGroup, - OrderedLiquids, ZoomedIntoSlotInfoState, } from './types' import type { BaseState, DeckSlot } from './../types' + // TODO: Ian 2019-02-15 no RootSlice, use BaseState interface RootSlice { labwareIngred: RootState } const rootSelector = (state: RootSlice): RootState => state.labwareIngred - // NOTE: not intended for UI use! Use getLabwareNicknamesById for the string. const getLabwareNameInfo: Selector = createSelector( rootSelector, @@ -54,10 +55,10 @@ const getLiquidNamesById: Selector< > = createSelector( getLiquidGroupsById, ingredGroups => - mapValues(ingredGroups, (ingred: LiquidGroup) => ingred.name) as Record< - string, - string - > + mapValues( + ingredGroups, + (ingred: LiquidEntity) => ingred.displayName + ) as Record ) const getLiquidSelectionOptions: Selector< RootSlice, @@ -66,7 +67,7 @@ const getLiquidSelectionOptions: Selector< return Object.keys(liquidGroupsById).map(id => ({ // NOTE: if these fallbacks are used, it's a bug name: liquidGroupsById[id] - ? liquidGroupsById[id].name || `(Unnamed Liquid: ${String(id)})` + ? liquidGroupsById[id].displayName || `(Unnamed Liquid: ${String(id)})` : 'Missing Liquid', value: id, })) @@ -105,17 +106,7 @@ const allIngredientGroupFields: Selector< {} ) ) -const allIngredientNamesIds: Selector< - RootSlice, - OrderedLiquids -> = createSelector(getLiquidGroupsById, ingreds => { - return Object.keys(ingreds).map(ingredId => ({ - ingredientId: ingredId, - name: ingreds[ingredId].name, - displayColor: ingreds[ingredId].displayColor, - liquidClass: ingreds[ingredId].liquidClass, - })) -}) + const getLabwareSelectionMode: Selector = createSelector( rootSelector, rootState => { @@ -182,7 +173,6 @@ const getIsNewProtocol: Selector = createSelector( // TODO: prune selectors export const selectors = { rootSelector, - getLiquidGroupsById, getLiquidsByLabwareId, getLiquidNamesById, getLabwareSelectionMode, @@ -195,7 +185,6 @@ export const selectors = { getSelectedLiquidGroupState, getDrillDownLabwareId, allIngredientGroupFields, - allIngredientNamesIds, selectedAddLabwareSlot, getDeckHasLiquid, getLiquidDisplayColors, diff --git a/protocol-designer/src/labware-ingred/types.ts b/protocol-designer/src/labware-ingred/types.ts index 6b7628735d8..aaa86cf4b2f 100644 --- a/protocol-designer/src/labware-ingred/types.ts +++ b/protocol-designer/src/labware-ingred/types.ts @@ -1,5 +1,9 @@ import type { CutoutId, ModuleModel } from '@opentrons/shared-data' -import type { DeckSlot, LocationLiquidState } from '@opentrons/step-generation' +import type { + DeckSlot, + LiquidEntity, + LocationLiquidState, +} from '@opentrons/step-generation' // TODO Ian 2018-02-19 make these shared in component library, standardize with Run App // ===== LABWARE =========== export interface DisplayLabware { @@ -21,27 +25,10 @@ export interface WellContents { } export type ContentsByWell = Record | null export type WellContentsByLabware = Record -// ==== INGREDIENTS ==== -// TODO(ND: 12/17/2024): add migration for liquids in >8.3.0 -export type OrderedLiquids = Array<{ - ingredientId: string - name?: string | null - displayColor?: string | null - liquidClass?: string | null -}> -// TODO: Ian 2018-10-15 audit & rename these confusing types -export interface LiquidGroup { - name: string | null - description: string | null - displayColor: string - liquidClass: string | null - serialize: boolean +export type IngredInputs = LiquidEntity & { + volume?: number | null } -export type IngredInputs = LiquidGroup & { - volume?: number | null | undefined -} -export type IngredGroupAccessor = keyof IngredInputs -export type LiquidGroupsById = Record +export type LiquidGroupsById = Record export type AllIngredGroupFields = Record export type Fixture = diff --git a/protocol-designer/src/load-file/migration/8_5_0.ts b/protocol-designer/src/load-file/migration/8_5_0.ts index f3ae52323ba..55cd6e0baeb 100644 --- a/protocol-designer/src/load-file/migration/8_5_0.ts +++ b/protocol-designer/src/load-file/migration/8_5_0.ts @@ -1,9 +1,12 @@ import floor from 'lodash/floor' +import { swatchColors } from '../../organisms/DefineLiquidsModal/swatchColors' import type { LabwareDefinition2, LoadLabwareCreateCommand, ProtocolFile, } from '@opentrons/shared-data' +import type { LiquidEntities } from '@opentrons/step-generation' +import type { DesignerApplicationDataV8_5 } from '../../file-data/selectors' import type { DesignerApplicationData } from './utils/getLoadLiquidCommands' const getMigratedPositionFromTop = ( @@ -48,8 +51,8 @@ const getMigratedPositionFromTop = ( export const migrateFile = ( appData: ProtocolFile -): ProtocolFile => { - const { designerApplication, commands, labwareDefinitions } = appData +): ProtocolFile => { + const { designerApplication, commands, labwareDefinitions, liquids } = appData if (designerApplication == null || designerApplication?.data == null) { throw Error('The designerApplication key in your file is corrupt.') @@ -57,6 +60,22 @@ export const migrateFile = ( const savedStepForms = designerApplication.data ?.savedStepForms as DesignerApplicationData['savedStepForms'] + const ingredients = designerApplication.data.ingredients + + const migratedIngredients: LiquidEntities = Object.entries( + ingredients + ).reduce((acc, [id, ingredient]) => { + acc[id] = { + displayName: ingredient.name ?? '', + liquidClass: ingredient.liquidClass, + description: ingredient.description ?? null, + liquidGroupId: id, + pythonName: `liquid_${parseInt(id) + 1}`, + displayColor: liquids[id].displayColor ?? swatchColors(id), + } + return acc + }, {}) + const loadLabwareCommands = commands.filter( (command): command is LoadLabwareCreateCommand => command.commandType === 'loadLabware' @@ -157,6 +176,7 @@ export const migrateFile = ( ...designerApplication, data: { ...designerApplication.data, + ingredients: migratedIngredients, savedStepForms: { ...designerApplication.data.savedStepForms, ...savedStepsWithUpdatedMoveLiquidFields, diff --git a/protocol-designer/src/load-file/migration/utils/getLoadLiquidCommands.ts b/protocol-designer/src/load-file/migration/utils/getLoadLiquidCommands.ts index 2be01b2e4b9..797f329bc86 100644 --- a/protocol-designer/src/load-file/migration/utils/getLoadLiquidCommands.ts +++ b/protocol-designer/src/load-file/migration/utils/getLoadLiquidCommands.ts @@ -2,6 +2,7 @@ import reduce from 'lodash/reduce' import { uuid } from '../../../utils' import type { LoadLiquidCreateCommand } from '@opentrons/shared-data/protocol/types/schemaV6/command/setup' import type { DismissedWarningState } from '../../../dismiss/reducers' +import type { LiquidEntities } from '@opentrons/step-generation' export interface DesignerApplicationData { ingredients: Record< @@ -9,6 +10,7 @@ export interface DesignerApplicationData { { name?: string | null description?: string | null + liquidClass?: string serialize: boolean } > @@ -24,7 +26,7 @@ export interface DesignerApplicationData { } export const getLoadLiquidCommands = ( - ingredients?: DesignerApplicationData['ingredients'], + ingredients?: DesignerApplicationData['ingredients'] | LiquidEntities, ingredLocations?: DesignerApplicationData['ingredLocations'] ): LoadLiquidCreateCommand[] => { let loadLiquidCommands: LoadLiquidCreateCommand[] = [] diff --git a/protocol-designer/src/organisms/AssignLiquidsModal/LiquidToolbox.tsx b/protocol-designer/src/organisms/AssignLiquidsModal/LiquidToolbox.tsx index 1606e7a25da..9c2fad99edc 100644 --- a/protocol-designer/src/organisms/AssignLiquidsModal/LiquidToolbox.tsx +++ b/protocol-designer/src/organisms/AssignLiquidsModal/LiquidToolbox.tsx @@ -19,6 +19,7 @@ import { Toolbox, TYPOGRAPHY, } from '@opentrons/components' +import { getLiquidEntities } from '../../step-forms/selectors' import { LINK_BUTTON_STYLE } from '../../atoms' import { selectors as labwareIngredSelectors } from '../../labware-ingred/selectors' import * as wellContentsSelectors from '../../top-selectors/well-contents' @@ -64,7 +65,7 @@ export function LiquidToolbox(props: LiquidToolboxProps): JSX.Element { const dispatch = useDispatch() const [showDefineLiquidModal, setDefineLiquidModal] = useState(false) const [showBadFormState, setShowBadFormState] = useState(false) - const liquids = useSelector(labwareIngredSelectors.allIngredientNamesIds) + const liquids = useSelector(getLiquidEntities) const labwareId = useSelector(labwareIngredSelectors.getSelectedLabwareId) const selectedWellGroups = useSelector(getSelectedWells) const nickNames = useSelector(getLabwareNicknamesById) @@ -236,11 +237,11 @@ export function LiquidToolbox(props: LiquidToolboxProps): JSX.Element { const liquidInfo: LiquidInfo[] = uniqueLiquids .map(liquid => { const foundLiquid = Object.values(liquids).find( - id => id.ingredientId === liquid + id => id.liquidGroupId === liquid ) return { liquidIndex: liquid, - name: foundLiquid?.name ?? '', + name: foundLiquid?.displayName ?? '', color: foundLiquid?.displayColor ?? '', liquidClassDisplayName: getLiquidClassDisplayName( foundLiquid?.liquidClass ?? null @@ -347,8 +348,9 @@ export function LiquidToolbox(props: LiquidToolboxProps): JSX.Element { render={({ field }) => { const fullOptions: DropdownOption[] = liquidSelectionOptions.map( option => { - const liquid = liquids.find( - liquid => liquid.ingredientId === option.value + const liquid = Object.values(liquids).find( + liquid => + liquid.liquidGroupId === option.value ) return { diff --git a/protocol-designer/src/organisms/DefineLiquidsModal/index.tsx b/protocol-designer/src/organisms/DefineLiquidsModal/index.tsx index 33f98e7c412..d925560cbf1 100644 --- a/protocol-designer/src/organisms/DefineLiquidsModal/index.tsx +++ b/protocol-designer/src/organisms/DefineLiquidsModal/index.tsx @@ -40,23 +40,13 @@ import { swatchColors } from './swatchColors' import type { ColorResult, RGBColor } from 'react-color' import type { ThunkDispatch } from 'redux-thunk' import type { BaseState } from '../../types' -import type { LiquidGroup } from '../../labware-ingred/types' - -interface LiquidEditFormValues { - name: string - displayColor: string - description: string - liquidClass: string - serialize: boolean - [key: string]: unknown -} +import type { LiquidEntity } from '@opentrons/step-generation' const liquidEditFormSchema: any = Yup.object().shape({ - name: Yup.string().required('liquid name is required'), + displayName: Yup.string().required('liquid name is required'), displayColor: Yup.string(), description: Yup.string(), liquidClass: Yup.string(), - serialize: Yup.boolean(), }) interface DefineLiquidsModalProps { @@ -100,11 +90,10 @@ export function DefineLiquidsModal( onClose() } - const saveForm = (formData: LiquidGroup): void => { + const saveForm = (formData: LiquidEntity): void => { dispatch( labwareIngredActions.editLiquidGroup({ ...formData, - liquidGroupId, }) ) onClose() @@ -114,12 +103,13 @@ export function DefineLiquidsModal( liquidGroupId != null ? allIngredientGroupFields[liquidGroupId] : null const liquidId = selectedLiquid.liquidGroupId ?? nextGroupId - const initialValues: LiquidEditFormValues = { - name: selectedIngredFields?.name ?? '', + const initialValues: LiquidEntity = { + displayName: selectedIngredFields?.displayName ?? '', displayColor: selectedIngredFields?.displayColor ?? swatchColors(liquidId), liquidClass: selectedIngredFields?.liquidClass ?? '', description: selectedIngredFields?.description ?? '', - serialize: selectedIngredFields?.serialize ?? false, + pythonName: `liquid_${parseInt(liquidGroupId ?? nextGroupId) + 1}`, + liquidGroupId: liquidGroupId ?? nextGroupId, } const { @@ -129,23 +119,25 @@ export function DefineLiquidsModal( watch, setValue, register, - } = useForm({ + } = useForm({ defaultValues: initialValues, // eslint-disable-next-line @typescript-eslint/no-unsafe-argument resolver: yupResolver(liquidEditFormSchema), }) - const name = watch('name') + const name = watch('displayName') const color = watch('displayColor') const liquidClass = watch('liquidClass') const { errors, touchedFields } = formState - const handleLiquidEdits = (values: LiquidEditFormValues): void => { + const handleLiquidEdits = (values: LiquidEntity): void => { saveForm({ - name: values.name, + displayName: values.displayName, displayColor: values.displayColor, - liquidClass: values.liquidClass !== '' ? values.liquidClass : null, + liquidClass: + values.liquidClass !== '' ? values.liquidClass ?? undefined : undefined, description: values.description !== '' ? values.description : null, - serialize: values.serialize ?? false, + pythonName: values.pythonName, + liquidGroupId: values.liquidGroupId, }) } @@ -183,7 +175,7 @@ export function DefineLiquidsModal( desktopStyle="bodyLargeSemiBold" css={LINE_CLAMP_TEXT_STYLE(1)} > - {initialValues.name} + {initialValues.displayName} ) : ( @@ -240,13 +232,13 @@ export function DefineLiquidsModal( (
- {/* NOTE: this is for serialization if we decide to add it back */} - {/* ( - ) => { - field.onChange(e) - }} - /> - )} - /> */} = { title: 'Protocol-Designer/Organisms/MaterialsListModal', @@ -80,6 +80,6 @@ export const EmptyMaterialsListModal: Story = { hardware: [], fixtures: [], labware: [], - liquids: [], + liquids: {}, }, } diff --git a/protocol-designer/src/organisms/MaterialsListModal/__tests__/MaterialsListModal.test.tsx b/protocol-designer/src/organisms/MaterialsListModal/__tests__/MaterialsListModal.test.tsx index 7ed8ecc9e33..842227c85a7 100644 --- a/protocol-designer/src/organisms/MaterialsListModal/__tests__/MaterialsListModal.test.tsx +++ b/protocol-designer/src/organisms/MaterialsListModal/__tests__/MaterialsListModal.test.tsx @@ -77,7 +77,7 @@ describe('MaterialsListModal', () => { hardware: [], fixtures: [], labware: [], - liquids: [], + liquids: {}, setShowMaterialsListModal: mockSetShowMaterialsListModal, } vi.mocked(getInitialDeckSetup).mockReturnValue({ @@ -157,14 +157,15 @@ describe('MaterialsListModal', () => { props = { ...props, - liquids: [ - { - ingredientId: mockId, - name: 'mockName', + liquids: { + [mockId]: { + liquidGroupId: mockId, + displayName: 'mockName', displayColor: 'mockDisplayColor', - liquidClass: null, + description: null, + pythonName: 'mockPythonName', }, - ], + }, } render(props) screen.getByText('Liquids') diff --git a/protocol-designer/src/organisms/MaterialsListModal/index.tsx b/protocol-designer/src/organisms/MaterialsListModal/index.tsx index dba76105ecc..dd2bac3d4cd 100644 --- a/protocol-designer/src/organisms/MaterialsListModal/index.tsx +++ b/protocol-designer/src/organisms/MaterialsListModal/index.tsx @@ -33,9 +33,11 @@ import { HandleEnter } from '../../atoms/HandleEnter' import { LINE_CLAMP_TEXT_STYLE } from '../../atoms' import { getMainPagePortalEl } from '../Portal' -import type { AdditionalEquipmentName } from '@opentrons/step-generation' +import type { + AdditionalEquipmentName, + LiquidEntities, +} from '@opentrons/step-generation' import type { LabwareOnDeck, ModuleOnDeck } from '../../step-forms' -import type { OrderedLiquids } from '../../labware-ingred/types' // ToDo (kk:09/04/2024) this should be removed when break-point is set up const MODAL_MIN_WIDTH = '37.125rem' @@ -50,7 +52,7 @@ interface MaterialsListModalProps { hardware: ModuleOnDeck[] fixtures: FixtureInList[] labware: LabwareOnDeck[] - liquids: OrderedLiquids + liquids: LiquidEntities setShowMaterialsListModal: (showMaterialsListModal: boolean) => void } @@ -220,7 +222,7 @@ export function MaterialsListModal({ {t('liquids')} - {liquids.length > 0 ? ( + {Object.values(liquids).length > 0 ? ( ) : null} - {liquids.length > 0 ? ( - liquids.map((liquid, id) => { + {Object.values(liquids).length > 0 ? ( + Object.values(liquids).map((liquid, id) => { const volumePerWell = Object.values( allLabwareWellContents ).flatMap(labwareWithIngred => Object.values(labwareWithIngred).map( - ingred => ingred[liquid.ingredientId]?.volume ?? 0 + ingred => ingred[liquid.liquidGroupId]?.volume ?? 0 ) ) const totalVolume = sum(volumePerWell) @@ -273,7 +275,7 @@ export function MaterialsListModal({ desktopStyle="bodyDefaultRegular" css={LINE_CLAMP_TEXT_STYLE(3)} > - {liquid.name ?? t('n/a')} + {liquid.displayName ?? t('n/a')} } diff --git a/protocol-designer/src/organisms/SlotDetailsContainer/index.tsx b/protocol-designer/src/organisms/SlotDetailsContainer/index.tsx index 4a8403bdf90..2756f67fadd 100644 --- a/protocol-designer/src/organisms/SlotDetailsContainer/index.tsx +++ b/protocol-designer/src/organisms/SlotDetailsContainer/index.tsx @@ -2,7 +2,7 @@ import { useSelector } from 'react-redux' import { useTranslation } from 'react-i18next' import { getModuleDisplayName } from '@opentrons/shared-data' import * as wellContentsSelectors from '../../top-selectors/well-contents' -import { selectors } from '../../labware-ingred/selectors' +import { getLiquidEntities } from '../../step-forms/selectors' import { selectors as uiLabwareSelectors } from '../../ui/labware' import { getDeckSetupForActiveItem } from '../../top-selectors/labware-locations' import { SlotInformation } from '../../organisms/SlotInformation' @@ -26,7 +26,7 @@ export function SlotDetailsContainer( wellContentsSelectors.getAllWellContentsForActiveItem ) const nickNames = useSelector(uiLabwareSelectors.getLabwareNicknamesById) - const allIngredNamesIds = useSelector(selectors.allIngredientNamesIds) + const liquidEntities = useSelector(getLiquidEntities) if (slot == null || (slot === 'offDeck' && offDeckLabwareId == null)) { return null @@ -78,10 +78,10 @@ export function SlotDetailsContainer( const liquidNamesOnLabware = uniqueLiquids .map(liquid => { - const foundLiquid = Object.values(allIngredNamesIds).find( - id => id.ingredientId === liquid + const foundLiquid = Object.values(liquidEntities).find( + id => id.liquidGroupId === liquid ) - return foundLiquid?.name ?? '' + return foundLiquid?.displayName ?? '' }) .filter(Boolean) diff --git a/protocol-designer/src/pages/Designer/LiquidsOverflowMenu.tsx b/protocol-designer/src/pages/Designer/LiquidsOverflowMenu.tsx index 38b5867b2cc..07a6fbdbc89 100644 --- a/protocol-designer/src/pages/Designer/LiquidsOverflowMenu.tsx +++ b/protocol-designer/src/pages/Designer/LiquidsOverflowMenu.tsx @@ -20,7 +20,7 @@ import { TYPOGRAPHY, } from '@opentrons/components' import { LINE_CLAMP_TEXT_STYLE } from '../../atoms' -import { selectors as labwareIngredSelectors } from '../../labware-ingred/selectors' +import { getLiquidEntities } from '../../step-forms/selectors' import * as labwareIngredActions from '../../labware-ingred/actions' import type { MouseEvent, RefObject } from 'react' @@ -40,7 +40,7 @@ export function LiquidsOverflowMenu( const { onClose, showLiquidsModal, overflowWrapperRef } = props const location = useLocation() const { t } = useTranslation(['starting_deck_state']) - const liquids = useSelector(labwareIngredSelectors.allIngredientNamesIds) + const liquids = useSelector(getLiquidEntities) const dispatch: ThunkDispatch = useDispatch() return ( @@ -62,36 +62,38 @@ export function LiquidsOverflowMenu( maxHeight="18.75rem" overflowY={OVERFLOW_AUTO} > - {liquids.map(({ name, displayColor, ingredientId }) => { - return ( - { - onClose() - showLiquidsModal() - dispatch(labwareIngredActions.selectLiquidGroup(ingredientId)) - }} - key={ingredientId} - css={css` - cursor: ${CURSOR_POINTER}; - `} - > - - - - {name} - - - - ) - })} - {liquids.length > 0 ? ( + {Object.values(liquids).map( + ({ displayName, displayColor, liquidGroupId }) => { + return ( + { + onClose() + showLiquidsModal() + dispatch(labwareIngredActions.selectLiquidGroup(liquidGroupId)) + }} + key={liquidGroupId} + css={css` + cursor: ${CURSOR_POINTER}; + `} + > + + + + {displayName} + + + + ) + } + )} + {Object.values(liquids).length > 0 ? ( ) : null} { @@ -37,14 +38,15 @@ describe('SlotOverflowMenu', () => { showLiquidsModal: vi.fn(), overflowWrapperRef: createRef(), } - vi.mocked(labwareIngredSelectors.allIngredientNamesIds).mockReturnValue([ - { + vi.mocked(getLiquidEntities).mockReturnValue({ + '0': { displayColor: 'mockColor', - name: 'mockname', - ingredientId: '0', - liquidClass: null, + displayName: 'mockname', + liquidGroupId: '0', + description: null, + pythonName: 'liquid_1', }, - ]) + }) }) it('renders the overflow buttons with 1 liquid defined', () => { render(props) diff --git a/protocol-designer/src/pages/ProtocolOverview/LiquidDefinitions.tsx b/protocol-designer/src/pages/ProtocolOverview/LiquidDefinitions.tsx index b55b615eb11..b2b1483e26c 100644 --- a/protocol-designer/src/pages/ProtocolOverview/LiquidDefinitions.tsx +++ b/protocol-designer/src/pages/ProtocolOverview/LiquidDefinitions.tsx @@ -26,7 +26,7 @@ const getLiquidDescription = ( enableLiquidClasses: boolean ): JSX.Element | null => { const { description, liquidClass } = liquid - const liquidClassDisplayName = getLiquidClassDisplayName(liquidClass) + const liquidClassDisplayName = getLiquidClassDisplayName(liquidClass ?? null) const liquidClassInfo = !enableLiquidClasses || liquidClassDisplayName == null ? null : ( @@ -68,7 +68,7 @@ export function LiquidDefinitions({ return ( - {liquid.name} + {liquid.displayName} } diff --git a/protocol-designer/src/pages/ProtocolOverview/ScrubberContainer.tsx b/protocol-designer/src/pages/ProtocolOverview/ScrubberContainer.tsx index 52151876a61..fe09f7338f1 100644 --- a/protocol-designer/src/pages/ProtocolOverview/ScrubberContainer.tsx +++ b/protocol-designer/src/pages/ProtocolOverview/ScrubberContainer.tsx @@ -11,6 +11,7 @@ import { uuid } from '../../utils' import { getInitialDeckSetup, getInvariantContext, + getLiquidEntities, } from '../../step-forms/selectors' import { getLabwareNicknamesById } from '../../ui/labware/selectors' import { selectors as ingredSelectors } from '../../labware-ingred/selectors' @@ -32,7 +33,7 @@ export function ScrubberContainer(): JSX.Element | null { const labwareNickNames = useSelector(getLabwareNicknamesById) const robotStateTimeline = useSelector(getRobotStateTimeline) const initialRobotState = useSelector(getInitialRobotState) - const ingredients = useSelector(ingredSelectors.getLiquidGroupsById) + const liquidEntities = useSelector(getLiquidEntities) const ingredientLocations = useSelector(ingredSelectors.getLiquidsByLabwareId) const invariantContext = useSelector(getInvariantContext) const initialDeckSetup = useSelector(getInitialDeckSetup) @@ -55,7 +56,7 @@ export function ScrubberContainer(): JSX.Element | null { moduleEntities, labwareEntities, labwareNickNames, - ingredients, + liquidEntities, ingredientLocations ) const nonLoadCommands = flatMap( @@ -147,10 +148,10 @@ export function ScrubberContainer(): JSX.Element | null { } }) - const liquids: Liquid[] = Object.entries(ingredients).map( + const liquids: Liquid[] = Object.entries(liquidEntities).map( ([liquidId, liquidData]) => ({ id: liquidId, - displayName: liquidData.name ?? 'undefined liquid name', + displayName: liquidData.displayName ?? 'undefined liquid name', description: liquidData.description ?? '', displayColor: liquidData.displayColor, }) diff --git a/protocol-designer/src/pages/ProtocolOverview/__tests__/LiquidDefinitions.test.tsx b/protocol-designer/src/pages/ProtocolOverview/__tests__/LiquidDefinitions.test.tsx index ff4af37fa4a..29caff1d1c9 100644 --- a/protocol-designer/src/pages/ProtocolOverview/__tests__/LiquidDefinitions.test.tsx +++ b/protocol-designer/src/pages/ProtocolOverview/__tests__/LiquidDefinitions.test.tsx @@ -6,6 +6,7 @@ import { i18n } from '../../../assets/localization' import { LiquidDefinitions } from '../LiquidDefinitions' import type { ComponentProps } from 'react' +import type { LiquidEntities } from '@opentrons/step-generation' import type { InfoScreen } from '@opentrons/components' vi.mock('../../../feature-flags/selectors') @@ -18,30 +19,28 @@ vi.mock('@opentrons/components', async importOriginal => { } }) -const mockAllIngredientGroupFields = { +const mockAllIngredientGroupFields: LiquidEntities = { '0': { - name: 'EtOH', + displayName: 'EtOH', displayColor: '#b925ff', description: 'Immer fisch Hergestllter EtOH', - liquidClass: null, - serialize: false, liquidGroupId: '0', + pythonName: 'liquid_1', }, '1': { - name: '10mM Tris pH8,5', + displayName: '10mM Tris pH8,5', displayColor: '#ffd600', description: null, - liquidClass: null, - serialize: false, liquidGroupId: '1', + pythonName: 'liquid_2', }, '2': { - name: 'Amplicon PCR sample + AMPure XP beads', + displayName: 'Amplicon PCR sample + AMPure XP beads', displayColor: '#9dffd8', description: '25µl Amplicon PCR + 20 µl AMPure XP beads', liquidClass: 'Water', - serialize: false, liquidGroupId: '2', + pythonName: 'liquid_3', }, } diff --git a/protocol-designer/src/pages/ProtocolOverview/index.tsx b/protocol-designer/src/pages/ProtocolOverview/index.tsx index 01ffd365e60..bfd2b2c5f80 100644 --- a/protocol-designer/src/pages/ProtocolOverview/index.tsx +++ b/protocol-designer/src/pages/ProtocolOverview/index.tsx @@ -24,6 +24,7 @@ import { OT2_ROBOT_TYPE } from '@opentrons/shared-data' import { getAdditionalEquipmentEntities, getInitialDeckSetup, + getLiquidEntities, } from '../../step-forms/selectors' import { selectors as fileSelectors } from '../../file-data' import { selectors as stepFormSelectors } from '../../step-forms' @@ -105,9 +106,7 @@ export function ProtocolOverview(): JSX.Element { const fileData = useSelector(fileSelectors.createFile) const savedStepForms = useSelector(stepFormSelectors.getSavedStepForms) const additionalEquipment = useSelector(getAdditionalEquipmentEntities) - const liquidsOnDeck = useSelector( - labwareIngredSelectors.allIngredientNamesIds - ) + const liquids = useSelector(getLiquidEntities) useEffect(() => { if (formValues?.created == null) { @@ -245,7 +244,7 @@ export function ProtocolOverview(): JSX.Element { : [] } labware={Object.values(labwaresOnDeck)} - liquids={liquidsOnDeck} + liquids={liquids} setShowMaterialsListModal={setShowMaterialsListModal} /> ) : null} diff --git a/protocol-designer/src/step-forms/selectors/index.ts b/protocol-designer/src/step-forms/selectors/index.ts index 160410217e4..9f565d220f5 100644 --- a/protocol-designer/src/step-forms/selectors/index.ts +++ b/protocol-designer/src/step-forms/selectors/index.ts @@ -39,6 +39,7 @@ import type { LabwareEntities, ModuleEntities, PipetteEntities, + LiquidEntities, } from '@opentrons/step-generation' import type { PipetteName, LabwareDefinition2 } from '@opentrons/shared-data' import type { @@ -93,8 +94,11 @@ import type { SavedStepFormState, BatchEditFormChangesState, } from '../reducers' +import type { RootState as LabwareIngredRootState } from '../../labware-ingred/reducers' const rootSelector = (state: BaseState): RootState => state.stepForms +const labwareIngredRootSelector = (state: BaseState): LabwareIngredRootState => + state.labwareIngred export const getPresavedStepForm = (state: BaseState): PresavedStepFormState => rootSelector(state).presavedStepForm @@ -106,6 +110,19 @@ export const getCurrentFormIsPresaved: Selector< presavedStepForm => presavedStepForm != null ) +const _getNormalizedLiquidById: Selector< + BaseState, + LiquidEntities +> = createSelector(labwareIngredRootSelector, state => state.ingredients) + +export const getLiquidEntities: Selector< + BaseState, + LiquidEntities +> = createSelector( + _getNormalizedLiquidById, + normalizedLiquidById => normalizedLiquidById +) + // NOTE Ian 2019-04-15: outside of this file, you probably only care about // the labware entity in its denormalized representation, in which case you ought // to use `getLabwareEntities` instead. @@ -672,6 +689,7 @@ export const getInvariantContext: Selector< getLabwareEntities, getModuleEntities, getPipetteEntities, + getLiquidEntities, getAdditionalEquipmentEntities, featureFlagSelectors.getDisableModuleRestrictions, featureFlagSelectors.getAllowAllTipracks, @@ -679,6 +697,7 @@ export const getInvariantContext: Selector< labwareEntities, moduleEntities, pipetteEntities, + liquidEntities, additionalEquipmentEntities, disableModuleRestrictions, allowAllTipracks @@ -686,6 +705,7 @@ export const getInvariantContext: Selector< labwareEntities, moduleEntities, pipetteEntities, + liquidEntities, additionalEquipmentEntities, config: { OT_PD_ALLOW_ALL_TIPRACKS: Boolean(allowAllTipracks), diff --git a/step-generation/src/__tests__/__snapshots__/fixtureGeneration.test.ts.snap b/step-generation/src/__tests__/__snapshots__/fixtureGeneration.test.ts.snap index 82e4b097eef..8440670ca4e 100644 --- a/step-generation/src/__tests__/__snapshots__/fixtureGeneration.test.ts.snap +++ b/step-generation/src/__tests__/__snapshots__/fixtureGeneration.test.ts.snap @@ -9087,6 +9087,7 @@ exports[`snapshot tests > makeContext 1`] = ` "labwareDefURI": "fixture/fixture_12_trough/1", }, }, + "liquidEntities": {}, "moduleEntities": {}, "pipetteEntities": { "p100096Id": { diff --git a/step-generation/src/__tests__/getIsSafePipetteMovement.test.ts b/step-generation/src/__tests__/getIsSafePipetteMovement.test.ts index 1319917a66b..7f7ee9cdfac 100644 --- a/step-generation/src/__tests__/getIsSafePipetteMovement.test.ts +++ b/step-generation/src/__tests__/getIsSafePipetteMovement.test.ts @@ -58,6 +58,7 @@ describe('getIsSafePipetteMovement', () => { }, moduleEntities: {}, additionalEquipmentEntities: {}, + liquidEntities: {}, config: { OT_PD_DISABLE_MODULE_RESTRICTIONS: false, }, @@ -87,6 +88,7 @@ describe('getIsSafePipetteMovement', () => { labwareEntities: {}, pipetteEntities: {}, moduleEntities: {}, + liquidEntities: {}, additionalEquipmentEntities: { trashBin: { name: 'trashBin', location: 'A3', id: 'trashBin' }, }, diff --git a/step-generation/src/__tests__/glue.test.ts b/step-generation/src/__tests__/glue.test.ts index 8524053cb43..5e4dbd376ce 100644 --- a/step-generation/src/__tests__/glue.test.ts +++ b/step-generation/src/__tests__/glue.test.ts @@ -179,6 +179,7 @@ beforeEach(() => { moduleEntities: {}, pipetteEntities: {}, additionalEquipmentEntities: {}, + liquidEntities: {}, config: DEFAULT_CONFIG, } }) diff --git a/step-generation/src/__tests__/utils.test.ts b/step-generation/src/__tests__/utils.test.ts index 277370e09ec..9b4df262e93 100644 --- a/step-generation/src/__tests__/utils.test.ts +++ b/step-generation/src/__tests__/utils.test.ts @@ -318,6 +318,7 @@ describe('makeInitialRobotState', () => { }, }, additionalEquipmentEntities: {}, + liquidEntities: {}, }, labwareLocations: { somePlateId: { slot: '1' }, diff --git a/step-generation/src/fixtures/robotStateFixtures.ts b/step-generation/src/fixtures/robotStateFixtures.ts index e7a6fd9bedb..298f5aa6636 100644 --- a/step-generation/src/fixtures/robotStateFixtures.ts +++ b/step-generation/src/fixtures/robotStateFixtures.ts @@ -192,6 +192,7 @@ export function makeContext(): InvariantContext { moduleEntities, pipetteEntities, additionalEquipmentEntities, + liquidEntities: {}, config: DEFAULT_CONFIG, } } diff --git a/step-generation/src/types.ts b/step-generation/src/types.ts index 95adcbee5a8..9198cbf2686 100644 --- a/step-generation/src/types.ts +++ b/step-generation/src/types.ts @@ -120,6 +120,19 @@ export interface NormalizedPipetteById { } } +export interface LiquidEntity { + displayName: string + displayColor: string + description: string | null + pythonName: string + liquidGroupId: string + liquidClass?: string +} + +export interface LiquidEntities { + [liquidId: string]: LiquidEntity +} + export type AdditionalEquipmentName = | 'gripper' | 'wasteChute' @@ -515,6 +528,7 @@ export interface InvariantContext { moduleEntities: ModuleEntities pipetteEntities: PipetteEntities additionalEquipmentEntities: AdditionalEquipmentEntities + liquidEntities: LiquidEntities config: Config } diff --git a/step-generation/src/utils/constructInvariantContextFromRunCommands.ts b/step-generation/src/utils/constructInvariantContextFromRunCommands.ts index 58f98794053..ea1899b5316 100644 --- a/step-generation/src/utils/constructInvariantContextFromRunCommands.ts +++ b/step-generation/src/utils/constructInvariantContextFromRunCommands.ts @@ -134,6 +134,9 @@ export function constructInvariantContextFromRunCommands( moduleEntities: {}, pipetteEntities: {}, additionalEquipmentEntities: {}, + // this util is used for the timeline scrubber. It grabs liquid info from analysis + // so this will not be wired up right now + liquidEntities: {}, config: { OT_PD_DISABLE_MODULE_RESTRICTIONS: true }, } ) From b4831cffd0005b57e267c0c8d7c511e7607ca9f5 Mon Sep 17 00:00:00 2001 From: Caila Marashaj <98041399+caila-marashaj@users.noreply.github.com> Date: Mon, 3 Feb 2025 15:56:25 -0500 Subject: [PATCH 061/150] feat(api): add new user-facing helper functions for static liquid tracking (#17360) --- .../protocol_api/core/engine/instrument.py | 31 +++-- .../protocol_api/core/engine/well.py | 32 +++++ .../opentrons/protocol_api/core/instrument.py | 4 + .../core/legacy/legacy_instrument_core.py | 11 ++ .../core/legacy/legacy_well_core.py | 15 +++ .../legacy_instrument_core.py | 12 ++ api/src/opentrons/protocol_api/core/well.py | 15 +++ .../protocol_api/instrument_context.py | 5 + api/src/opentrons/protocol_api/labware.py | 32 ++++- .../protocol_engine/commands/aspirate.py | 1 - .../protocol_engine/errors/__init__.py | 2 + .../protocol_engine/errors/exceptions.py | 13 ++ .../protocol_engine/state/frustum_helpers.py | 14 ++- .../protocol_engine/state/geometry.py | 69 ++++++++++- .../core/engine/test_instrument_core.py | 43 +++++++ .../core/engine/test_well_core.py | 111 ++++++++++++++++++ 16 files changed, 390 insertions(+), 20 deletions(-) diff --git a/api/src/opentrons/protocol_api/core/engine/instrument.py b/api/src/opentrons/protocol_api/core/engine/instrument.py index d1898e5ccaa..7d600369932 100644 --- a/api/src/opentrons/protocol_api/core/engine/instrument.py +++ b/api/src/opentrons/protocol_api/core/engine/instrument.py @@ -2,15 +2,7 @@ from __future__ import annotations -from typing import ( - Optional, - TYPE_CHECKING, - cast, - Union, - List, - Tuple, - NamedTuple, -) +from typing import Optional, TYPE_CHECKING, cast, Union, List, Tuple, NamedTuple from opentrons.types import Location, Mount, NozzleConfigurationType, NozzleMapInterface from opentrons.hardware_control import SyncHardwareAPI from opentrons.hardware_control.dev_types import PipetteDict @@ -1369,6 +1361,27 @@ def detect_liquid_presence(self, well_core: WellCore, loc: Location) -> bool: return result.z_position is not None + def get_minimum_liquid_sense_height(self) -> float: + attached_tip = self._engine_client.state.pipettes.get_attached_tip( + self._pipette_id + ) + if attached_tip: + tip_volume = attached_tip.volume + else: + raise TipNotAttachedError( + "Need to have a tip attached for liquid-sense operations." + ) + lld_settings = self._engine_client.state.pipettes.get_pipette_lld_settings( + pipette_id=self.pipette_id + ) + if lld_settings: + lld_min_height_for_tip_attached = lld_settings[f"t{tip_volume}"][ + "minHeight" + ] + return lld_min_height_for_tip_attached + else: + raise ValueError("liquid-level detection settings not found.") + def liquid_probe_with_recovery(self, well_core: WellCore, loc: Location) -> None: labware_id = well_core.labware_id well_name = well_core.get_name() diff --git a/api/src/opentrons/protocol_api/core/engine/well.py b/api/src/opentrons/protocol_api/core/engine/well.py index 34616d9eb55..6f47f6b572d 100644 --- a/api/src/opentrons/protocol_api/core/engine/well.py +++ b/api/src/opentrons/protocol_api/core/engine/well.py @@ -155,3 +155,35 @@ def from_center_cartesian(self, x: float, y: float, z: float) -> Point: y_ratio=y, z_ratio=z, ) + + def estimate_liquid_height_after_pipetting( + self, + operation_volume: float, + ) -> float: + """Return an estimate of liquid height after pipetting without raising an error.""" + labware_id = self.labware_id + well_name = self._name + starting_liquid_height = self.current_liquid_height() + projected_final_height = self._engine_client.state.geometry.get_well_height_after_liquid_handling_no_error( + labware_id=labware_id, + well_name=well_name, + initial_height=starting_liquid_height, + volume=operation_volume, + ) + return projected_final_height + + def current_liquid_height(self) -> float: + """Return the current liquid height within a well.""" + labware_id = self.labware_id + well_name = self._name + return self._engine_client.state.geometry.get_meniscus_height( + labware_id=labware_id, well_name=well_name + ) + + def get_liquid_volume(self) -> float: + """Return the current volume in a well.""" + labware_id = self.labware_id + well_name = self._name + return self._engine_client.state.geometry.get_current_well_volume( + labware_id=labware_id, well_name=well_name + ) diff --git a/api/src/opentrons/protocol_api/core/instrument.py b/api/src/opentrons/protocol_api/core/instrument.py index 4a60cf8f19e..7664d2c1cc8 100644 --- a/api/src/opentrons/protocol_api/core/instrument.py +++ b/api/src/opentrons/protocol_api/core/instrument.py @@ -225,6 +225,10 @@ def get_current_volume(self) -> float: def get_available_volume(self) -> float: ... + @abstractmethod + def get_minimum_liquid_sense_height(self) -> float: + ... + @abstractmethod def get_hardware_state(self) -> PipetteDict: """Get the current state of the pipette hardware as a dictionary.""" 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 5572ef440d9..7f8ba3b7a47 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 @@ -643,3 +643,14 @@ def _pressure_supported_by_pipette(self) -> bool: def nozzle_configuration_valid_for_lld(self) -> bool: """Check if the nozzle configuration currently supports LLD.""" return False + + def get_minimum_liquid_sense_height(self) -> float: + return 0.0 + + def estimate_liquid_height( + self, + well_core: LegacyWellCore, + starting_liquid_height: float, + operation_volume: float, + ) -> float: + return 0.0 diff --git a/api/src/opentrons/protocol_api/core/legacy/legacy_well_core.py b/api/src/opentrons/protocol_api/core/legacy/legacy_well_core.py index a88dd2eee80..5a39a7cd93f 100644 --- a/api/src/opentrons/protocol_api/core/legacy/legacy_well_core.py +++ b/api/src/opentrons/protocol_api/core/legacy/legacy_well_core.py @@ -118,6 +118,21 @@ def from_center_cartesian(self, x: float, y: float, z: float) -> Point: """Gets point in deck coordinates based on percentage of the radius of each axis.""" return self._geometry.from_center_cartesian(x, y, z) + def estimate_liquid_height_after_pipetting( + self, + operation_volume: float, + ) -> float: + """Estimate what the liquid height will be after pipetting, without raising an error.""" + return 0.0 + + def current_liquid_height(self) -> float: + """Get the current liquid height.""" + return 0.0 + + def get_liquid_volume(self) -> float: + """Get the current well volume.""" + return 0.0 + # TODO(mc, 2022-10-28): is this used and/or necessary? def __repr__(self) -> str: """Use the well's display name as its repr.""" 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 8c2c570ad1c..f7138198462 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 @@ -561,3 +561,15 @@ def _pressure_supported_by_pipette(self) -> bool: def nozzle_configuration_valid_for_lld(self) -> bool: """Check if the nozzle configuration currently supports LLD.""" return False + + def get_minimum_liquid_sense_height(self) -> float: + return 0.0 + + def estimate_liquid_height( + self, + well_core: LegacyWellCore, + starting_liquid_height: float, + operation_volume: float, + ) -> float: + """This will never be called because it was added in API 2.21.""" + assert False, "estimate_liquid_height only supported in API 2.21 & later" diff --git a/api/src/opentrons/protocol_api/core/well.py b/api/src/opentrons/protocol_api/core/well.py index bd58963a59c..bcaef764bf9 100644 --- a/api/src/opentrons/protocol_api/core/well.py +++ b/api/src/opentrons/protocol_api/core/well.py @@ -83,5 +83,20 @@ def load_liquid( def from_center_cartesian(self, x: float, y: float, z: float) -> Point: """Gets point in deck coordinates based on percentage of the radius of each axis.""" + @abstractmethod + def estimate_liquid_height_after_pipetting( + self, + operation_volume: float, + ) -> float: + """Estimate what the liquid height will be after pipetting, without raising an error.""" + + @abstractmethod + def current_liquid_height(self) -> float: + """Get the current liquid height.""" + + @abstractmethod + def get_liquid_volume(self) -> float: + """Get the current volume within a well.""" + WellCoreType = TypeVar("WellCoreType", bound=AbstractWellCore) diff --git a/api/src/opentrons/protocol_api/instrument_context.py b/api/src/opentrons/protocol_api/instrument_context.py index 992aa68c785..5e45dc7d9b7 100644 --- a/api/src/opentrons/protocol_api/instrument_context.py +++ b/api/src/opentrons/protocol_api/instrument_context.py @@ -165,6 +165,11 @@ def default_speed(self) -> float: def default_speed(self, speed: float) -> None: self._core.set_default_speed(speed) + @requires_version(2, 21) + def get_minimum_liquid_sense_height(self) -> float: + """Get the minimum allowed height for liquid-level detection.""" + return self._core.get_minimum_liquid_sense_height() + @requires_version(2, 0) def aspirate( self, diff --git a/api/src/opentrons/protocol_api/labware.py b/api/src/opentrons/protocol_api/labware.py index bb8a094e4c2..57472641969 100644 --- a/api/src/opentrons/protocol_api/labware.py +++ b/api/src/opentrons/protocol_api/labware.py @@ -36,7 +36,6 @@ UnsupportedAPIError, ) - # TODO(mc, 2022-09-02): re-exports provided for backwards compatibility # remove when their usage is no longer needed from opentrons.protocols.labware import ( # noqa: F401 @@ -49,7 +48,10 @@ from ._liquid import Liquid from ._types import OffDeckType from .core import well_grid -from .core.engine import ENGINE_CORE_API_VERSION, SET_OFFSET_RESTORED_API_VERSION +from .core.engine import ( + ENGINE_CORE_API_VERSION, + SET_OFFSET_RESTORED_API_VERSION, +) from .core.labware import AbstractLabware from .core.module import AbstractModuleCore from .core.core_map import LoadedCoreMap @@ -301,6 +303,32 @@ def load_liquid(self, liquid: Liquid, volume: float) -> None: volume=volume, ) + @requires_version(2, 21) + def current_liquid_height(self) -> float: + """Get the current liquid height in a well.""" + return self._core.current_liquid_height() + + @requires_version(2, 21) + def current_liquid_volume(self) -> float: + """Get the current liquid volume in a well.""" + return self._core.get_liquid_volume() + + @requires_version(2, 21) + def estimate_liquid_height_after_pipetting(self, operation_volume: float) -> float: + """Check the height of the liquid within a well. + + :returns: The height, in mm, of the liquid from the deck. + + :meta private: + + This is intended for Opentrons internal use only and is not a guaranteed API. + """ + + projected_final_height = self._core.estimate_liquid_height_after_pipetting( + operation_volume=operation_volume, + ) + return projected_final_height + def _from_center_cartesian(self, x: float, y: float, z: float) -> Point: """ Private version of from_center_cartesian. Present only for backward diff --git a/api/src/opentrons/protocol_engine/commands/aspirate.py b/api/src/opentrons/protocol_engine/commands/aspirate.py index 708ee3ecbdb..c599cc5ca44 100644 --- a/api/src/opentrons/protocol_engine/commands/aspirate.py +++ b/api/src/opentrons/protocol_engine/commands/aspirate.py @@ -152,7 +152,6 @@ async def execute(self, params: AspirateParams) -> _ExecuteReturn: labware_id=labware_id, well_name=well_name, ) - move_result = await move_to_well( movement=self._movement, model_utils=self._model_utils, diff --git a/api/src/opentrons/protocol_engine/errors/__init__.py b/api/src/opentrons/protocol_engine/errors/__init__.py index 85d89e8e2fb..6f6b276e897 100644 --- a/api/src/opentrons/protocol_engine/errors/__init__.py +++ b/api/src/opentrons/protocol_engine/errors/__init__.py @@ -74,6 +74,7 @@ CommandNotAllowedError, InvalidLiquidHeightFound, LiquidHeightUnknownError, + LiquidVolumeUnknownError, IncompleteLabwareDefinitionError, IncompleteWellDefinitionError, OperationLocationNotInWellError, @@ -167,6 +168,7 @@ "CommandNotAllowedError", "InvalidLiquidHeightFound", "LiquidHeightUnknownError", + "LiquidVolumeUnknownError", "IncompleteLabwareDefinitionError", "IncompleteWellDefinitionError", "OperationLocationNotInWellError", diff --git a/api/src/opentrons/protocol_engine/errors/exceptions.py b/api/src/opentrons/protocol_engine/errors/exceptions.py index 3aa7c0562ab..efcce483935 100644 --- a/api/src/opentrons/protocol_engine/errors/exceptions.py +++ b/api/src/opentrons/protocol_engine/errors/exceptions.py @@ -1101,6 +1101,19 @@ def __init__( super().__init__(ErrorCodes.GENERAL_ERROR, message, details, wrapping) +class LiquidVolumeUnknownError(ProtocolEngineError): + """Raised when attempting to report an unknown liquid volume.""" + + def __init__( + self, + message: Optional[str] = None, + details: Optional[Dict[str, Any]] = None, + wrapping: Optional[Sequence[EnumeratedError]] = None, + ) -> None: + """Build a LiquidVolumeUnknownError.""" + super().__init__(ErrorCodes.GENERAL_ERROR, message, details, wrapping) + + class EStopActivatedError(ProtocolEngineError): """Represents an E-stop event.""" diff --git a/api/src/opentrons/protocol_engine/state/frustum_helpers.py b/api/src/opentrons/protocol_engine/state/frustum_helpers.py index b28fb936be7..15706bf3d3d 100644 --- a/api/src/opentrons/protocol_engine/state/frustum_helpers.py +++ b/api/src/opentrons/protocol_engine/state/frustum_helpers.py @@ -241,9 +241,8 @@ def _get_segment_capacity(segment: WellSegment) -> float: def get_well_volumetric_capacity( well_geometry: InnerWellGeometry, ) -> List[Tuple[float, float]]: - """Return the total volumetric capacity of a well as a map of height borders to volume.""" - # dictionary map of heights to volumetric capacities within their respective segment - # {top_height_0: volume_0, top_height_1: volume_1, top_height_2: volume_2} + """Return the volumetric capacity of a well as a list of pairs relating segment heights to volumes.""" + # [(top_height_0, section_0_volume), (top_height_1, section_1_volume), ...] well_volume = [] # get the well segments sorted in ascending order @@ -417,13 +416,16 @@ def _find_height_in_partial_frustum( def find_height_at_well_volume( - target_volume: float, well_geometry: InnerWellGeometry + target_volume: float, + well_geometry: InnerWellGeometry, + raise_error_if_result_invalid: bool = True, ) -> float: """Find the height within a well, at a known volume.""" volumetric_capacity = get_well_volumetric_capacity(well_geometry) max_volume = sum(row[1] for row in volumetric_capacity) - if target_volume < 0 or target_volume > max_volume: - raise InvalidLiquidHeightFound("Invalid target volume.") + if raise_error_if_result_invalid: + if target_volume < 0 or target_volume > max_volume: + raise InvalidLiquidHeightFound("Invalid target volume.") sorted_well = sorted(well_geometry.sections, key=lambda section: section.topHeight) # find the section the target volume is in and compute the height diff --git a/api/src/opentrons/protocol_engine/state/geometry.py b/api/src/opentrons/protocol_engine/state/geometry.py index adebf800082..3f44712600d 100644 --- a/api/src/opentrons/protocol_engine/state/geometry.py +++ b/api/src/opentrons/protocol_engine/state/geometry.py @@ -1477,7 +1477,7 @@ def get_well_offset_adjustment( volume = operation_volume or 0.0 if volume: - return self.get_well_height_after_volume( + return self.get_well_height_after_liquid_handling( labware_id=labware_id, well_name=well_name, initial_height=initial_handling_height, @@ -1486,6 +1486,49 @@ def get_well_offset_adjustment( else: return initial_handling_height + def get_current_well_volume( + self, + labware_id: str, + well_name: str, + ) -> float: + """Returns most recently updated volume in specified well.""" + last_updated = self._wells.get_last_liquid_update(labware_id, well_name) + if last_updated is None: + raise errors.LiquidHeightUnknownError( + "Must LiquidProbe or LoadLiquid before specifying WellOrigin.MENISCUS." + ) + + well_liquid = self._wells.get_well_liquid_info( + labware_id=labware_id, well_name=well_name + ) + if ( + well_liquid.probed_height is not None + and well_liquid.probed_height.height is not None + and well_liquid.probed_height.last_probed == last_updated + ): + return self.get_well_volume_at_height( + labware_id=labware_id, + well_name=well_name, + height=well_liquid.probed_height.height, + ) + elif ( + well_liquid.loaded_volume is not None + and well_liquid.loaded_volume.volume is not None + and well_liquid.loaded_volume.last_loaded == last_updated + ): + return well_liquid.loaded_volume.volume + elif ( + well_liquid.probed_volume is not None + and well_liquid.probed_volume.volume is not None + and well_liquid.probed_volume.last_probed == last_updated + ): + return well_liquid.probed_volume.volume + else: + # This should not happen if there was an update but who knows + raise errors.LiquidVolumeUnknownError( + f"Unable to find liquid volume despite an update at {last_updated}." + ) + def get_meniscus_height( self, labware_id: str, @@ -1552,7 +1595,7 @@ def get_well_handling_height( ) return float(handling_height) - def get_well_height_after_volume( + def get_well_height_after_liquid_handling( self, labware_id: str, well_name: str, initial_height: float, volume: float ) -> float: """Return the height of liquid in a labware well after a given volume has been handled. @@ -1570,6 +1613,28 @@ def get_well_height_after_volume( target_volume=final_volume, well_geometry=well_geometry ) + def get_well_height_after_liquid_handling_no_error( + self, labware_id: str, well_name: str, initial_height: float, volume: float + ) -> float: + """Return what the height of liquid in a labware well after liquid handling will be. + + This raises no error if the value returned is an invalid physical location, so it should never be + used for navigation, only for a pre-emptive estimate. + """ + well_geometry = self._labware.get_well_geometry( + labware_id=labware_id, well_name=well_name + ) + initial_volume = find_volume_at_well_height( + target_height=initial_height, well_geometry=well_geometry + ) + final_volume = initial_volume + volume + well_volume = find_height_at_well_volume( + target_volume=final_volume, + well_geometry=well_geometry, + raise_error_if_result_invalid=False, + ) + return well_volume + def get_well_height_at_volume( self, labware_id: str, well_name: str, volume: float ) -> float: diff --git a/api/tests/opentrons/protocol_api/core/engine/test_instrument_core.py b/api/tests/opentrons/protocol_api/core/engine/test_instrument_core.py index c7e5fa904e0..c59a088a1c9 100644 --- a/api/tests/opentrons/protocol_api/core/engine/test_instrument_core.py +++ b/api/tests/opentrons/protocol_api/core/engine/test_instrument_core.py @@ -1155,6 +1155,49 @@ def test_get_display_name( assert subject.get_display_name() == "display-name" +@pytest.mark.parametrize("tip", [50, 200, 1000]) +def test_get_minimum_liquid_sense_height( + decoy: Decoy, subject: InstrumentCore, mock_engine_client: EngineClient, tip: int +) -> None: + """Make sure get minimum liquid sense height returns the appropriate minHeight for its tip.""" + dummy_lld_settings = { + "t50": {"minHeight": 1.0, "minVolume": 11}, + "t200": {"minHeight": 2.0, "minVolume": 22}, + "t1000": {"minHeight": 3.0, "minVolume": 33}, + } + decoy.when( + mock_engine_client.state.pipettes.get_pipette_lld_settings(subject.pipette_id) + ).then_return(dummy_lld_settings) + decoy.when( + mock_engine_client.state.pipettes.get_attached_tip("abc123") + ).then_return(TipGeometry(length=1, diameter=2, volume=tip)) + assert ( + subject.get_minimum_liquid_sense_height() + == dummy_lld_settings[f"t{tip}"]["minHeight"] + ) + + +def test_get_minimum_liquid_sense_height_requires_tip_presence( + decoy: Decoy, + subject: InstrumentCore, + mock_engine_client: EngineClient, +) -> None: + """Make sure get_minimum_liquid_sense_height propagates a TipNotAttachedError.""" + dummy_lld_settings = { + "t50": {"minHeight": 1.0, "minVolume": 11}, + "t200": {"minHeight": 2.0, "minVolume": 22}, + "t1000": {"minHeight": 3.0, "minVolume": 33}, + } + decoy.when( + mock_engine_client.state.pipettes.get_pipette_lld_settings(subject.pipette_id) + ).then_return(dummy_lld_settings) + decoy.when( + mock_engine_client.state.pipettes.get_attached_tip("abc123") + ).then_return(None) + with pytest.raises(TipNotAttachedError): + subject.get_minimum_liquid_sense_height() + + def test_get_min_volume( decoy: Decoy, subject: InstrumentCore, diff --git a/api/tests/opentrons/protocol_api/core/engine/test_well_core.py b/api/tests/opentrons/protocol_api/core/engine/test_well_core.py index 6e1912f0aec..06a5f827e1c 100644 --- a/api/tests/opentrons/protocol_api/core/engine/test_well_core.py +++ b/api/tests/opentrons/protocol_api/core/engine/test_well_core.py @@ -11,9 +11,18 @@ from opentrons.protocol_engine import WellLocation, WellOrigin, WellOffset from opentrons.protocol_engine import commands as cmd from opentrons.protocol_engine.clients import SyncClient as EngineClient +from opentrons.protocol_engine.errors.exceptions import ( + LiquidHeightUnknownError, + LiquidVolumeUnknownError, +) from opentrons.protocols.api_support.types import APIVersion from opentrons.protocols.api_support.util import UnsupportedAPIError from opentrons.types import Point +from opentrons_shared_data.labware.labware_definition import ( + InnerWellGeometry, + ConicalFrustum, + SphericalSegment, +) from opentrons.protocol_api._liquid import Liquid from opentrons.protocol_api.core.engine import WellCore, point_calculations, stringify @@ -227,6 +236,108 @@ def test_depth(subject: WellCore) -> None: assert subject.depth == 42.0 +def test_current_liquid_height( + decoy: Decoy, subject: WellCore, mock_engine_client: EngineClient +) -> None: + """Make sure current_liquid_height returns the correct meniscus value or raises an error.""" + fake_meniscus_height = 2222.2 + decoy.when( + mock_engine_client.state.geometry.get_meniscus_height( + labware_id="labware-id", well_name="well-name" + ) + ).then_return(fake_meniscus_height) + assert subject.current_liquid_height() == fake_meniscus_height + + # make sure that WellCore propagates a LiquidHeightUnknownError + decoy.when( + mock_engine_client.state.geometry.get_meniscus_height( + labware_id="labware-id", well_name="well-name" + ) + ).then_raise(LiquidHeightUnknownError()) + + with pytest.raises(LiquidHeightUnknownError): + subject.current_liquid_height() + + +def test_current_liquid_volume( + decoy: Decoy, subject: WellCore, mock_engine_client: EngineClient +) -> None: + """Make sure current_liquid_volume returns the correct value or raises an error.""" + fake_volume = 2222.2 + decoy.when( + mock_engine_client.state.geometry.get_current_well_volume( + labware_id="labware-id", well_name="well-name" + ) + ).then_return(fake_volume) + assert subject.get_liquid_volume() == fake_volume + + # make sure that WellCore propagates a LiquidVolumeUnknownError + decoy.when( + mock_engine_client.state.geometry.get_current_well_volume( + labware_id="labware-id", well_name="well-name" + ) + ).then_raise(LiquidVolumeUnknownError()) + + with pytest.raises(LiquidVolumeUnknownError): + subject.get_liquid_volume() + + +@pytest.mark.parametrize("operation_volume", [0.0, 100, -100, 2, -4, 5]) +def test_estimate_liquid_height_after_pipetting( + decoy: Decoy, + subject: WellCore, + mock_engine_client: EngineClient, + operation_volume: float, +) -> None: + """Make sure estimate_liquid_height_after_pipetting returns the correct value and does not raise an error.""" + fake_well_geometry = InnerWellGeometry( + sections=[ + SphericalSegment( + shape="spherical", + radiusOfCurvature=1.0, + topHeight=2.5, + bottomHeight=0.0, + ), + ConicalFrustum( + shape="conical", + bottomHeight=2.5, + topHeight=10.1, + bottomDiameter=4.4, + topDiameter=6.7, + ), + ConicalFrustum( + shape="conical", + bottomHeight=10.1, + topHeight=10.2, + bottomDiameter=6.7, + topDiameter=7.7, + ), + ] + ) + decoy.when( + mock_engine_client.state.labware.get_well_geometry( + labware_id="labware-id", well_name="well-name" + ) + ).then_return(fake_well_geometry) + initial_liquid_height = 5.6 + fake_final_height = 10000000 + decoy.when(subject.current_liquid_height()).then_return(initial_liquid_height) + decoy.when( + mock_engine_client.state.geometry.get_well_height_after_liquid_handling_no_error( + labware_id="labware-id", + well_name="well-name", + initial_height=initial_liquid_height, + volume=operation_volume, + ) + ).then_return(fake_final_height) + + # make sure that no error was raised + final_height = subject.estimate_liquid_height_after_pipetting( + operation_volume=operation_volume, + ) + assert final_height == fake_final_height + + def test_from_center_cartesian( decoy: Decoy, mock_engine_client: EngineClient, subject: WellCore ) -> None: From 932000d2403ecda99c58d488a69e5f8d8ec9d448 Mon Sep 17 00:00:00 2001 From: jbleon95 Date: Mon, 3 Feb 2025 16:13:27 -0500 Subject: [PATCH 062/150] import fixes, correction volume for evotip dispense, and stray merge error --- api/src/opentrons/protocol_engine/commands/evotip_dispense.py | 2 ++ .../protocol_engine/commands/test_evotip_dispense.py | 4 ++-- .../protocol_engine/commands/test_evotip_seal_pipette.py | 2 +- .../protocol_engine/commands/test_evotip_unseal_pipette.py | 2 +- .../opentrons/protocol_engine/state/test_geometry_view.py | 1 - 5 files changed, 6 insertions(+), 5 deletions(-) diff --git a/api/src/opentrons/protocol_engine/commands/evotip_dispense.py b/api/src/opentrons/protocol_engine/commands/evotip_dispense.py index e0053262295..b028d72fc45 100644 --- a/api/src/opentrons/protocol_engine/commands/evotip_dispense.py +++ b/api/src/opentrons/protocol_engine/commands/evotip_dispense.py @@ -11,6 +11,7 @@ DispenseVolumeMixin, BaseLiquidHandlingResult, dispense_in_place, + DEFAULT_CORRECTION_VOLUME, ) from .movement_common import ( LiquidHandlingWellLocationMixin, @@ -115,6 +116,7 @@ async def execute(self, params: EvotipDispenseParams) -> _ExecuteReturn: }, pipetting=self._pipetting, model_utils=self._model_utils, + correction_volume=params.correctionVolume or DEFAULT_CORRECTION_VOLUME, ) if isinstance(result, DefinedErrorData): # TODO (chb, 2025-01-29): Remove this and the OverpressureError returns once disabled for this function diff --git a/api/tests/opentrons/protocol_engine/commands/test_evotip_dispense.py b/api/tests/opentrons/protocol_engine/commands/test_evotip_dispense.py index 568ddda83c1..d8da3b69b82 100644 --- a/api/tests/opentrons/protocol_engine/commands/test_evotip_dispense.py +++ b/api/tests/opentrons/protocol_engine/commands/test_evotip_dispense.py @@ -17,7 +17,7 @@ MovementHandler, ) -from opentrons.protocols.models import LabwareDefinition +from opentrons_shared_data.labware.labware_definition import LabwareDefinition from opentrons.protocol_engine.commands.command import SuccessData from opentrons.protocol_engine.commands.evotip_dispense import ( EvotipDispenseParams, @@ -105,7 +105,7 @@ async def test_evotip_dispense_implementation( decoy.when( await pipetting.dispense_in_place( - pipette_id="pipette-id-abc123", volume=100.0, flow_rate=456.0, push_out=None + pipette_id="pipette-id-abc123", volume=100.0, flow_rate=456.0, push_out=None, correction_volume=0, ) ).then_return(100) diff --git a/api/tests/opentrons/protocol_engine/commands/test_evotip_seal_pipette.py b/api/tests/opentrons/protocol_engine/commands/test_evotip_seal_pipette.py index 3d1bbeb1406..0a2805913e6 100644 --- a/api/tests/opentrons/protocol_engine/commands/test_evotip_seal_pipette.py +++ b/api/tests/opentrons/protocol_engine/commands/test_evotip_seal_pipette.py @@ -6,7 +6,7 @@ from decoy import Decoy, matchers from unittest.mock import sentinel -from opentrons.protocols.models import LabwareDefinition +from opentrons_shared_data.labware.labware_definition import LabwareDefinition from opentrons_shared_data.errors.exceptions import StallOrCollisionDetectedError diff --git a/api/tests/opentrons/protocol_engine/commands/test_evotip_unseal_pipette.py b/api/tests/opentrons/protocol_engine/commands/test_evotip_unseal_pipette.py index 5f1c94c3dd6..54c7e222bd2 100644 --- a/api/tests/opentrons/protocol_engine/commands/test_evotip_unseal_pipette.py +++ b/api/tests/opentrons/protocol_engine/commands/test_evotip_unseal_pipette.py @@ -26,7 +26,7 @@ from opentrons.protocol_engine.state import update_types from opentrons.protocol_engine.state.state import StateView from opentrons.protocol_engine.execution import MovementHandler, GantryMover, TipHandler -from opentrons.protocols.models import LabwareDefinition +from opentrons_shared_data.labware.labware_definition import LabwareDefinition import json from opentrons_shared_data import load_shared_data diff --git a/api/tests/opentrons/protocol_engine/state/test_geometry_view.py b/api/tests/opentrons/protocol_engine/state/test_geometry_view.py index 602835196f5..3c214923e25 100644 --- a/api/tests/opentrons/protocol_engine/state/test_geometry_view.py +++ b/api/tests/opentrons/protocol_engine/state/test_geometry_view.py @@ -3409,7 +3409,6 @@ def test_validate_dispense_volume_into_well_meniscus( ) -<<<<<<< HEAD def test_get_latest_volume_information( decoy: Decoy, mock_labware_view: LabwareView, From 73ca6742ad7600bc64119446b0bc96a28281ae57 Mon Sep 17 00:00:00 2001 From: jbleon95 Date: Mon, 3 Feb 2025 16:15:51 -0500 Subject: [PATCH 063/150] stray format fix --- .../protocol_engine/commands/test_evotip_dispense.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/api/tests/opentrons/protocol_engine/commands/test_evotip_dispense.py b/api/tests/opentrons/protocol_engine/commands/test_evotip_dispense.py index d8da3b69b82..abde82a1d77 100644 --- a/api/tests/opentrons/protocol_engine/commands/test_evotip_dispense.py +++ b/api/tests/opentrons/protocol_engine/commands/test_evotip_dispense.py @@ -105,7 +105,11 @@ async def test_evotip_dispense_implementation( decoy.when( await pipetting.dispense_in_place( - pipette_id="pipette-id-abc123", volume=100.0, flow_rate=456.0, push_out=None, correction_volume=0, + pipette_id="pipette-id-abc123", + volume=100.0, + flow_rate=456.0, + push_out=None, + correction_volume=0, ) ).then_return(100) From b3b2e1e80a6b0cd7674891c4c926a6796348bf08 Mon Sep 17 00:00:00 2001 From: jbleon95 Date: Mon, 3 Feb 2025 16:16:03 -0500 Subject: [PATCH 064/150] command schema 12 update --- shared-data/command/schemas/12.json | 240 ++++++++++++++++++++++++++++ 1 file changed, 240 insertions(+) diff --git a/shared-data/command/schemas/12.json b/shared-data/command/schemas/12.json index 914e32a117b..2e40c357c7d 100644 --- a/shared-data/command/schemas/12.json +++ b/shared-data/command/schemas/12.json @@ -1880,6 +1880,209 @@ "title": "EngageParams", "type": "object" }, + "EvotipDispenseCreate": { + "description": "DispenseInPlace command request model.", + "properties": { + "commandType": { + "const": "evotipDispense", + "default": "evotipDispense", + "enum": ["evotipDispense"], + "title": "Commandtype", + "type": "string" + }, + "intent": { + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" + }, + "key": { + "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", + "title": "Key", + "type": "string" + }, + "params": { + "$ref": "#/$defs/EvotipDispenseParams" + } + }, + "required": ["params"], + "title": "EvotipDispenseCreate", + "type": "object" + }, + "EvotipDispenseParams": { + "description": "Payload required to dispense in place.", + "properties": { + "correctionVolume": { + "anyOf": [ + { + "minimum": 0.0, + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "description": "The correction volume in uL.", + "title": "Correctionvolume" + }, + "flowRate": { + "description": "Speed in \u00b5L/s configured for the pipette", + "exclusiveMinimum": 0.0, + "title": "Flowrate", + "type": "number" + }, + "labwareId": { + "description": "Identifier of labware to use.", + "title": "Labwareid", + "type": "string" + }, + "pipetteId": { + "description": "Identifier of pipette to use for liquid handling.", + "title": "Pipetteid", + "type": "string" + }, + "volume": { + "description": "The amount of liquid to dispense, in \u00b5L. Must not be greater than the currently aspirated volume. There is some tolerance for floating point rounding errors.", + "minimum": 0.0, + "title": "Volume", + "type": "number" + }, + "wellLocation": { + "$ref": "#/$defs/LiquidHandlingWellLocation", + "description": "Relative well location at which to perform the operation" + }, + "wellName": { + "description": "Name of well to use in labware.", + "title": "Wellname", + "type": "string" + } + }, + "required": ["labwareId", "wellName", "flowRate", "volume", "pipetteId"], + "title": "EvotipDispenseParams", + "type": "object" + }, + "EvotipSealPipetteCreate": { + "description": "Seal evotip resin tip command creation request model.", + "properties": { + "commandType": { + "const": "evotipSealPipette", + "default": "evotipSealPipette", + "enum": ["evotipSealPipette"], + "title": "Commandtype", + "type": "string" + }, + "intent": { + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" + }, + "key": { + "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", + "title": "Key", + "type": "string" + }, + "params": { + "$ref": "#/$defs/EvotipSealPipetteParams" + } + }, + "required": ["params"], + "title": "EvotipSealPipetteCreate", + "type": "object" + }, + "EvotipSealPipetteParams": { + "description": "Payload needed to seal resin tips to a pipette.", + "properties": { + "labwareId": { + "description": "Identifier of labware to use.", + "title": "Labwareid", + "type": "string" + }, + "pipetteId": { + "description": "Identifier of pipette to use for liquid handling.", + "title": "Pipetteid", + "type": "string" + }, + "tipPickUpParams": { + "anyOf": [ + { + "$ref": "#/$defs/TipPickUpParams" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Specific parameters for " + }, + "wellLocation": { + "$ref": "#/$defs/PickUpTipWellLocation", + "description": "Relative well location at which to pick up the tip." + }, + "wellName": { + "description": "Name of well to use in labware.", + "title": "Wellname", + "type": "string" + } + }, + "required": ["pipetteId", "labwareId", "wellName"], + "title": "EvotipSealPipetteParams", + "type": "object" + }, + "EvotipUnsealPipetteCreate": { + "description": "Evotip unseal command creation request model.", + "properties": { + "commandType": { + "const": "evotipUnsealPipette", + "default": "evotipUnsealPipette", + "enum": ["evotipUnsealPipette"], + "title": "Commandtype", + "type": "string" + }, + "intent": { + "$ref": "#/$defs/CommandIntent", + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "title": "Intent" + }, + "key": { + "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", + "title": "Key", + "type": "string" + }, + "params": { + "$ref": "#/$defs/EvotipUnsealPipetteParams" + } + }, + "required": ["params"], + "title": "EvotipUnsealPipetteCreate", + "type": "object" + }, + "EvotipUnsealPipetteParams": { + "description": "Payload required to drop a tip in a specific well.", + "properties": { + "labwareId": { + "description": "Identifier of labware to use.", + "title": "Labwareid", + "type": "string" + }, + "pipetteId": { + "description": "Identifier of pipette to use for liquid handling.", + "title": "Pipetteid", + "type": "string" + }, + "wellLocation": { + "$ref": "#/$defs/DropTipWellLocation", + "description": "Relative well location at which to drop the tip." + }, + "wellName": { + "description": "Name of well to use in labware.", + "title": "Wellname", + "type": "string" + } + }, + "required": ["pipetteId", "labwareId", "wellName"], + "title": "EvotipUnsealPipetteParams", + "type": "object" + }, "GetNextTipCreate": { "description": "Get next tip command creation request model.", "properties": { @@ -4971,6 +5174,31 @@ "title": "Submerge", "type": "object" }, + "TipPickUpParams": { + "description": "Payload used to specify press-tip parameters for a seal command.", + "properties": { + "ejectorPushMm": { + "default": 0, + "description": "The distance to back off to ensure that the tip presence sensors are not triggered.", + "title": "Ejectorpushmm", + "type": "number" + }, + "prepDistance": { + "default": 0, + "description": "The distance to move down to fit the tips on.", + "title": "Prepdistance", + "type": "number" + }, + "pressDistance": { + "default": 0, + "description": "The distance to press on tips.", + "title": "Pressdistance", + "type": "number" + } + }, + "title": "TipPickUpParams", + "type": "object" + }, "TipPresenceStatus": { "description": "Tip presence status reported by a pipette.", "enum": ["present", "absent", "unknown"], @@ -6130,6 +6358,9 @@ "dispenseWhileTracking": "#/$defs/DispenseWhileTrackingCreate", "dropTip": "#/$defs/DropTipCreate", "dropTipInPlace": "#/$defs/DropTipInPlaceCreate", + "evotipDispense": "#/$defs/EvotipDispenseCreate", + "evotipSealPipette": "#/$defs/EvotipSealPipetteCreate", + "evotipUnsealPipette": "#/$defs/EvotipUnsealPipetteCreate", "flexStacker/configure": "#/$defs/ConfigureCreate", "flexStacker/retrieve": "#/$defs/RetrieveCreate", "flexStacker/store": "#/$defs/StoreCreate", @@ -6332,6 +6563,15 @@ { "$ref": "#/$defs/TryLiquidProbeCreate" }, + { + "$ref": "#/$defs/EvotipSealPipetteCreate" + }, + { + "$ref": "#/$defs/EvotipDispenseCreate" + }, + { + "$ref": "#/$defs/EvotipUnsealPipetteCreate" + }, { "$ref": "#/$defs/opentrons__protocol_engine__commands__heater_shaker__wait_for_temperature__WaitForTemperatureCreate" }, From 307f745cbdd1aac7069289ff185985aad216c237 Mon Sep 17 00:00:00 2001 From: jbleon95 Date: Mon, 3 Feb 2025 16:47:22 -0500 Subject: [PATCH 065/150] lint fixes --- .../protocol_engine/commands/flex_stacker/configure.py | 2 +- .../opentrons/protocol_engine/commands/flex_stacker/retrieve.py | 2 +- .../opentrons/protocol_engine/commands/flex_stacker/store.py | 2 +- app/src/assets/localization/en/device_details.json | 1 - 4 files changed, 3 insertions(+), 4 deletions(-) diff --git a/api/src/opentrons/protocol_engine/commands/flex_stacker/configure.py b/api/src/opentrons/protocol_engine/commands/flex_stacker/configure.py index 85c0808b60a..d9af9a24f9c 100644 --- a/api/src/opentrons/protocol_engine/commands/flex_stacker/configure.py +++ b/api/src/opentrons/protocol_engine/commands/flex_stacker/configure.py @@ -62,7 +62,7 @@ class Configure(BaseCommand[ConfigureParams, ConfigureResult, ErrorOccurrence]): commandType: ConfigureCommandType = "flexStacker/configure" params: ConfigureParams - result: Optional[ConfigureResult] + result: Optional[ConfigureResult] = None _ImplementationCls: Type[ConfigureImpl] = ConfigureImpl diff --git a/api/src/opentrons/protocol_engine/commands/flex_stacker/retrieve.py b/api/src/opentrons/protocol_engine/commands/flex_stacker/retrieve.py index 7029b5772c3..2b723304017 100644 --- a/api/src/opentrons/protocol_engine/commands/flex_stacker/retrieve.py +++ b/api/src/opentrons/protocol_engine/commands/flex_stacker/retrieve.py @@ -113,7 +113,7 @@ class Retrieve(BaseCommand[RetrieveParams, RetrieveResult, ErrorOccurrence]): commandType: RetrieveCommandType = "flexStacker/retrieve" params: RetrieveParams - result: Optional[RetrieveResult] + result: Optional[RetrieveResult] = None _ImplementationCls: Type[RetrieveImpl] = RetrieveImpl diff --git a/api/src/opentrons/protocol_engine/commands/flex_stacker/store.py b/api/src/opentrons/protocol_engine/commands/flex_stacker/store.py index 37f2d9f7616..c2ef3e67f3e 100644 --- a/api/src/opentrons/protocol_engine/commands/flex_stacker/store.py +++ b/api/src/opentrons/protocol_engine/commands/flex_stacker/store.py @@ -100,7 +100,7 @@ class Store(BaseCommand[StoreParams, StoreResult, ErrorOccurrence]): commandType: StoreCommandType = "flexStacker/store" params: StoreParams - result: Optional[StoreResult] + result: Optional[StoreResult] = None _ImplementationCls: Type[StoreImpl] = StoreImpl diff --git a/app/src/assets/localization/en/device_details.json b/app/src/assets/localization/en/device_details.json index 9ee03d91807..11ecc8edc2b 100644 --- a/app/src/assets/localization/en/device_details.json +++ b/app/src/assets/localization/en/device_details.json @@ -65,7 +65,6 @@ "firmware_updated_successfully": "Firmware updated successfully", "fixture": "Fixture", "flex_stacker_door_status": "Door status: {{status}}", - "have_not_run_description": "After you run some protocols, they will appear here.", "have_not_run": "No recent runs", "have_not_run_description": "After you run some protocols, they will appear here.", "heater": "Heater", From 222d4a0c978a02c968d324c6e69ed0c823a3b2d2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 3 Feb 2025 16:00:14 -0600 Subject: [PATCH 066/150] fix(analyses-snapshot-testing): heal mergeback_chore_release_830_into_edge snapshots (#17409) This PR was requested on the PR https://github.com/Opentrons/opentrons/pull/17408 Co-authored-by: y3rsh <502770+y3rsh@users.noreply.github.com> --- ...2_21_P1000_96_GRIP_HS_MB_TC_TM_Smoke].json | 40 ++++++++++++++++--- ...0][Flex_X_v2_21_tc_lids_wrong_target].json | 5 +++ 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2b866b03f3][Flex_S_v2_21_P1000_96_GRIP_HS_MB_TC_TM_Smoke].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2b866b03f3][Flex_S_v2_21_P1000_96_GRIP_HS_MB_TC_TM_Smoke].json index 0454e8ec9c9..ee19bc58e32 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2b866b03f3][Flex_S_v2_21_P1000_96_GRIP_HS_MB_TC_TM_Smoke].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2b866b03f3][Flex_S_v2_21_P1000_96_GRIP_HS_MB_TC_TM_Smoke].json @@ -1253,7 +1253,8 @@ "biorad_96_wellplate_200ul_pcr", "opentrons_96_wellplate_200ul_pcr_full_skirt", "opentrons_flex_deck_riser", - "opentrons_tough_pcr_auto_sealing_lid" + "opentrons_tough_pcr_auto_sealing_lid", + "protocol_engine_lid_stack_object" ], "cornerOffsetFromSlot": { "x": 0, @@ -1358,6 +1359,11 @@ "x": 0, "y": 0, "z": 6.492 + }, + "protocol_engine_lid_stack_object": { + "x": 0, + "y": 0, + "z": 0 } }, "stackingOffsetWithModule": { @@ -1405,7 +1411,8 @@ "biorad_96_wellplate_200ul_pcr", "opentrons_96_wellplate_200ul_pcr_full_skirt", "opentrons_flex_deck_riser", - "opentrons_tough_pcr_auto_sealing_lid" + "opentrons_tough_pcr_auto_sealing_lid", + "protocol_engine_lid_stack_object" ], "cornerOffsetFromSlot": { "x": 0, @@ -1510,6 +1517,11 @@ "x": 0, "y": 0, "z": 6.492 + }, + "protocol_engine_lid_stack_object": { + "x": 0, + "y": 0, + "z": 0 } }, "stackingOffsetWithModule": { @@ -1557,7 +1569,8 @@ "biorad_96_wellplate_200ul_pcr", "opentrons_96_wellplate_200ul_pcr_full_skirt", "opentrons_flex_deck_riser", - "opentrons_tough_pcr_auto_sealing_lid" + "opentrons_tough_pcr_auto_sealing_lid", + "protocol_engine_lid_stack_object" ], "cornerOffsetFromSlot": { "x": 0, @@ -1662,6 +1675,11 @@ "x": 0, "y": 0, "z": 6.492 + }, + "protocol_engine_lid_stack_object": { + "x": 0, + "y": 0, + "z": 0 } }, "stackingOffsetWithModule": { @@ -1709,7 +1727,8 @@ "biorad_96_wellplate_200ul_pcr", "opentrons_96_wellplate_200ul_pcr_full_skirt", "opentrons_flex_deck_riser", - "opentrons_tough_pcr_auto_sealing_lid" + "opentrons_tough_pcr_auto_sealing_lid", + "protocol_engine_lid_stack_object" ], "cornerOffsetFromSlot": { "x": 0, @@ -1814,6 +1833,11 @@ "x": 0, "y": 0, "z": 6.492 + }, + "protocol_engine_lid_stack_object": { + "x": 0, + "y": 0, + "z": 0 } }, "stackingOffsetWithModule": { @@ -1861,7 +1885,8 @@ "biorad_96_wellplate_200ul_pcr", "opentrons_96_wellplate_200ul_pcr_full_skirt", "opentrons_flex_deck_riser", - "opentrons_tough_pcr_auto_sealing_lid" + "opentrons_tough_pcr_auto_sealing_lid", + "protocol_engine_lid_stack_object" ], "cornerOffsetFromSlot": { "x": 0, @@ -1966,6 +1991,11 @@ "x": 0, "y": 0, "z": 6.492 + }, + "protocol_engine_lid_stack_object": { + "x": 0, + "y": 0, + "z": 0 } }, "stackingOffsetWithModule": { diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[7d16d5dbf0][Flex_X_v2_21_tc_lids_wrong_target].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[7d16d5dbf0][Flex_X_v2_21_tc_lids_wrong_target].json index ca0539fd2ad..c2da7c45698 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[7d16d5dbf0][Flex_X_v2_21_tc_lids_wrong_target].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[7d16d5dbf0][Flex_X_v2_21_tc_lids_wrong_target].json @@ -830,6 +830,11 @@ }, "schemaVersion": 2, "stackingOffsetWithLabware": { + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 + }, "opentrons_96_deep_well_adapter": { "x": 0, "y": 0, From dd148b6c08cd6fb2ca14aac670fd6c3fde031d8f Mon Sep 17 00:00:00 2001 From: emilyburghardt Date: Mon, 3 Feb 2025 15:14:01 -0700 Subject: [PATCH 067/150] update 8.3.0 release notes for stable release (#17407) # Overview Updated release notes for stable release. ## Test Plan and Hands on Testing No building on our end until the notes are live in the app, but possibility of format breaking is very low. ## Changelog -removed specific mention of Evotips and Ultima PEEK pipettes -changed overall message to reflect our API 2.22 versioning message: "beta features for our commercial partners" ## Review requests Just a double check on messaging to customers. ## Risk assessment low. --------- Co-authored-by: Josh McVey --- api/release-notes.md | 7 +------ app-shell/build/release-notes.md | 4 +--- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/api/release-notes.md b/api/release-notes.md index 68d84b62cce..acd5a164868 100644 --- a/api/release-notes.md +++ b/api/release-notes.md @@ -10,13 +10,8 @@ By installing and using Opentrons software, you agree to the Opentrons End-User ## Opentrons Robot Software Changes in 8.3.0 -Welcome to the v8.3.0 release of the Opentrons robot software! This release adds support for Evosep Evotips on the Flex, as well as other features. +Welcome to the v8.3.0 release of the Opentrons robot software! This release includes improvements to error recovery on the Flex, as well as beta features for our commercial partners. -### New Features - -- Use Evosep Evotips in Python API version 2.22 protocols for protein sample purification. Only available with the Flex 96-channel pipette. - -- Load a newly modified Flex 8-Channel EM 1000 µL pipette equipped with a PEEK motor component to automate emulsion applications. ### Improved Features diff --git a/app-shell/build/release-notes.md b/app-shell/build/release-notes.md index 4d5c7827f6f..ce36cb96fa8 100644 --- a/app-shell/build/release-notes.md +++ b/app-shell/build/release-notes.md @@ -10,13 +10,11 @@ By installing and using Opentrons software, you agree to the Opentrons End-User ## Opentrons App Changes in 8.3.0 -Welcome to the v8.3.0 release of the Opentrons App! This release adds support for Evosep Evotips on the Flex, as well as other features. +Welcome to the v8.3.0 release of the Opentrons App! This release adds support for Mandarin in the app or Flex touchscreen and includes other beta features for our commercial partners. ### New Features -- Use Evosep Evotips in Python API version 2.22 protocols for protein sample purification. Only available with the Flex 96-channel pipette. - Change the app or Flex touchscreen language to Mandarin in Settings. -- Load a newly modified Flex 8-Channel EM 1000 µL pipette equipped with a PEEK motor component to automate emulsion applications. ### Improved Features From 0855b9b677ef428fcb4f6ee2407bea6f84d46770 Mon Sep 17 00:00:00 2001 From: Josh McVey Date: Tue, 4 Feb 2025 09:12:41 -0600 Subject: [PATCH 068/150] fix(ci): update and streamline PD workflow (#17406) --- .../environment/complex-variables/action.yml | 13 ++ .github/actions/git/resolve-tag/action.yml | 17 ++ .github/actions/js/setup/action.yml | 28 +++ .github/workflows/pd-test-build-deploy.yaml | 179 +++++------------- protocol-designer/Makefile | 8 +- protocol-designer/vite.config.mts | 3 + vitest.config.mts | 2 +- 7 files changed, 110 insertions(+), 140 deletions(-) create mode 100644 .github/actions/environment/complex-variables/action.yml create mode 100644 .github/actions/git/resolve-tag/action.yml create mode 100644 .github/actions/js/setup/action.yml diff --git a/.github/actions/environment/complex-variables/action.yml b/.github/actions/environment/complex-variables/action.yml new file mode 100644 index 00000000000..b16e788ddab --- /dev/null +++ b/.github/actions/environment/complex-variables/action.yml @@ -0,0 +1,13 @@ +name: 'Set Complex Environment Variables' +description: Composite action using github-script to set complex environment variables. +inputs: {} +runs: + using: 'composite' + steps: + - name: 'Set complex environment variables' + id: set-vars + uses: actions/github-script@v7 + with: + script: | + const { buildComplexEnvVars } = require(`${process.env.GITHUB_WORKSPACE}/.github/workflows/utils.js`) + buildComplexEnvVars(core, context) diff --git a/.github/actions/git/resolve-tag/action.yml b/.github/actions/git/resolve-tag/action.yml new file mode 100644 index 00000000000..9be544b79bc --- /dev/null +++ b/.github/actions/git/resolve-tag/action.yml @@ -0,0 +1,17 @@ +name: 'Fix Checkout Tags' +description: > + Composite action to fix actions/checkout odd handling of tags + by fetching and checking out the exact tag reference. + See https://github.com/actions/checkout/issues/290 +inputs: {} +runs: + using: 'composite' + steps: + - name: 'Fix actions/checkout odd handling of tags' + if: startsWith(github.ref, 'refs/tags') + shell: bash + env: + REF: ${{ github.ref }} + run: | + git fetch -f origin "${REF}:${REF}" + git checkout "${REF}" diff --git a/.github/actions/js/setup/action.yml b/.github/actions/js/setup/action.yml new file mode 100644 index 00000000000..4b9c97cd27f --- /dev/null +++ b/.github/actions/js/setup/action.yml @@ -0,0 +1,28 @@ +name: 'Setup JS Environment' +description: > + Composite action to fix tag handling in checkout, + setup Node.js, install udev for USB detection, cache Yarn/NPM caches, + and perform JS setup. + +inputs: {} + +runs: + using: 'composite' + steps: + - uses: ./.github/actions/git/resolve-tag + - uses: ./.github/actions/environment/complex-variables + - name: 'Setup Node' + uses: actions/setup-node@v4 + with: + node-version: '22.11.0' + cache: 'yarn' + + - name: 'Install udev for USB-detection' + if: runner.os == 'Linux' + shell: bash + run: sudo apt-get update && sudo apt-get install libudev-dev + + - name: 'Setup JS' + shell: bash + run: | + make setup-js diff --git a/.github/workflows/pd-test-build-deploy.yaml b/.github/workflows/pd-test-build-deploy.yaml index babebb5a918..fc047ab5f49 100644 --- a/.github/workflows/pd-test-build-deploy.yaml +++ b/.github/workflows/pd-test-build-deploy.yaml @@ -11,6 +11,9 @@ on: - 'components/**' - 'package.json' - '.github/workflows/pd-test-build-deploy.yaml' + - '.github/actions/js/setup/action.yml' + - '.github/actions/git/resolve-tag/action.yml' + - '.github/actions/environment/complex-variables/action.yml' push: paths: - 'protocol-designer/**' @@ -19,6 +22,9 @@ on: - 'components/**' - 'package.json' - '.github/workflows/pd-test-build-deploy.yaml' + - '.github/actions/js/setup/action.yml' + - '.github/actions/git/resolve-tag/action.yml' + - '.github/actions/environment/complex-variables/action.yml' branches: - '**' tags: @@ -37,126 +43,42 @@ env: CI: true jobs: - js-unit-test: + unit-test: name: 'protocol designer unit tests' - runs-on: 'ubuntu-22.04' - timeout-minutes: 30 + runs-on: 'ubuntu-24.04' + timeout-minutes: 20 steps: - - uses: 'actions/checkout@v4' - # https://github.com/actions/checkout/issues/290 - - name: 'Fix actions/checkout odd handling of tags' - if: startsWith(github.ref, 'refs/tags') - run: | - git fetch -f origin ${{ github.ref }}:${{ github.ref }} - git checkout ${{ github.ref }} - - uses: 'actions/setup-node@v4' - with: - node-version: '22.11.0' - - name: 'install udev for usb-detection' - run: | - # WORKAROUND: Remove microsoft debian repo due to https://github.com/microsoft/linux-package-repositories/issues/130. Remove line below after it is resolved - sudo rm -f /etc/apt/sources.list.d/microsoft-prod.list - sudo apt-get update && sudo apt-get install libudev-dev - - name: 'cache yarn cache' - uses: actions/cache@v2 - with: - path: | - ${{ github.workspace }}/.yarn-cache - ${{ github.workspace }}/.npm-cache - key: js-${{ secrets.GH_CACHE_VERSION }}-${{ runner.os }}-yarn-${{ hashFiles('yarn.lock') }} - restore-keys: | - js-${{ secrets.GH_CACHE_VERSION }}-${{ runner.os }}-yarn- - - name: 'setup-js' - run: | - npm config set cache ./.npm-cache - yarn config set cache-folder ./.yarn-cache - make setup-js - - name: 'run PD unit tests' + - name: 'Checkout Repository' + uses: actions/checkout@v4 + - uses: ./.github/actions/js/setup + - name: 'run unit tests' run: make -C protocol-designer test-cov - name: 'Upload coverage report' - uses: codecov/codecov-action@v3 + uses: codecov/codecov-action@v5 with: - files: ./coverage/lcov.info flags: protocol-designer + token: ${{ secrets.CODECOV_TOKEN }} e2e-test: - name: 'pd e2e tests' - needs: ['js-unit-test'] - timeout-minutes: 30 - strategy: - matrix: - os: ['ubuntu-22.04'] - runs-on: '${{ matrix.os }}' - steps: - - uses: 'actions/checkout@v4' - with: - fetch-depth: 0 - # https://github.com/actions/checkout/issues/290 - - name: 'Fix actions/checkout odd handling of tags' - if: startsWith(github.ref, 'refs/tags') - run: | - git fetch -f origin ${{ github.ref }}:${{ github.ref }} - git checkout ${{ github.ref }} - - uses: 'actions/setup-node@v4' - with: - node-version: '22.11.0' - - name: 'install udev for usb-detection' - if: startsWith(matrix.os, 'ubuntu') - run: | - # WORKAROUND: Remove microsoft debian repo due to https://github.com/microsoft/linux-package-repositories/issues/130. Remove line below after it is resolved - sudo rm -f /etc/apt/sources.list.d/microsoft-prod.list - sudo apt-get update && sudo apt-get install libudev-dev - - name: 'cache yarn cache' - uses: actions/cache@v3 - with: - path: | - ${{ github.workspace }}/.yarn-cache - ${{ github.workspace }}/.npm-cache - key: js-${{ secrets.GH_CACHE_VERSION }}-${{ runner.os }}-yarn-${{ hashFiles('yarn.lock') }} - restore-keys: | - js-${{ secrets.GH_CACHE_VERSION }}-${{ runner.os }}-yarn- - - name: 'setup-js' - run: | - npm config set cache ./.npm-cache - yarn config set cache-folder ./.yarn-cache - make setup-js - - name: 'test-e2e' - run: make -C protocol-designer test-e2e + name: 'protocol designer e2e tests' + runs-on: 'ubuntu-24.04' + timeout-minutes: 20 + steps: + - name: 'Checkout Repository' + uses: actions/checkout@v4 + - uses: ./.github/actions/js/setup + - name: 'run test-e2e' + run: make -C protocol-designer test-e2e + build-pd: - name: 'build protocol designer artifact' - needs: ['js-unit-test'] - runs-on: 'ubuntu-22.04' + timeout-minutes: 20 + name: 'build protocol designer' + needs: ['unit-test', 'e2e-test'] + runs-on: 'ubuntu-24.04' if: github.event_name != 'pull_request' steps: - - uses: 'actions/checkout@v4' - with: - fetch-depth: 0 - # https://github.com/actions/checkout/issues/290 - - name: 'Fix actions/checkout odd handling of tags' - if: startsWith(github.ref, 'refs/tags') - run: | - git fetch -f origin ${{ github.ref }}:${{ github.ref }} - git checkout ${{ github.ref }} - - uses: 'actions/setup-node@v4' - with: - node-version: '22.11.0' - - name: 'install udev for usb-detection' - run: | - # WORKAROUND: Remove microsoft debian repo due to https://github.com/microsoft/linux-package-repositories/issues/130. Remove line below after it is resolved - sudo rm -f /etc/apt/sources.list.d/microsoft-prod.list - sudo apt-get update && sudo apt-get install libudev-dev - - name: 'cache yarn cache' - uses: actions/cache@v3 - with: - path: | - ${{ github.workspace }}/.yarn-cache - ${{ github.workspace }}/.npm-cache - key: js-${{ secrets.GH_CACHE_VERSION }}-${{ runner.os }}-yarn-${{ hashFiles('yarn.lock') }} - - name: 'setup-js' - run: | - npm config set cache ./.npm-cache - yarn config set cache-folder ./.yarn-cache - make setup-js + - uses: actions/checkout@v4 + - uses: ./.github/actions/js/setup - name: 'build PD' env: OT_PD_MIXPANEL_ID: ${{ secrets.OT_PD_MIXPANEL_ID }} @@ -168,40 +90,28 @@ jobs: with: name: 'pd-artifact' path: protocol-designer/dist + deploy-pd: - name: 'deploy PD artifact to S3' - runs-on: 'ubuntu-22.04' - needs: ['js-unit-test', 'build-pd'] + timeout-minutes: 10 + name: 'deploy protocol designer' + needs: ['build-pd'] + runs-on: 'ubuntu-24.04' if: github.event_name != 'pull_request' steps: - - uses: 'actions/checkout@v4' - # https://github.com/actions/checkout/issues/290 - - name: 'Fix actions/checkout odd handling of tags' - if: startsWith(github.ref, 'refs/tags') - run: | - git fetch -f origin ${{ github.ref }}:${{ github.ref }} - git checkout ${{ github.ref }} - - uses: 'actions/setup-node@v4' - with: - node-version: '22.11.0' - - name: 'install udev for usb-detection' - run: | - # WORKAROUND: Remove microsoft debian repo due to https://github.com/microsoft/linux-package-repositories/issues/130. Remove line below after it is resolved - sudo rm -f /etc/apt/sources.list.d/microsoft-prod.list - sudo apt-get update && sudo apt-get install libudev-dev - - name: 'set complex environment variables' - id: 'set-vars' - uses: actions/github-script@v6 - with: - script: | - const { buildComplexEnvVars } = require(`${process.env.GITHUB_WORKSPACE}/.github/workflows/utils.js`) - buildComplexEnvVars(core, context) + - name: 'Checkout Repository' + uses: actions/checkout@v4 + + - uses: ./.github/actions/git/resolve-tag + + - uses: ./.github/actions/environment/complex-variables + - name: 'download PD build' uses: 'actions/download-artifact@v4' with: name: pd-artifact path: ./dist - name: 'configure ot3 s3 deploy creds and deploy' + shell: bash env: AWS_ACCESS_KEY_ID: ${{ secrets.PD_S3_SANDBOX_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.PD_S3_SANDBOX_SECRET }} @@ -218,4 +128,3 @@ jobs: # invalidate both sandbox.opentrons.com and www.sandbox.opentrons.com cloudfront caches aws cloudfront create-invalidation --distribution-id ${{ secrets.PD_CLOUDFRONT_SANDBOX_DISTRIBUTION_ID }} --paths "/*" --profile deploy aws cloudfront create-invalidation --distribution-id ${{ secrets.PD_CLOUDFRONT_SANDBOX_WWW_DISTRIBUTION_ID }} --paths "/*" --profile deploy - shell: bash diff --git a/protocol-designer/Makefile b/protocol-designer/Makefile index dc201e472bc..e9ef4864241 100644 --- a/protocol-designer/Makefile +++ b/protocol-designer/Makefile @@ -8,10 +8,10 @@ PATH := $(shell cd .. && yarn bin):$(PATH) benchmark_output := $(shell node -e 'console.log(new Date());') -# These variables can be overriden when make is invoked to customize the +# These variables can be overridden when make is invoked to customize the # behavior of jest tests ?= -cov_opts ?= --coverage=true +cov_opts ?= --coverage --pool=threads test_opts ?= # standard targets @@ -60,9 +60,9 @@ serve: all # end to end tests .PHONY: test-e2e test-e2e: clean-downloads - concurrently --no-color --kill-others --success first --names "protocol-designer-server,protocol-designer-tests" \ + concurrently --kill-others --success first --names "protocol-designer-server,protocol-designer-tests" \ "$(MAKE) dev" \ - "wait-on http://localhost:5178/ && cypress run --browser chrome --headless --record false" + "wait-on http://localhost:5178/ && cypress run --browser chrome --headless --record false --quiet" .PHONY: test test: diff --git a/protocol-designer/vite.config.mts b/protocol-designer/vite.config.mts index ed0a649b9b7..cebdace5157 100644 --- a/protocol-designer/vite.config.mts +++ b/protocol-designer/vite.config.mts @@ -64,6 +64,9 @@ export default defineConfig( }, server: { port: 5178, + watch: { + ignored: ['**/cypress/downloads/**'], + } }, } } diff --git a/vitest.config.mts b/vitest.config.mts index 1412fdcee4f..0d008099ea1 100644 --- a/vitest.config.mts +++ b/vitest.config.mts @@ -17,7 +17,7 @@ export default mergeConfig( coverage: { exclude: ['**/node_modules/**', '**/dist/**', '**/__tests__/**'], provider: 'v8', - reporter: ['text', 'json', 'html'], + reporter: ['text', 'json', 'html', 'lcov'], }, }, resolve: { From 19a94a630dc67d205495750c44d2d56b9bf8fd39 Mon Sep 17 00:00:00 2001 From: Josh McVey Date: Tue, 4 Feb 2025 09:49:29 -0600 Subject: [PATCH 069/150] chore(release): internal release notes 2.4.0-alpha.0 (#17405) --- api/release-notes-internal.md | 4 ++-- app-shell/build/release-notes-internal.md | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/api/release-notes-internal.md b/api/release-notes-internal.md index 1186b510eb6..48579201e21 100644 --- a/api/release-notes-internal.md +++ b/api/release-notes-internal.md @@ -2,11 +2,11 @@ For more details about this release, please see the full [technical change log][ [technical change log]: https://github.com/Opentrons/opentrons/releases -## Internal Release 2.4.0-alpha.1 +## Internal Release 2.4.0-alpha.0 This internal release, pulled from the `edge` branch, contains features being developed for 8.4.0. It's for internal testing only. -### New Stuff In This Release (list in progress): +### New Stuff In This Release (list in progress) - Python API version bumped to 2.23 - Added liquid classes and new transfer functions diff --git a/app-shell/build/release-notes-internal.md b/app-shell/build/release-notes-internal.md index 565c5e1aa9b..c389f3a0ad7 100644 --- a/app-shell/build/release-notes-internal.md +++ b/app-shell/build/release-notes-internal.md @@ -1,6 +1,10 @@ For more details about this release, please see the full [technical changelog][]. [technical change log]: https://github.com/Opentrons/opentrons/releases +## Internal Release 2.4.0-alpha.0 + +This internal release, pulled from the `edge` branch, contains features being developed for 8.4.0. It's for internal testing only. + ## Internal Release 2.3.0-alpha.2 This internal release, pulled from the `edge` branch, contains features being developed for 8.3.0. It's for internal testing only. From d1cfe80765131f8eb05d080c2b03f80088de4df5 Mon Sep 17 00:00:00 2001 From: Seth Foster Date: Tue, 4 Feb 2025 14:05:24 -0500 Subject: [PATCH 070/150] feat(robot-server): handle new offset locations in /labwareOffsets (#17388) Adds the new format for labware offset locations from #17363 to the HTTP API `/labwareOffsets` endpoint. The endpoint now accepts and returns labware offset locations as these sequences. The filter API is for now unchanged, and still works properly to filter out or in offsets based on their core features or on their locations. The types are defined separately from the protocol engine because we'll be shortly adding a concept of a "general offset" to this API, and that is best modeled as another heterogenous union entry, which means the types will start to diverge. This comes along with a sql schema migration; the offset locations are normalized out into an offset table with a foreign key into the main offset table. All content from the offset table is migrated to the new one in the standard persistence directory migration api. ## Reviews - does the sql look good? - do the tests look appropriate? some have expanded - do the migrations look good? ## Testing - [x] put this on a machine that has offset data and make sure it migrates and comes up with the data preserved Closes EXEC-1105 --- api/src/opentrons/protocol_engine/__init__.py | 11 + .../labware_offset_standardization.py | 5 +- .../protocol_engine/types/__init__.py | 2 + .../types/labware_offset_location.py | 8 +- .../labware_offsets/_search_query_builder.py | 177 ++++++++ .../robot_server/labware_offsets/models.py | 89 +++- .../robot_server/labware_offsets/router.py | 48 +- .../robot_server/labware_offsets/store.py | 269 +++++++---- .../persistence/_migrations/v9_to_v10.py | 126 ++++++ .../persistence/file_and_directory_names.py | 2 +- .../persistence/persistence_directory.py | 5 +- .../persistence/tables/__init__.py | 4 +- .../persistence/tables/schema_10.py | 420 ++++++++++++++++++ .../http_api/test_labware_offsets.tavern.yaml | 92 ++-- .../tests/labware_offsets/test_store.py | 386 +++++++++++++--- robot-server/tests/persistence/test_tables.py | 167 ++++++- 16 files changed, 1590 insertions(+), 221 deletions(-) create mode 100644 robot-server/robot_server/labware_offsets/_search_query_builder.py create mode 100644 robot-server/robot_server/persistence/_migrations/v9_to_v10.py create mode 100644 robot-server/robot_server/persistence/tables/schema_10.py diff --git a/api/src/opentrons/protocol_engine/__init__.py b/api/src/opentrons/protocol_engine/__init__.py index 5e90c7235bf..84c80c1555e 100644 --- a/api/src/opentrons/protocol_engine/__init__.py +++ b/api/src/opentrons/protocol_engine/__init__.py @@ -30,6 +30,11 @@ LabwareOffsetCreate, LabwareOffsetVector, LegacyLabwareOffsetLocation, + LabwareOffsetLocationSequence, + OnLabwareOffsetLocationSequenceComponent, + OnModuleOffsetLocationSequenceComponent, + OnAddressableAreaOffsetLocationSequenceComponent, + LabwareOffsetLocationSequenceComponents, LabwareMovementStrategy, AddressableOffsetVector, DeckPoint, @@ -96,7 +101,13 @@ # public value interfaces and models "LabwareOffset", "LabwareOffsetCreate", + "LegacyLabwareOffsetCreate", + "LabwareOffsetLocationSequence", "LabwareOffsetVector", + "OnLabwareOffsetLocationSequenceComponent", + "OnModuleOffsetLocationSequenceComponent", + "OnAddressableAreaOffsetLocationSequenceComponent", + "LabwareOffsetLocationSequenceComponents", "LegacyLabwareOffsetCreate", "LegacyLabwareOffsetLocation", "LabwareMovementStrategy", diff --git a/api/src/opentrons/protocol_engine/labware_offset_standardization.py b/api/src/opentrons/protocol_engine/labware_offset_standardization.py index 836d40cb700..74626af5595 100644 --- a/api/src/opentrons/protocol_engine/labware_offset_standardization.py +++ b/api/src/opentrons/protocol_engine/labware_offset_standardization.py @@ -37,9 +37,10 @@ def standardize_labware_offset_create( ) -def _legacy_offset_location_to_offset_location_sequence( +def legacy_offset_location_to_offset_location_sequence( location: LegacyLabwareOffsetLocation, deck_definition: DeckDefinitionV5 ) -> LabwareOffsetLocationSequence: + """Convert a legacy location to a new-style sequence.""" sequence: LabwareOffsetLocationSequence = [] if location.definitionUri: sequence.append( @@ -165,7 +166,7 @@ def _locations_for_create( } ) return ( - _legacy_offset_location_to_offset_location_sequence( + legacy_offset_location_to_offset_location_sequence( normalized, deck_definition ), normalized, diff --git a/api/src/opentrons/protocol_engine/types/__init__.py b/api/src/opentrons/protocol_engine/types/__init__.py index fbaef870f3e..bf1f524a7a7 100644 --- a/api/src/opentrons/protocol_engine/types/__init__.py +++ b/api/src/opentrons/protocol_engine/types/__init__.py @@ -94,6 +94,7 @@ OnLabwareOffsetLocationSequenceComponent, OnModuleOffsetLocationSequenceComponent, OnAddressableAreaOffsetLocationSequenceComponent, + LabwareOffsetLocationSequenceComponents, ) from .labware_offset_vector import LabwareOffsetVector from .well_position import ( @@ -204,6 +205,7 @@ # Labware offset location "LegacyLabwareOffsetLocation", "LabwareOffsetLocationSequence", + "LabwareOffsetLocationSequenceComponents", "OnLabwareOffsetLocationSequenceComponent", "OnModuleOffsetLocationSequenceComponent", "OnAddressableAreaOffsetLocationSequenceComponent", diff --git a/api/src/opentrons/protocol_engine/types/labware_offset_location.py b/api/src/opentrons/protocol_engine/types/labware_offset_location.py index 2b992a4da01..2a4ebe9ebe6 100644 --- a/api/src/opentrons/protocol_engine/types/labware_offset_location.py +++ b/api/src/opentrons/protocol_engine/types/labware_offset_location.py @@ -3,7 +3,7 @@ This is its own module to fix circular imports. """ -from typing import Optional, Literal +from typing import Optional, Literal, Annotated from pydantic import BaseModel, Field @@ -48,12 +48,16 @@ class OnAddressableAreaOffsetLocationSequenceComponent(BaseModel): ) -LabwareOffsetLocationSequenceComponents = ( +LabwareOffsetLocationSequenceComponentsUnion = ( OnLabwareOffsetLocationSequenceComponent | OnModuleOffsetLocationSequenceComponent | OnAddressableAreaOffsetLocationSequenceComponent ) +LabwareOffsetLocationSequenceComponents = Annotated[ + LabwareOffsetLocationSequenceComponentsUnion, Field(discriminator="kind") +] + LabwareOffsetLocationSequence = list[LabwareOffsetLocationSequenceComponents] diff --git a/robot-server/robot_server/labware_offsets/_search_query_builder.py b/robot-server/robot_server/labware_offsets/_search_query_builder.py new file mode 100644 index 00000000000..d6630f59169 --- /dev/null +++ b/robot-server/robot_server/labware_offsets/_search_query_builder.py @@ -0,0 +1,177 @@ +"""Helper to build a search query.""" + +from __future__ import annotations +from typing import Final, TYPE_CHECKING + +import sqlalchemy + +from opentrons.protocol_engine import ModuleModel + +from robot_server.persistence.tables import ( + labware_offset_table, + labware_offset_location_sequence_components_table, +) +from .models import DoNotFilterType, DO_NOT_FILTER + +if TYPE_CHECKING: + from typing_extensions import Self + + +class SearchQueryBuilder: + """Helper class to build a search query. + + This object is stateful, and should be kept around just long enough to have the parameters + of a single search injected. + """ + + def __init__(self) -> None: + """Build the object.""" + super().__init__() + self._filter_original: Final = sqlalchemy.select( + labware_offset_table.c.row_id, + labware_offset_table.c.offset_id, + labware_offset_table.c.definition_uri, + labware_offset_table.c.vector_x, + labware_offset_table.c.vector_y, + labware_offset_table.c.vector_z, + labware_offset_table.c.created_at, + labware_offset_table.c.active, + labware_offset_location_sequence_components_table.c.sequence_ordinal, + labware_offset_location_sequence_components_table.c.component_kind, + labware_offset_location_sequence_components_table.c.primary_component_value, + ).select_from( + sqlalchemy.join( + labware_offset_table, + labware_offset_location_sequence_components_table, + labware_offset_table.c.row_id + == labware_offset_location_sequence_components_table.c.offset_id, + ) + ) + self._offset_location_alias: Final = ( + labware_offset_location_sequence_components_table.alias() + ) + self._current_base_filter_statement = self._filter_original + self._current_positive_location_filter: ( + sqlalchemy.sql.selectable.Exists | None + ) = None + self._current_negative_filter_subqueries: list[ + sqlalchemy.sql.selectable.Exists + ] = [] + + def _positive_query(self) -> sqlalchemy.sql.selectable.Exists: + if self._current_positive_location_filter is not None: + return self._current_positive_location_filter + return sqlalchemy.exists().where( + self._offset_location_alias.c.offset_id + == labware_offset_location_sequence_components_table.c.offset_id + ) + + def build_query(self) -> sqlalchemy.sql.selectable.Selectable: + """Render the query into a sqlalchemy object suitable for passing to the database.""" + statement = self._current_base_filter_statement + if self._current_positive_location_filter is not None: + statement = statement.where(self._current_positive_location_filter) + for subq in self._current_negative_filter_subqueries: + statement = statement.where(sqlalchemy.not_(subq)) + statement = statement.order_by(labware_offset_table.c.row_id).order_by( + labware_offset_location_sequence_components_table.c.sequence_ordinal + ) + return statement + + def do_active_filter(self, active: bool) -> Self: + """Filter to only rows that are active (active=True) or inactive (active=False).""" + self._current_base_filter_statement = self._current_base_filter_statement.where( + labware_offset_table.c.active == active + ) + return self + + def do_id_filter(self, id_filter: str | DoNotFilterType) -> Self: + """Filter to rows with only the given offset ID.""" + if id_filter is DO_NOT_FILTER: + return self + + self._current_base_filter_statement = self._current_base_filter_statement.where( + labware_offset_table.c.offset_id == id_filter + ) + return self + + def do_definition_uri_filter( + self, definition_uri_filter: str | DoNotFilterType + ) -> Self: + """Filter to rows of an offset that apply to a definition URI.""" + if definition_uri_filter is DO_NOT_FILTER: + return self + self._current_base_filter_statement = self._current_base_filter_statement.where( + labware_offset_table.c.definition_uri == definition_uri_filter + ) + return self + + def do_on_addressable_area_filter( + self, + addressable_area_filter: str | DoNotFilterType, + ) -> Self: + """Filter to rows of an offset that applies to the given addressable area.""" + if addressable_area_filter is DO_NOT_FILTER: + return self + self._current_positive_location_filter = ( + self._positive_query() + .where(self._offset_location_alias.c.component_kind == "onAddressableArea") + .where( + self._offset_location_alias.c.primary_component_value + == addressable_area_filter + ) + ) + return self + + def do_on_labware_filter( + self, labware_uri_filter: str | DoNotFilterType | None + ) -> Self: + """Filter to the rows of an offset located on the given labware (or no labware).""" + if labware_uri_filter is DO_NOT_FILTER: + return self + if labware_uri_filter is None: + self._current_negative_filter_subqueries.append( + sqlalchemy.exists() + .where( + self._offset_location_alias.c.offset_id + == labware_offset_location_sequence_components_table.c.offset_id + ) + .where(self._offset_location_alias.c.component_kind == "onLabware") + ) + return self + self._current_positive_location_filter = ( + self._positive_query() + .where(self._offset_location_alias.c.component_kind == "onLabware") + .where( + self._offset_location_alias.c.primary_component_value + == labware_uri_filter + ) + ) + return self + + def do_on_module_filter( + self, + module_model_filter: ModuleModel | DoNotFilterType | None, + ) -> Self: + """Filter to the rows of an offset located on the given module (or no module).""" + if module_model_filter is DO_NOT_FILTER: + return self + if module_model_filter is None: + self._current_negative_filter_subqueries.append( + sqlalchemy.exists() + .where( + self._offset_location_alias.c.offset_id + == labware_offset_location_sequence_components_table.c.offset_id + ) + .where(self._offset_location_alias.c.component_kind == "onModule") + ) + return self + self._current_positive_location_filter = ( + self._positive_query() + .where(self._offset_location_alias.c.component_kind == "onModule") + .where( + self._offset_location_alias.c.primary_component_value + == module_model_filter.value + ) + ) + return self diff --git a/robot-server/robot_server/labware_offsets/models.py b/robot-server/robot_server/labware_offsets/models.py index fcc3d2f2200..7b3f523fccd 100644 --- a/robot-server/robot_server/labware_offsets/models.py +++ b/robot-server/robot_server/labware_offsets/models.py @@ -1,11 +1,98 @@ """Request/response models for the `/labwareOffsets` endpoints.""" +from datetime import datetime +import enum +from typing import Literal, Annotated, Final, TypeAlias, Sequence -from typing import Literal +from pydantic import BaseModel, Field + +from opentrons.protocol_engine import ( + LabwareOffsetVector, +) +from opentrons.protocol_engine.types.labware_offset_location import ( + LabwareOffsetLocationSequenceComponentsUnion, +) from robot_server.errors.error_responses import ErrorDetails +class _DoNotFilter(enum.Enum): + DO_NOT_FILTER = enum.auto() + + +DO_NOT_FILTER: Final = _DoNotFilter.DO_NOT_FILTER +"""A sentinel value for when a filter should not be applied. + +This is different from filtering on `None`, which returns only entries where the +value is equal to `None`. +""" + + +DoNotFilterType: TypeAlias = Literal[_DoNotFilter.DO_NOT_FILTER] +"""The type of `DO_NOT_FILTER`, as `NoneType` is to `None`. + +Unfortunately, mypy doesn't let us write `Literal[DO_NOT_FILTER]`. Use this instead. +""" + + +class UnknownLabwareOffsetLocationSequenceComponent(BaseModel): + """A labware offset location sequence component from the future.""" + + kind: Literal["unknown"] = "unknown" + storedKind: str + primaryValue: str + + +# This is redefined here so we can add stuff to it easily +StoredLabwareOffsetLocationSequenceComponents = Annotated[ + LabwareOffsetLocationSequenceComponentsUnion, Field(discriminator="kind") +] + + +ReturnedLabwareOffsetLocationSequenceComponents = Annotated[ + LabwareOffsetLocationSequenceComponentsUnion + | UnknownLabwareOffsetLocationSequenceComponent, + Field(discriminator="kind"), +] + + +class StoredLabwareOffsetCreate(BaseModel): + """Create an offset for storage.""" + + definitionUri: str = Field(..., description="The URI for the labware's definition.") + + locationSequence: Sequence[StoredLabwareOffsetLocationSequenceComponents] = Field( + ..., + description="Where the labware is located on the robot. Can represent all locations, but may not be present for older runs.", + min_length=1, + ) + vector: LabwareOffsetVector = Field( + ..., + description="The offset applied to matching labware.", + ) + + +class StoredLabwareOffset(BaseModel): + """An offset that the robot adds to a pipette's position when it moves to labware.""" + + # This is a separate thing from the model defined in protocol engine because as a new API it does + # not have to handle legacy locations. There is probably a better way to do this than to copy the model + # contents, but I'm not sure what it is. + id: str = Field(..., description="Unique labware offset record identifier.") + createdAt: datetime = Field(..., description="When this labware offset was added.") + definitionUri: str = Field(..., description="The URI for the labware's definition.") + + locationSequence: Sequence[ReturnedLabwareOffsetLocationSequenceComponents] = Field( + ..., + description="Where the labware is located on the robot. Can represent all locations, but may not be present for older runs.", + min_length=1, + ) + vector: LabwareOffsetVector = Field( + ..., + description="The offset applied to matching labware.", + ) + + class LabwareOffsetNotFound(ErrorDetails): """An error returned when a requested labware offset does not exist.""" diff --git a/robot-server/robot_server/labware_offsets/router.py b/robot-server/robot_server/labware_offsets/router.py index 3f0ada1d46e..4ebf532d657 100644 --- a/robot-server/robot_server/labware_offsets/router.py +++ b/robot-server/robot_server/labware_offsets/router.py @@ -9,12 +9,7 @@ from pydantic.json_schema import SkipJsonSchema from server_utils.fastapi_utils.light_router import LightRouter -from opentrons.protocol_engine import ( - LabwareOffset, - LegacyLabwareOffsetCreate, - ModuleModel, -) -from opentrons.types import DeckSlotName +from opentrons.protocol_engine import ModuleModel from robot_server.labware_offsets.models import LabwareOffsetNotFound from robot_server.service.dependencies import get_current_time, get_unique_id @@ -28,12 +23,17 @@ ) from .store import ( - DO_NOT_FILTER, - DoNotFilterType, LabwareOffsetNotFoundError, LabwareOffsetStore, + IncomingStoredLabwareOffset, ) from .fastapi_dependencies import get_labware_offset_store +from .models import ( + StoredLabwareOffset, + StoredLabwareOffsetCreate, + DO_NOT_FILTER, + DoNotFilterType, +) router = LightRouter() @@ -58,18 +58,26 @@ async def post_labware_offset( # noqa: D103 store: Annotated[LabwareOffsetStore, fastapi.Depends(get_labware_offset_store)], new_offset_id: Annotated[str, fastapi.Depends(get_unique_id)], new_offset_created_at: Annotated[datetime, fastapi.Depends(get_current_time)], - request_body: Annotated[RequestModel[LegacyLabwareOffsetCreate], fastapi.Body()], -) -> PydanticResponse[SimpleBody[LabwareOffset]]: - new_offset = LabwareOffset.model_construct( + request_body: Annotated[RequestModel[StoredLabwareOffsetCreate], fastapi.Body()], +) -> PydanticResponse[SimpleBody[StoredLabwareOffset]]: + new_offset = IncomingStoredLabwareOffset( id=new_offset_id, createdAt=new_offset_created_at, definitionUri=request_body.data.definitionUri, - location=request_body.data.location, + locationSequence=request_body.data.locationSequence, vector=request_body.data.vector, ) store.add(new_offset) return await PydanticResponse.create( - content=SimpleBody.model_construct(data=new_offset), + content=SimpleBody.model_construct( + data=StoredLabwareOffset( + id=new_offset_id, + createdAt=new_offset_created_at, + definitionUri=request_body.data.definitionUri, + locationSequence=request_body.data.locationSequence, + vector=request_body.data.vector, + ) + ), status_code=201, ) @@ -101,8 +109,8 @@ async def get_labware_offsets( # noqa: D103 ), ), ] = DO_NOT_FILTER, - location_slot_name: Annotated[ - Json[DeckSlotName] | SkipJsonSchema[DoNotFilterType], + location_addressable_area_name: Annotated[ + Json[str] | SkipJsonSchema[DoNotFilterType], fastapi.Query( alias="locationSlotName", description="Filter for exact matches on the `location.slotName` field.", @@ -141,7 +149,7 @@ async def get_labware_offsets( # noqa: D103 alias="pageLength", description="The maximum number of entries to return." ), ] = "unlimited", -) -> PydanticResponse[SimpleMultiBody[LabwareOffset]]: +) -> PydanticResponse[SimpleMultiBody[StoredLabwareOffset]]: if cursor not in (0, None) or page_length != "unlimited": # todo(mm, 2024-12-06): Support this when LabwareOffsetStore supports it. raise NotImplementedError( @@ -151,7 +159,7 @@ async def get_labware_offsets( # noqa: D103 result_data = store.search( id_filter=id, definition_uri_filter=definition_uri, - location_slot_name_filter=location_slot_name, + location_addressable_area_filter=location_addressable_area_name, location_definition_uri_filter=location_definition_uri, location_module_model_filter=location_module_model, ) @@ -163,7 +171,7 @@ async def get_labware_offsets( # noqa: D103 ) return await PydanticResponse.create( - SimpleMultiBody[LabwareOffset].model_construct( + SimpleMultiBody[StoredLabwareOffset].model_construct( data=result_data, meta=meta, ) @@ -183,7 +191,7 @@ async def delete_labware_offset( # noqa: D103 str, fastapi.Path(description="The `id` field of the offset to delete."), ], -) -> PydanticResponse[SimpleBody[LabwareOffset]]: +) -> PydanticResponse[SimpleBody[StoredLabwareOffset]]: try: deleted_offset = store.delete(offset_id=id) except LabwareOffsetNotFoundError as e: @@ -201,7 +209,7 @@ async def delete_labware_offset( # noqa: D103 include_in_schema=False, # todo(mm, 2025-01-08): Include for v8.4.0. ) async def delete_all_labware_offsets( # noqa: D103 - store: Annotated[LabwareOffsetStore, fastapi.Depends(get_labware_offset_store)] + store: Annotated[LabwareOffsetStore, fastapi.Depends(get_labware_offset_store)], ) -> PydanticResponse[SimpleEmptyBody]: store.delete_all() return await PydanticResponse.create(SimpleEmptyBody.model_construct()) diff --git a/robot-server/robot_server/labware_offsets/store.py b/robot-server/robot_server/labware_offsets/store.py index dbeccc728a1..e17c1a30686 100644 --- a/robot-server/robot_server/labware_offsets/store.py +++ b/robot-server/robot_server/labware_offsets/store.py @@ -1,43 +1,52 @@ # noqa: D100 -import enum -from typing import Final, Literal, TypeAlias +from datetime import datetime +from dataclasses import dataclass +from typing import Iterator, Sequence +from typing_extensions import assert_never from opentrons.protocol_engine.types import ( - LabwareOffset, - LegacyLabwareOffsetLocation, LabwareOffsetVector, ModuleModel, + OnAddressableAreaOffsetLocationSequenceComponent, + OnModuleOffsetLocationSequenceComponent, + OnLabwareOffsetLocationSequenceComponent, ) -from opentrons.types import DeckSlotName -from robot_server.persistence.tables import labware_offset_table +from robot_server.persistence.tables import ( + labware_offset_table, + labware_offset_location_sequence_components_table, +) +from .models import ( + StoredLabwareOffset, + DoNotFilterType, + DO_NOT_FILTER, + StoredLabwareOffsetLocationSequenceComponents, + ReturnedLabwareOffsetLocationSequenceComponents, + UnknownLabwareOffsetLocationSequenceComponent, +) import sqlalchemy import sqlalchemy.exc +from ._search_query_builder import SearchQueryBuilder -class _DoNotFilter(enum.Enum): - DO_NOT_FILTER = enum.auto() - - -DO_NOT_FILTER: Final = _DoNotFilter.DO_NOT_FILTER -"""A sentinel value for when a filter should not be applied. +ReturnedLabwareOffsetLocationSequence = Sequence[ + ReturnedLabwareOffsetLocationSequenceComponents +] -This is different from filtering on `None`, which returns only entries where the -value is equal to `None`. -""" +@dataclass +class IncomingStoredLabwareOffset: + """Internal class for representing valid incoming offsets.""" -DoNotFilterType: TypeAlias = Literal[_DoNotFilter.DO_NOT_FILTER] -"""The type of `DO_NOT_FILTER`, as `NoneType` is to `None`. + id: str + createdAt: datetime + definitionUri: str + locationSequence: Sequence[StoredLabwareOffsetLocationSequenceComponents] + vector: LabwareOffsetVector -Unfortunately, mypy doesn't let us write `Literal[DO_NOT_FILTER]`. Use this instead. -""" - -# todo(mm, 2024-12-06): Convert to be SQL-based and persistent instead of in-memory. -# https://opentrons.atlassian.net/browse/EXEC-1015 class LabwareOffsetStore: """A persistent store for labware offsets, to support the `/labwareOffsets` endpoints.""" @@ -50,78 +59,74 @@ def __init__(self, sql_engine: sqlalchemy.engine.Engine) -> None: """ self._sql_engine = sql_engine - def add(self, offset: LabwareOffset) -> None: + def add( + self, + offset: IncomingStoredLabwareOffset, + ) -> None: """Store a new labware offset.""" with self._sql_engine.begin() as transaction: + offset_row_id = transaction.execute( + sqlalchemy.insert(labware_offset_table).values( + _pydantic_to_sql_offset(offset) + ) + ).inserted_primary_key.row_id transaction.execute( - sqlalchemy.insert(labware_offset_table).values(_pydantic_to_sql(offset)) + sqlalchemy.insert( + labware_offset_location_sequence_components_table + ).values( + list( + _pydantic_to_sql_location_sequence_iterator( + offset, offset_row_id + ) + ) + ) ) def search( self, id_filter: str | DoNotFilterType = DO_NOT_FILTER, definition_uri_filter: str | DoNotFilterType = DO_NOT_FILTER, - location_slot_name_filter: DeckSlotName | DoNotFilterType = DO_NOT_FILTER, - location_module_model_filter: ModuleModel - | None - | DoNotFilterType = DO_NOT_FILTER, + location_addressable_area_filter: str | DoNotFilterType = DO_NOT_FILTER, + location_module_model_filter: ( + ModuleModel | None | DoNotFilterType + ) = DO_NOT_FILTER, location_definition_uri_filter: str | None | DoNotFilterType = DO_NOT_FILTER, # todo(mm, 2024-12-06): Support pagination (cursor & pageLength query params). # The logic for that is currently duplicated across several places in # robot-server and api. We should try to clean that up, or at least avoid # making it worse. - ) -> list[LabwareOffset]: + ) -> list[StoredLabwareOffset]: """Return all matching labware offsets in order from oldest-added to newest.""" - statement = ( - sqlalchemy.select(labware_offset_table) - .order_by(labware_offset_table.c.row_id) - .where(labware_offset_table.c.active == True) # noqa: E712 + builder = ( + SearchQueryBuilder() + .do_active_filter(True) + .do_id_filter(id_filter) + .do_definition_uri_filter(definition_uri_filter) + .do_on_addressable_area_filter(location_addressable_area_filter) + .do_on_module_filter(location_module_model_filter) + .do_on_labware_filter(location_definition_uri_filter) ) - - if id_filter is not DO_NOT_FILTER: - statement = statement.where(labware_offset_table.c.offset_id == id_filter) - if definition_uri_filter is not DO_NOT_FILTER: - statement = statement.where( - labware_offset_table.c.definition_uri == definition_uri_filter - ) - if location_slot_name_filter is not DO_NOT_FILTER: - statement = statement.where( - labware_offset_table.c.location_slot_name - == location_slot_name_filter.value - ) - if location_module_model_filter is not DO_NOT_FILTER: - location_module_model_filter_value = ( - location_module_model_filter.value - if location_module_model_filter is not None - else None - ) - statement = statement.where( - labware_offset_table.c.location_module_model - == location_module_model_filter_value - ) - if location_definition_uri_filter is not DO_NOT_FILTER: - statement = statement.where( - labware_offset_table.c.location_definition_uri - == location_definition_uri_filter - ) + query = builder.build_query() with self._sql_engine.begin() as transaction: - result = transaction.execute(statement).all() + result = transaction.execute(query).all() - return [_sql_to_pydantic(row) for row in result] + if len(result) == 0: + return [] + return list(_collate_sql_to_pydantic(result)) - def delete(self, offset_id: str) -> LabwareOffset: + def delete(self, offset_id: str) -> StoredLabwareOffset: """Delete a labware offset by its ID. Return what was just deleted.""" + builder = SearchQueryBuilder().do_id_filter(offset_id) + query = builder.build_query() with self._sql_engine.begin() as transaction: try: - row_to_delete = transaction.execute( - sqlalchemy.select(labware_offset_table).where( - labware_offset_table.c.offset_id == offset_id - ) - ).one() + offset_rows = transaction.execute(query).all() except sqlalchemy.exc.NoResultFound: raise LabwareOffsetNotFoundError(bad_offset_id=offset_id) from None - if not row_to_delete.active: + if len(offset_rows) == 0: + raise LabwareOffsetNotFoundError(bad_offset_id=offset_id) + if not offset_rows[0].active: # Already soft-deleted. raise LabwareOffsetNotFoundError(bad_offset_id=offset_id) @@ -131,7 +136,7 @@ def delete(self, offset_id: str) -> LabwareOffset: .values(active=False) ) - return _sql_to_pydantic(row_to_delete) + return next(_collate_sql_to_pydantic(offset_rows)) def delete_all(self) -> None: """Delete all labware offsets.""" @@ -149,36 +154,120 @@ def __init__(self, bad_offset_id: str) -> None: self.bad_offset_id = bad_offset_id -def _sql_to_pydantic(row: sqlalchemy.engine.Row) -> LabwareOffset: - return LabwareOffset( - id=row.offset_id, - createdAt=row.created_at, - definitionUri=row.definition_uri, - location=LegacyLabwareOffsetLocation( - slotName=DeckSlotName(row.location_slot_name), - moduleModel=row.location_module_model, - definitionUri=row.location_definition_uri, - ), - vector=LabwareOffsetVector( - x=row.vector_x, - y=row.vector_y, - z=row.vector_z, +def _sql_sequence_component_to_pydantic_sequence_component( + component_row: sqlalchemy.engine.Row, +) -> ReturnedLabwareOffsetLocationSequenceComponents: + if component_row.component_kind == "onLabware": + return OnLabwareOffsetLocationSequenceComponent( + labwareUri=component_row.primary_component_value + ) + elif component_row.component_kind == "onModule": + return OnModuleOffsetLocationSequenceComponent( + moduleModel=ModuleModel(component_row.primary_component_value) + ) + elif component_row.component_kind == "onAddressableArea": + return OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName=component_row.primary_component_value + ) + else: + return UnknownLabwareOffsetLocationSequenceComponent( + storedKind=component_row.component_kind, + primaryValue=component_row.primary_component_value, + ) + + +def _collate_sql_locations( + first_row: sqlalchemy.engine.Row, rest_rows: Iterator[sqlalchemy.engine.Row] +) -> tuple[ + list[ReturnedLabwareOffsetLocationSequenceComponents], sqlalchemy.engine.Row | None +]: + offset_id = first_row.offset_id + location_sequence: list[ReturnedLabwareOffsetLocationSequenceComponents] = [ + _sql_sequence_component_to_pydantic_sequence_component(first_row) + ] + while True: + try: + row = next(rest_rows) + except StopIteration: + return location_sequence, None + if row.offset_id != offset_id: + return location_sequence, row + location_sequence.append( + _sql_sequence_component_to_pydantic_sequence_component(row) + ) + + +def _sql_to_pydantic( + first_row: sqlalchemy.engine.Row, rest_rows: Iterator[sqlalchemy.engine.Row] +) -> tuple[StoredLabwareOffset, sqlalchemy.engine.Row | None]: + location_sequence, next_row = _collate_sql_locations(first_row, rest_rows) + return ( + StoredLabwareOffset( + id=first_row.offset_id, + createdAt=first_row.created_at, + definitionUri=first_row.definition_uri, + locationSequence=location_sequence, + vector=LabwareOffsetVector( + x=first_row.vector_x, + y=first_row.vector_y, + z=first_row.vector_z, + ), ), + next_row, ) -def _pydantic_to_sql(labware_offset: LabwareOffset) -> dict[str, object]: +def _collate_sql_to_pydantic( + query_results: list[sqlalchemy.engine.Row], +) -> Iterator[StoredLabwareOffset]: + row_iter = iter(query_results) + row: sqlalchemy.engine.Row | None = next(row_iter) + while row: + result, row = _sql_to_pydantic(row, row_iter) + yield result + + +def _pydantic_to_sql_offset( + labware_offset: IncomingStoredLabwareOffset, +) -> dict[str, object]: return dict( offset_id=labware_offset.id, definition_uri=labware_offset.definitionUri, - location_slot_name=labware_offset.location.slotName.value, - location_module_model=labware_offset.location.moduleModel.value - if labware_offset.location.moduleModel is not None - else None, - location_definition_uri=labware_offset.location.definitionUri, vector_x=labware_offset.vector.x, vector_y=labware_offset.vector.y, vector_z=labware_offset.vector.z, created_at=labware_offset.createdAt, active=True, ) + + +def _pydantic_to_sql_location_sequence_iterator( + labware_offset: IncomingStoredLabwareOffset, offset_row_id: int +) -> Iterator[dict[str, object]]: + for index, component in enumerate(labware_offset.locationSequence): + if isinstance(component, OnLabwareOffsetLocationSequenceComponent): + yield dict( + offset_id=offset_row_id, + sequence_ordinal=index, + component_kind=component.kind, + primary_component_value=component.labwareUri, + component_value_json=component.model_dump_json(), + ) + elif isinstance(component, OnModuleOffsetLocationSequenceComponent): + yield dict( + offset_id=offset_row_id, + sequence_ordinal=index, + component_kind=component.kind, + primary_component_value=component.moduleModel.value, + component_value_json=component.model_dump_json(), + ) + elif isinstance(component, OnAddressableAreaOffsetLocationSequenceComponent): + yield dict( + offset_id=offset_row_id, + sequence_ordinal=index, + component_kind=component.kind, + primary_component_value=component.addressableAreaName, + component_value_json=component.model_dump_json(), + ) + else: + assert_never(component) diff --git a/robot-server/robot_server/persistence/_migrations/v9_to_v10.py b/robot-server/robot_server/persistence/_migrations/v9_to_v10.py new file mode 100644 index 00000000000..e76ea7217b1 --- /dev/null +++ b/robot-server/robot_server/persistence/_migrations/v9_to_v10.py @@ -0,0 +1,126 @@ +"""Migrate the persistence directory from schema 9 to schema 10. + +Summary of changes from schema 9: + +- Adds a new `labware_offset_sequence_components` table. +""" + +from pathlib import Path + +import sqlalchemy + +from opentrons_shared_data.deck.types import DeckDefinitionV5 +from opentrons_shared_data.deck import load as load_deck + +from opentrons.types import DeckSlotName +from opentrons.protocols.api_support.deck_type import ( + guess_from_global_config as guess_deck_type_from_global_config, +) +from opentrons.protocol_engine import LegacyLabwareOffsetLocation, DeckType, ModuleModel +from opentrons.protocol_engine.labware_offset_standardization import ( + legacy_offset_location_to_offset_location_sequence, +) + +from robot_server.persistence.database import sql_engine_ctx +from robot_server.persistence.file_and_directory_names import DB_FILE +from robot_server.persistence.tables import schema_10, schema_9 + +from ._util import copy_contents +from .._folder_migrator import Migration + + +class Migration9to10(Migration): # noqa: D101 + def migrate(self, source_dir: Path, dest_dir: Path) -> None: + """Migrate the persistence directory from schema 9 to 10.""" + copy_contents(source_dir=source_dir, dest_dir=dest_dir) + + # First we create the new version of our labware offsets table and sequence table + with sql_engine_ctx( + dest_dir / DB_FILE + ) as engine, engine.begin() as transaction: + schema_10.labware_offset_table.create(transaction) + schema_10.labware_offset_location_sequence_components_table.create( + transaction + ) + # Then we upmigrate the data to the new tables + _upmigrate_stored_offsets(transaction) + # Then, we drop the table with we don't care about anymore + schema_9.labware_offset_table.drop(transaction) + + +def _upmigrate_stored_offsets(connection: sqlalchemy.engine.Connection) -> None: + # grab the deck def. middlewares aren't up yet so we can't use the nice version + deck_definition = load_deck( + DeckType(guess_deck_type_from_global_config()), version=5 + ) + + offsets = connection.execute(sqlalchemy.select(schema_9.labware_offset_table)) + + for offset in offsets: + new_row = connection.execute( + sqlalchemy.insert(schema_10.labware_offset_table).values( + _v9_offset_to_v10_offset(offset) + ) + ).inserted_primary_key.row_id + connection.execute( + sqlalchemy.insert( + schema_10.labware_offset_location_sequence_components_table + ).values( + _v9_offset_to_v10_offset_locations(offset, new_row, deck_definition) + ) + ) + + +def _v9_offset_to_v10_offset(v9_offset: sqlalchemy.engine.Row) -> dict[str, object]: + return dict( + offset_id=v9_offset.offset_id, + definition_uri=v9_offset.definition_uri, + vector_x=v9_offset.vector_x, + vector_y=v9_offset.vector_y, + vector_z=v9_offset.vector_z, + created_at=v9_offset.created_at, + active=v9_offset.active, + ) + + +def _v9_offset_to_v10_offset_locations( + v9_offset: sqlalchemy.engine.Row, v10_id: int, deck_definition: DeckDefinitionV5 +) -> list[dict[str, object]]: + location_sequence = legacy_offset_location_to_offset_location_sequence( + LegacyLabwareOffsetLocation( + slotName=DeckSlotName(v9_offset.location_slot_name), + moduleModel=( + ModuleModel(v9_offset.location_module_model) + if v9_offset.location_module_model is not None + else None + ), + definitionUri=v9_offset.location_definition_uri, + ), + deck_definition, + ) + values: list[dict[str, object]] = [] + for index, sequence_component in enumerate(location_sequence): + primary_component_value = "" + component_value_json = "" + if sequence_component.kind == "onLabware": + primary_component_value = sequence_component.labwareUri + component_value_json = sequence_component.model_dump_json() + elif sequence_component.kind == "onModule": + primary_component_value = sequence_component.moduleModel.value + component_value_json = sequence_component.model_dump_json() + elif sequence_component.kind == "onAddressableArea": + primary_component_value = sequence_component.addressableAreaName + component_value_json = sequence_component.model_dump_json() + else: + # This should never happen since we're exhaustively checking kinds here + continue + values.append( + dict( + offset_id=v10_id, + sequence_ordinal=index, + component_kind=sequence_component.kind, + primary_component_value=primary_component_value, + component_value_json=component_value_json, + ) + ) + return values diff --git a/robot-server/robot_server/persistence/file_and_directory_names.py b/robot-server/robot_server/persistence/file_and_directory_names.py index 1d191a0f311..11613dab801 100644 --- a/robot-server/robot_server/persistence/file_and_directory_names.py +++ b/robot-server/robot_server/persistence/file_and_directory_names.py @@ -8,7 +8,7 @@ from typing import Final -LATEST_VERSION_DIRECTORY: Final = "9" +LATEST_VERSION_DIRECTORY: Final = "10" DECK_CONFIGURATION_FILE: Final = "deck_configuration.json" PROTOCOLS_DIRECTORY: Final = "protocols" diff --git a/robot-server/robot_server/persistence/persistence_directory.py b/robot-server/robot_server/persistence/persistence_directory.py index e5a86b31af2..4df4a111e1c 100644 --- a/robot-server/robot_server/persistence/persistence_directory.py +++ b/robot-server/robot_server/persistence/persistence_directory.py @@ -1,6 +1,5 @@ """Create or reset the server's persistence directory.""" - from pathlib import Path from logging import getLogger from shutil import rmtree @@ -19,6 +18,7 @@ v6_to_v7, v7_to_v8, v8_to_v9, + v9_to_v10, ) from .file_and_directory_names import LATEST_VERSION_DIRECTORY @@ -69,7 +69,8 @@ def make_migration_orchestrator(prepared_root: Path) -> MigrationOrchestrator: # internal robots. v6_to_v7.Migration6to7(subdirectory="7.1"), v7_to_v8.Migration7to8(subdirectory="8"), - v8_to_v9.Migration8to9(subdirectory=LATEST_VERSION_DIRECTORY), + v8_to_v9.Migration8to9(subdirectory="9"), + v9_to_v10.Migration9to10(subdirectory=LATEST_VERSION_DIRECTORY), ], temp_file_prefix="temp-", ) diff --git a/robot-server/robot_server/persistence/tables/__init__.py b/robot-server/robot_server/persistence/tables/__init__.py index 3c20c3f8a93..42ed01005d6 100644 --- a/robot-server/robot_server/persistence/tables/__init__.py +++ b/robot-server/robot_server/persistence/tables/__init__.py @@ -1,7 +1,7 @@ """SQL database schemas.""" # Re-export the latest schema. -from .schema_9 import ( +from .schema_10 import ( metadata, protocol_table, analysis_table, @@ -14,6 +14,7 @@ data_files_table, boolean_setting_table, labware_offset_table, + labware_offset_location_sequence_components_table, PrimitiveParamSQLEnum, ProtocolKindSQLEnum, BooleanSettingKey, @@ -35,6 +36,7 @@ "data_files_table", "boolean_setting_table", "labware_offset_table", + "labware_offset_location_sequence_components_table", "PrimitiveParamSQLEnum", "ProtocolKindSQLEnum", "BooleanSettingKey", diff --git a/robot-server/robot_server/persistence/tables/schema_10.py b/robot-server/robot_server/persistence/tables/schema_10.py new file mode 100644 index 00000000000..b403f2feeb1 --- /dev/null +++ b/robot-server/robot_server/persistence/tables/schema_10.py @@ -0,0 +1,420 @@ +"""v10 of our SQLite schema.""" + +import enum +import sqlalchemy + +from robot_server.persistence._utc_datetime import UTCDateTime + + +metadata = sqlalchemy.MetaData() + + +class PrimitiveParamSQLEnum(enum.Enum): + """Enum type to store primitive param type.""" + + INT = "int" + FLOAT = "float" + BOOL = "bool" + STR = "str" + + +class ProtocolKindSQLEnum(enum.Enum): + """What kind a stored protocol is.""" + + STANDARD = "standard" + QUICK_TRANSFER = "quick-transfer" + + +class DataFileSourceSQLEnum(enum.Enum): + """The source this data file is from.""" + + UPLOADED = "uploaded" + GENERATED = "generated" + + +class CommandStatusSQLEnum(enum.Enum): + """Command status sql enum.""" + + QUEUED = "queued" + RUNNING = "running" + SUCCEEDED = "succeeded" + FAILED = "failed" + + +protocol_table = sqlalchemy.Table( + "protocol", + metadata, + sqlalchemy.Column( + "id", + sqlalchemy.String, + primary_key=True, + ), + sqlalchemy.Column( + "created_at", + UTCDateTime, + nullable=False, + ), + sqlalchemy.Column("protocol_key", sqlalchemy.String, nullable=True), + sqlalchemy.Column( + "protocol_kind", + sqlalchemy.Enum( + ProtocolKindSQLEnum, + values_callable=lambda obj: [e.value for e in obj], + validate_strings=True, + create_constraint=True, + ), + index=True, + nullable=False, + ), +) + + +analysis_table = sqlalchemy.Table( + "analysis", + metadata, + sqlalchemy.Column( + "id", + sqlalchemy.String, + primary_key=True, + ), + sqlalchemy.Column( + "protocol_id", + sqlalchemy.String, + sqlalchemy.ForeignKey("protocol.id"), + index=True, + nullable=False, + ), + sqlalchemy.Column( + "analyzer_version", + sqlalchemy.String, + nullable=False, + ), + sqlalchemy.Column( + "completed_analysis", + # Stores a JSON string. See CompletedAnalysisStore. + sqlalchemy.String, + nullable=False, + ), +) + + +analysis_primitive_type_rtp_table = sqlalchemy.Table( + "analysis_primitive_rtp_table", + metadata, + sqlalchemy.Column( + "row_id", + sqlalchemy.Integer, + primary_key=True, + ), + sqlalchemy.Column( + "analysis_id", + sqlalchemy.ForeignKey("analysis.id"), + nullable=False, + ), + sqlalchemy.Column( + "parameter_variable_name", + sqlalchemy.String, + nullable=False, + ), + sqlalchemy.Column( + "parameter_type", + sqlalchemy.Enum( + PrimitiveParamSQLEnum, + values_callable=lambda obj: [e.value for e in obj], + create_constraint=True, + # todo(mm, 2024-09-24): Can we add validate_strings=True here? + ), + nullable=False, + ), + sqlalchemy.Column( + "parameter_value", + sqlalchemy.String, + nullable=False, + ), +) + + +analysis_csv_rtp_table = sqlalchemy.Table( + "analysis_csv_rtp_table", + metadata, + sqlalchemy.Column( + "row_id", + sqlalchemy.Integer, + primary_key=True, + ), + sqlalchemy.Column( + "analysis_id", + sqlalchemy.ForeignKey("analysis.id"), + nullable=False, + ), + sqlalchemy.Column( + "parameter_variable_name", + sqlalchemy.String, + nullable=False, + ), + sqlalchemy.Column( + "file_id", + sqlalchemy.ForeignKey("data_files.id"), + nullable=True, + ), +) + + +run_table = sqlalchemy.Table( + "run", + metadata, + sqlalchemy.Column( + "id", + sqlalchemy.String, + primary_key=True, + ), + sqlalchemy.Column( + "created_at", + UTCDateTime, + nullable=False, + ), + sqlalchemy.Column( + "protocol_id", + sqlalchemy.String, + sqlalchemy.ForeignKey("protocol.id"), + nullable=True, + ), + sqlalchemy.Column( + "state_summary", + sqlalchemy.String, + nullable=True, + ), + sqlalchemy.Column("engine_status", sqlalchemy.String, nullable=True), + sqlalchemy.Column("_updated_at", UTCDateTime, nullable=True), + sqlalchemy.Column( + "run_time_parameters", + # Stores a JSON string. See RunStore. + sqlalchemy.String, + nullable=True, + ), +) + + +action_table = sqlalchemy.Table( + "action", + metadata, + sqlalchemy.Column( + "id", + sqlalchemy.String, + primary_key=True, + ), + sqlalchemy.Column("created_at", UTCDateTime, nullable=False), + sqlalchemy.Column("action_type", sqlalchemy.String, nullable=False), + sqlalchemy.Column( + "run_id", + sqlalchemy.String, + sqlalchemy.ForeignKey("run.id"), + nullable=False, + ), +) + + +run_command_table = sqlalchemy.Table( + "run_command", + metadata, + sqlalchemy.Column("row_id", sqlalchemy.Integer, primary_key=True), + sqlalchemy.Column( + "run_id", sqlalchemy.String, sqlalchemy.ForeignKey("run.id"), nullable=False + ), + # command_index in commands enumeration + sqlalchemy.Column("index_in_run", sqlalchemy.Integer, nullable=False), + sqlalchemy.Column("command_id", sqlalchemy.String, nullable=False), + sqlalchemy.Column("command", sqlalchemy.String, nullable=False), + sqlalchemy.Column( + "command_intent", + sqlalchemy.String, + # nullable=True to match the underlying SQL, which is nullable because of a bug + # in the migration that introduced this column. This is not intended to ever be + # null in practice. + nullable=True, + ), + sqlalchemy.Column("command_error", sqlalchemy.String, nullable=True), + sqlalchemy.Column( + "command_status", + sqlalchemy.Enum( + CommandStatusSQLEnum, + values_callable=lambda obj: [e.value for e in obj], + validate_strings=True, + # nullable=True because it was easier for the migration to add the column + # this way. This is not intended to ever be null in practice. + nullable=True, + # todo(mm, 2024-11-20): We want create_constraint=True here. Something + # about the way we compare SQL in test_tables.py is making that difficult-- + # even when we correctly add the constraint in the migration, the SQL + # doesn't compare equal to what create_constraint=True here would emit. + create_constraint=False, + ), + ), + sqlalchemy.Index( + "ix_run_run_id_command_id", # An arbitrary name for the index. + "run_id", + "command_id", + unique=True, + ), + sqlalchemy.Index( + "ix_run_run_id_index_in_run", # An arbitrary name for the index. + "run_id", + "index_in_run", + unique=True, + ), + sqlalchemy.Index( + "ix_run_run_id_command_status_index_in_run", # An arbitrary name for the index. + "run_id", + "command_status", + "index_in_run", + unique=True, + ), +) + + +data_files_table = sqlalchemy.Table( + "data_files", + metadata, + sqlalchemy.Column( + "id", + sqlalchemy.String, + primary_key=True, + ), + sqlalchemy.Column( + "name", + sqlalchemy.String, + nullable=False, + ), + sqlalchemy.Column( + "file_hash", + sqlalchemy.String, + nullable=False, + ), + sqlalchemy.Column( + "created_at", + UTCDateTime, + nullable=False, + ), + sqlalchemy.Column( + "source", + sqlalchemy.Enum( + DataFileSourceSQLEnum, + values_callable=lambda obj: [e.value for e in obj], + validate_strings=True, + # create_constraint=False to match the underlying SQL, which omits + # the constraint because of a bug in the migration that introduced this + # column. This is not intended to ever have values other than those in + # DataFileSourceSQLEnum. + create_constraint=False, + ), + # nullable=True to match the underlying SQL, which is nullable because of a bug + # in the migration that introduced this column. This is not intended to ever be + # null in practice. + nullable=True, + ), +) + + +run_csv_rtp_table = sqlalchemy.Table( + "run_csv_rtp_table", + metadata, + sqlalchemy.Column( + "row_id", + sqlalchemy.Integer, + primary_key=True, + ), + sqlalchemy.Column( + "run_id", + sqlalchemy.ForeignKey("run.id"), + nullable=False, + ), + sqlalchemy.Column( + "parameter_variable_name", + sqlalchemy.String, + nullable=False, + ), + sqlalchemy.Column( + "file_id", + sqlalchemy.ForeignKey("data_files.id"), + nullable=True, + ), +) + + +class BooleanSettingKey(enum.Enum): + """Keys for boolean settings.""" + + ENABLE_ERROR_RECOVERY = "enable_error_recovery" + + +boolean_setting_table = sqlalchemy.Table( + "boolean_setting", + metadata, + sqlalchemy.Column( + "key", + sqlalchemy.Enum( + BooleanSettingKey, + values_callable=lambda obj: [e.value for e in obj], + validate_strings=True, + create_constraint=True, + ), + primary_key=True, + ), + sqlalchemy.Column( + "value", + sqlalchemy.Boolean, + nullable=False, + ), +) + + +labware_offset_table = sqlalchemy.Table( + "labware_offset_with_sequence", + metadata, + # Numeric row ID for ordering: + sqlalchemy.Column("row_id", sqlalchemy.Integer, primary_key=True), + # String UUID for exposing over HTTP: + sqlalchemy.Column( + "offset_id", sqlalchemy.String, nullable=False, unique=True, index=True + ), + # The URI identifying the labware definition that this offset applies to. + sqlalchemy.Column("definition_uri", sqlalchemy.String, nullable=False), + # The offset itself: + sqlalchemy.Column("vector_x", sqlalchemy.Float, nullable=False), + sqlalchemy.Column("vector_y", sqlalchemy.Float, nullable=False), + sqlalchemy.Column("vector_z", sqlalchemy.Float, nullable=False), + # Whether this record is "active", i.e. whether it should be considered as a + # candidate to apply to runs and affect actual robot motion: + sqlalchemy.Column("active", sqlalchemy.Boolean, nullable=False), + # When this record was created: + sqlalchemy.Column("created_at", UTCDateTime, nullable=False), +) + +labware_offset_location_sequence_components_table = sqlalchemy.Table( + "labware_offset_sequence_components", + metadata, + # ID for this row, which largely won't be used + sqlalchemy.Column("row_id", sqlalchemy.Integer, primary_key=True), + # Which offset this belongs to + sqlalchemy.Column( + "offset_id", + sqlalchemy.ForeignKey( + "labware_offset_with_sequence.row_id", + ), + nullable=False, + index=True, + ), + # Its position within the sequence + sqlalchemy.Column("sequence_ordinal", sqlalchemy.Integer, nullable=False), + # An identifier for the component; in practice this will be an enum entry (of the kind values + # of the LabwareOffsetSequenceComponent models) but by keeping that out of the schema we don't + # have to change the schema if we add something new there + sqlalchemy.Column("component_kind", sqlalchemy.String, nullable=False), + # The value of the component, which will differ in kind by what component it is, and would be + # annoying to further schematize without yet more normalization. If we ever add a sequence component + # that has more than one value in it (think twice before doing this), pick a primary value that you'll + # be searching by and put that here. + sqlalchemy.Column("primary_component_value", sqlalchemy.String, nullable=False), + # If the value of the component has more than one thing in it, dump it to json and put it here. + sqlalchemy.Column("component_value_json", sqlalchemy.String, nullable=False), +) diff --git a/robot-server/tests/integration/http_api/test_labware_offsets.tavern.yaml b/robot-server/tests/integration/http_api/test_labware_offsets.tavern.yaml index f84e5b15d56..0745f10a2ae 100644 --- a/robot-server/tests/integration/http_api/test_labware_offsets.tavern.yaml +++ b/robot-server/tests/integration/http_api/test_labware_offsets.tavern.yaml @@ -12,11 +12,17 @@ stages: json: data: definitionUri: definitionUri1 - location: - slotName: A1 - definitionUri: testNamespace/testLoadName/123 - moduleModel: thermocyclerModuleV2 - vector: { x: 1, y: 1, z: 1 } + locationSequence: + - kind: onLabware + labwareUri: testNamespace/testLoadName/123 + - kind: onModule + moduleModel: thermocyclerModuleV2 + - kind: onAddressableArea + addressableAreaName: A1 + vector: + x: 1 + y: 1 + z: 1 response: status_code: 201 json: @@ -24,11 +30,17 @@ stages: id: !anystr createdAt: !anystr definitionUri: definitionUri1 - location: - slotName: A1 - definitionUri: testNamespace/testLoadName/123 - moduleModel: thermocyclerModuleV2 - vector: { x: 1, y: 1, z: 1 } + locationSequence: + - kind: onLabware + labwareUri: testNamespace/testLoadName/123 + - kind: onModule + moduleModel: thermocyclerModuleV2 + - kind: onAddressableArea + addressableAreaName: A1 + vector: + x: 1 + y: 1 + z: 1 save: json: offset_1_data: data @@ -41,9 +53,13 @@ stages: json: data: definitionUri: definitionUri2 - location: - slotName: A2 - vector: { x: 2, y: 2, z: 2 } + locationSequence: + - kind: onAddressableArea + addressableAreaName: A2 + vector: + x: 2 + y: 2 + z: 2 response: status_code: 201 save: @@ -57,9 +73,13 @@ stages: json: data: definitionUri: definitionUri3 - location: - slotName: A3 - vector: { x: 3, y: 3, z: 3 } + locationSequence: + - kind: onAddressableArea + addressableAreaName: A3 + vector: + x: 3 + y: 3 + z: 3 response: status_code: 201 save: @@ -146,10 +166,11 @@ stages: json: data: definitionUri: testNamespace/loadName1/1 - location: - slotName: A1 - # No moduleModel - # No definitionUri + locationSequence: + - kind: onAddressableArea + addressableAreaName: A1 + # No moduleModel + # No definitionUri vector: x: 1 y: 2 @@ -166,10 +187,12 @@ stages: json: data: definitionUri: testNamespace/loadName2/1 - location: - slotName: A1 - moduleModel: temperatureModuleV2 - # No definitionUri + locationSequence: + - kind: onModule + moduleModel: temperatureModuleV2 + - kind: onAddressableArea + addressableAreaName: A1 + # No definitionUri vector: x: 1 y: 2 @@ -186,10 +209,12 @@ stages: json: data: definitionUri: testNamespace/loadName2/1 - location: - slotName: A1 - # no moduleModel - definitionUri: testNamespace/adapterLoadName/1 + locationSequence: + - kind: onLabware + labwareUri: testNamespace/adapterLoadName/1 + - kind: onAddressableArea + addressableAreaName: A1 + # no moduleModel vector: x: 1 y: 2 @@ -206,10 +231,13 @@ stages: json: data: definitionUri: testNamespace/loadName3/1 - location: - slotName: A1 - moduleModel: temperatureModuleV2 - definitionUri: testNamespace/adapterLoadName/1 + locationSequence: + - kind: onLabware + labwareUri: testNamespace/adapterLoadName/1 + - kind: onModule + moduleModel: temperatureModuleV2 + - kind: onAddressableArea + addressableAreaName: A1 vector: x: 1 y: 2 diff --git a/robot-server/tests/labware_offsets/test_store.py b/robot-server/tests/labware_offsets/test_store.py index 0b6048da86b..ad4648b2b83 100644 --- a/robot-server/tests/labware_offsets/test_store.py +++ b/robot-server/tests/labware_offsets/test_store.py @@ -6,16 +6,25 @@ import sqlalchemy from opentrons.protocol_engine import ( - LabwareOffset, - LegacyLabwareOffsetLocation, LabwareOffsetVector, + OnLabwareOffsetLocationSequenceComponent, + OnModuleOffsetLocationSequenceComponent, + OnAddressableAreaOffsetLocationSequenceComponent, ) from opentrons.protocol_engine.types import ModuleModel -from opentrons.types import DeckSlotName - +from robot_server.persistence.tables import ( + labware_offset_location_sequence_components_table, +) from robot_server.labware_offsets.store import ( LabwareOffsetStore, LabwareOffsetNotFoundError, + IncomingStoredLabwareOffset, +) +from robot_server.labware_offsets.models import ( + StoredLabwareOffset, + DoNotFilterType, + DO_NOT_FILTER, + UnknownLabwareOffsetLocationSequenceComponent, ) @@ -25,64 +34,237 @@ def subject(sql_engine: sqlalchemy.engine.Engine) -> LabwareOffsetStore: return LabwareOffsetStore(sql_engine) -def _get_all(store: LabwareOffsetStore) -> list[LabwareOffset]: +def _get_all(store: LabwareOffsetStore) -> list[StoredLabwareOffset]: return store.search() -def test_filter_fields(subject: LabwareOffsetStore) -> None: +@pytest.mark.parametrize( + argnames=[ + "id_filter", + "definition_uri_filter", + "location_addressable_area_filter", + "location_module_model_filter", + "location_labware_uri_filter", + "returned_ids", + ], + argvalues=[ + pytest.param( + "a", + DO_NOT_FILTER, + DO_NOT_FILTER, + DO_NOT_FILTER, + DO_NOT_FILTER, + ["a"], + id="id-only", + ), + pytest.param( + DO_NOT_FILTER, + "definitionUri a", + DO_NOT_FILTER, + DO_NOT_FILTER, + DO_NOT_FILTER, + ["a", "c", "d", "e"], + id="labware-only", + ), + pytest.param( + "a", + "definitionUri a", + DO_NOT_FILTER, + DO_NOT_FILTER, + DO_NOT_FILTER, + ["a"], + id="labware-and-id-matching", + ), + pytest.param( + "a", + "definitionUri b", + DO_NOT_FILTER, + DO_NOT_FILTER, + DO_NOT_FILTER, + [], + id="labware-and-id-conflicting", + ), + pytest.param( + DO_NOT_FILTER, + DO_NOT_FILTER, + "A1", + DO_NOT_FILTER, + DO_NOT_FILTER, + ["a", "c", "d", "e"], + id="aa-only", + ), + pytest.param( + DO_NOT_FILTER, + DO_NOT_FILTER, + "A1", + None, + None, + ["c"], + id="aa-and-not-mod-or-lw", + ), + pytest.param( + DO_NOT_FILTER, + DO_NOT_FILTER, + "A1", + None, + DO_NOT_FILTER, + ["c", "d"], + id="aa-and-not-module", + ), + pytest.param( + DO_NOT_FILTER, + DO_NOT_FILTER, + "A1", + DO_NOT_FILTER, + None, + ["c", "e"], + id="aa-and-not-lw", + ), + pytest.param( + DO_NOT_FILTER, + DO_NOT_FILTER, + DO_NOT_FILTER, + ModuleModel.MAGNETIC_BLOCK_V1, + DO_NOT_FILTER, + ["b", "e"], + id="module-only", + ), + pytest.param( + DO_NOT_FILTER, + DO_NOT_FILTER, + DO_NOT_FILTER, + ModuleModel.MAGNETIC_BLOCK_V1, + None, + ["e"], + id="module-and-not-lw", + ), + pytest.param( + DO_NOT_FILTER, + DO_NOT_FILTER, + DO_NOT_FILTER, + DO_NOT_FILTER, + "location.definitionUri a", + ["a", "d"], + id="lw-only", + ), + pytest.param( + DO_NOT_FILTER, + DO_NOT_FILTER, + DO_NOT_FILTER, + None, + "location.definitionUri a", + ["d"], + id="lw-and-not-module", + ), + ], +) +def test_filter_fields( + subject: LabwareOffsetStore, + id_filter: str | DoNotFilterType, + definition_uri_filter: str | DoNotFilterType, + location_addressable_area_filter: str | DoNotFilterType, + location_module_model_filter: ModuleModel | None | DoNotFilterType, + location_labware_uri_filter: str | None | DoNotFilterType, + returned_ids: list[str], +) -> None: """Test each filterable field to make sure it returns only matching entries.""" - offset_a = LabwareOffset( - id="a", - createdAt=datetime.now(timezone.utc), - definitionUri="definitionUri a", - location=LegacyLabwareOffsetLocation( - slotName=DeckSlotName.SLOT_A1, - moduleModel=ModuleModel.THERMOCYCLER_MODULE_V1, - definitionUri="location.definitionUri a", + offsets = { + "a": IncomingStoredLabwareOffset( + id="a", + createdAt=datetime.now(timezone.utc), + definitionUri="definitionUri a", + locationSequence=[ + OnLabwareOffsetLocationSequenceComponent( + labwareUri="location.definitionUri a" + ), + OnModuleOffsetLocationSequenceComponent( + moduleModel=ModuleModel.THERMOCYCLER_MODULE_V1 + ), + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="A1" + ), + ], + vector=LabwareOffsetVector(x=1, y=2, z=3), ), - vector=LabwareOffsetVector(x=1, y=2, z=3), - ) - offset_b = LabwareOffset( - id="b", - createdAt=datetime.now(timezone.utc), - definitionUri="definitionUri b", - location=LegacyLabwareOffsetLocation( - slotName=DeckSlotName.SLOT_B1, - moduleModel=ModuleModel.MAGNETIC_BLOCK_V1, - definitionUri="location.definitionUri b", + "b": IncomingStoredLabwareOffset( + id="b", + createdAt=datetime.now(timezone.utc), + definitionUri="definitionUri b", + locationSequence=[ + OnLabwareOffsetLocationSequenceComponent( + labwareUri="location.definitionUri b" + ), + OnModuleOffsetLocationSequenceComponent( + moduleModel=ModuleModel.MAGNETIC_BLOCK_V1 + ), + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="B1" + ), + ], + vector=LabwareOffsetVector(x=2, y=4, z=6), ), - vector=LabwareOffsetVector(x=1, y=2, z=3), + "c": IncomingStoredLabwareOffset( + id="c", + createdAt=datetime.now(timezone.utc), + definitionUri="definitionUri a", + locationSequence=[ + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="A1" + ) + ], + vector=LabwareOffsetVector(x=3, y=6, z=9), + ), + "d": IncomingStoredLabwareOffset( + id="d", + createdAt=datetime.now(timezone.utc), + definitionUri="definitionUri a", + locationSequence=[ + OnLabwareOffsetLocationSequenceComponent( + labwareUri="location.definitionUri a" + ), + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="A1" + ), + ], + vector=LabwareOffsetVector(x=4, y=8, z=12), + ), + "e": IncomingStoredLabwareOffset( + id="e", + createdAt=datetime.now(timezone.utc), + definitionUri="definitionUri a", + locationSequence=[ + OnModuleOffsetLocationSequenceComponent( + moduleModel=ModuleModel.MAGNETIC_BLOCK_V1 + ), + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="A1" + ), + ], + vector=LabwareOffsetVector(x=5, y=10, z=15), + ), + } + for offset in offsets.values(): + subject.add(offset) + results = subject.search( + id_filter=id_filter, + definition_uri_filter=definition_uri_filter, + location_addressable_area_filter=location_addressable_area_filter, + location_module_model_filter=location_module_model_filter, + location_definition_uri_filter=location_labware_uri_filter, + ) + assert sorted(results, key=lambda o: o.id,) == sorted( + [ + StoredLabwareOffset( + id=offsets[id_].id, + createdAt=offsets[id_].createdAt, + definitionUri=offsets[id_].definitionUri, + locationSequence=offsets[id_].locationSequence, + vector=offsets[id_].vector, + ) + for id_ in returned_ids + ], + key=lambda o: o.id, ) - - subject.add(offset_a) - subject.add(offset_b) - - assert subject.search(id_filter=offset_a.id) == [offset_a] - assert subject.search(id_filter=offset_b.id) == [offset_b] - - assert subject.search(definition_uri_filter=offset_a.definitionUri) == [offset_a] - assert subject.search(definition_uri_filter=offset_b.definitionUri) == [offset_b] - - assert subject.search(location_slot_name_filter=offset_a.location.slotName) == [ - offset_a - ] - assert subject.search(location_slot_name_filter=offset_b.location.slotName) == [ - offset_b - ] - - assert subject.search( - location_module_model_filter=offset_a.location.moduleModel - ) == [offset_a] - assert subject.search( - location_module_model_filter=offset_b.location.moduleModel - ) == [offset_b] - - assert subject.search( - location_definition_uri_filter=offset_a.location.definitionUri - ) == [offset_a] - assert subject.search( - location_definition_uri_filter=offset_b.location.definitionUri - ) == [offset_b] def test_filter_combinations(subject: LabwareOffsetStore) -> None: @@ -96,27 +278,41 @@ def test_filter_combinations(subject: LabwareOffsetStore) -> None: ("id-6", "definition-uri-b"), ] labware_offsets = [ - LabwareOffset( + IncomingStoredLabwareOffset( id=id, createdAt=datetime.now(timezone.utc), definitionUri=definition_uri, - location=LegacyLabwareOffsetLocation(slotName=DeckSlotName.SLOT_A1), + locationSequence=[ + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="A1" + ) + ], vector=LabwareOffsetVector(x=1, y=2, z=3), ) for (id, definition_uri) in ids_and_definition_uris ] + outgoing_offsets = [ + StoredLabwareOffset( + id=offset.id, + createdAt=offset.createdAt, + definitionUri=offset.definitionUri, + locationSequence=offset.locationSequence, + vector=offset.vector, + ) + for offset in labware_offsets + ] for labware_offset in labware_offsets: subject.add(labware_offset) # No filters: - assert subject.search() == labware_offsets + assert subject.search() == outgoing_offsets # Filter on one thing: result = subject.search(definition_uri_filter="definition-uri-b") assert len(result) == 3 assert result == [ - entry for entry in labware_offsets if entry.definitionUri == "definition-uri-b" + entry for entry in outgoing_offsets if entry.definitionUri == "definition-uri-b" ] # Filter on two things: @@ -124,7 +320,7 @@ def test_filter_combinations(subject: LabwareOffsetStore) -> None: id_filter="id-2", definition_uri_filter="definition-uri-b", ) - assert result == [labware_offsets[1]] + assert result == [outgoing_offsets[1]] # Filters should be ANDed, not ORed, together: result = subject.search( @@ -136,16 +332,32 @@ def test_filter_combinations(subject: LabwareOffsetStore) -> None: def test_delete(subject: LabwareOffsetStore) -> None: """Test the `delete()` and `delete_all()` methods.""" - a, b, c = [ - LabwareOffset( + incoming_offsets = [ + IncomingStoredLabwareOffset( id=id, createdAt=datetime.now(timezone.utc), definitionUri="", - location=LegacyLabwareOffsetLocation(slotName=DeckSlotName.SLOT_A1), + locationSequence=[ + OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="A1" + ) + ], vector=LabwareOffsetVector(x=1, y=2, z=3), ) for id in ["id-a", "id-b", "id-c"] ] + outgoing_offsets = [ + StoredLabwareOffset( + id=offset.id, + createdAt=offset.createdAt, + definitionUri=offset.definitionUri, + locationSequence=offset.locationSequence, + vector=offset.vector, + ) + for offset in incoming_offsets + ] + a, b, c = incoming_offsets + out_a, out_b, out_c = outgoing_offsets with pytest.raises(LabwareOffsetNotFoundError): subject.delete("b") @@ -153,10 +365,52 @@ def test_delete(subject: LabwareOffsetStore) -> None: subject.add(a) subject.add(b) subject.add(c) - assert subject.delete(b.id) == b - assert _get_all(subject) == [a, c] + + assert subject.delete(b.id) == out_b + assert _get_all(subject) == [out_a, out_c] with pytest.raises(LabwareOffsetNotFoundError): - subject.delete(b.id) + subject.delete(out_b.id) subject.delete_all() assert _get_all(subject) == [] + + +def test_handle_unknown( + subject: LabwareOffsetStore, sql_engine: sqlalchemy.engine.Engine +) -> None: + """Test returning an unknown offset.""" + original_location = OnAddressableAreaOffsetLocationSequenceComponent( + addressableAreaName="A1" + ) + incoming_valid = IncomingStoredLabwareOffset( + id="id-a", + createdAt=datetime.now(timezone.utc), + definitionUri="", + locationSequence=[original_location], + vector=LabwareOffsetVector(x=1, y=2, z=3), + ) + outgoing_offset = StoredLabwareOffset( + id=incoming_valid.id, + createdAt=incoming_valid.createdAt, + definitionUri=incoming_valid.definitionUri, + locationSequence=[ + original_location, + UnknownLabwareOffsetLocationSequenceComponent( + storedKind="asdasdad", primaryValue="ddddddd" + ), + ], + vector=incoming_valid.vector, + ) + subject.add(incoming_valid) + with sql_engine.begin() as transaction: + transaction.execute( + sqlalchemy.insert(labware_offset_location_sequence_components_table).values( + row_id=2, + offset_id=1, + sequence_ordinal=2, + component_kind="asdasdad", + primary_component_value="ddddddd", + component_value_json='{"asdasda": "dddddd", "kind": "asdasdad"}', + ) + ) + assert subject.search(id_filter="id-a") == [outgoing_offset] diff --git a/robot-server/tests/persistence/test_tables.py b/robot-server/tests/persistence/test_tables.py index 87110d69eb6..bdb463427ce 100644 --- a/robot-server/tests/persistence/test_tables.py +++ b/robot-server/tests/persistence/test_tables.py @@ -1,6 +1,5 @@ """Tests for SQL tables.""" - from pathlib import Path from typing import List, cast @@ -20,6 +19,7 @@ schema_7, schema_8, schema_9, + schema_10, ) # The statements that we expect to emit when we create a fresh database. @@ -160,6 +160,167 @@ ) """, """ + CREATE TABLE labware_offset_with_sequence ( + row_id INTEGER NOT NULL, + offset_id VARCHAR NOT NULL, + definition_uri VARCHAR NOT NULL, + vector_x FLOAT NOT NULL, + vector_y FLOAT NOT NULL, + vector_z FLOAT NOT NULL, + active BOOLEAN NOT NULL, + created_at DATETIME NOT NULL, + PRIMARY KEY (row_id) + ) + """, + """ + CREATE UNIQUE INDEX ix_labware_offset_with_sequence_offset_id ON labware_offset_with_sequence (offset_id) + """, + """ + CREATE TABLE labware_offset_sequence_components ( + row_id INTEGER NOT NULL, + offset_id INTEGER NOT NULL, + sequence_ordinal INTEGER NOT NULL, + component_kind VARCHAR NOT NULL, + primary_component_value VARCHAR NOT NULL, + component_value_json VARCHAR NOT NULL, + PRIMARY KEY (row_id), + FOREIGN KEY(offset_id) REFERENCES labware_offset_with_sequence (row_id) + ) + """, + """ + CREATE INDEX ix_labware_offset_sequence_components_offset_id ON labware_offset_sequence_components (offset_id) + """, +] + +EXPECTED_STATEMENTS_V10 = EXPECTED_STATEMENTS_LATEST + + +EXPECTED_STATEMENTS_V9 = [ + """ + CREATE TABLE protocol ( + id VARCHAR NOT NULL, + created_at DATETIME NOT NULL, + protocol_key VARCHAR, + protocol_kind VARCHAR(14) NOT NULL, + PRIMARY KEY (id), + CONSTRAINT protocolkindsqlenum CHECK (protocol_kind IN ('standard', 'quick-transfer')) + ) + """, + """ + CREATE TABLE analysis ( + id VARCHAR NOT NULL, + protocol_id VARCHAR NOT NULL, + analyzer_version VARCHAR NOT NULL, + completed_analysis VARCHAR NOT NULL, + PRIMARY KEY (id), + FOREIGN KEY(protocol_id) REFERENCES protocol (id) + ) + """, + """ + CREATE TABLE analysis_primitive_rtp_table ( + row_id INTEGER NOT NULL, + analysis_id VARCHAR NOT NULL, + parameter_variable_name VARCHAR NOT NULL, + parameter_type VARCHAR(5) NOT NULL, + parameter_value VARCHAR NOT NULL, + PRIMARY KEY (row_id), + FOREIGN KEY(analysis_id) REFERENCES analysis (id), + CONSTRAINT primitiveparamsqlenum CHECK (parameter_type IN ('int', 'float', 'bool', 'str')) + ) + """, + """ + CREATE TABLE analysis_csv_rtp_table ( + row_id INTEGER NOT NULL, + analysis_id VARCHAR NOT NULL, + parameter_variable_name VARCHAR NOT NULL, + file_id VARCHAR, + PRIMARY KEY (row_id), + FOREIGN KEY(analysis_id) REFERENCES analysis (id), + FOREIGN KEY(file_id) REFERENCES data_files (id) + ) + """, + """ + CREATE INDEX ix_analysis_protocol_id ON analysis (protocol_id) + """, + """ + CREATE TABLE run ( + id VARCHAR NOT NULL, + created_at DATETIME NOT NULL, + protocol_id VARCHAR, + state_summary VARCHAR, + engine_status VARCHAR, + _updated_at DATETIME, + run_time_parameters VARCHAR, + PRIMARY KEY (id), + FOREIGN KEY(protocol_id) REFERENCES protocol (id) + ) + """, + """ + CREATE TABLE action ( + id VARCHAR NOT NULL, + created_at DATETIME NOT NULL, + action_type VARCHAR NOT NULL, + run_id VARCHAR NOT NULL, + PRIMARY KEY (id), + FOREIGN KEY(run_id) REFERENCES run (id) + ) + """, + """ + CREATE TABLE run_command ( + row_id INTEGER NOT NULL, + run_id VARCHAR NOT NULL, + index_in_run INTEGER NOT NULL, + command_id VARCHAR NOT NULL, + command VARCHAR NOT NULL, + command_intent VARCHAR, + command_error VARCHAR, + command_status VARCHAR(9), + PRIMARY KEY (row_id), + FOREIGN KEY(run_id) REFERENCES run (id) + ) + """, + """ + CREATE UNIQUE INDEX ix_run_run_id_command_id ON run_command (run_id, command_id) + """, + """ + CREATE UNIQUE INDEX ix_run_run_id_index_in_run ON run_command (run_id, index_in_run) + """, + """ + CREATE UNIQUE INDEX ix_run_run_id_command_status_index_in_run ON run_command (run_id, command_status, index_in_run) + """, + """ + CREATE INDEX ix_protocol_protocol_kind ON protocol (protocol_kind) + """, + """ + CREATE TABLE data_files ( + id VARCHAR NOT NULL, + name VARCHAR NOT NULL, + file_hash VARCHAR NOT NULL, + created_at DATETIME NOT NULL, + source VARCHAR(9), + PRIMARY KEY (id) + ) + """, + """ + CREATE TABLE run_csv_rtp_table ( + row_id INTEGER NOT NULL, + run_id VARCHAR NOT NULL, + parameter_variable_name VARCHAR NOT NULL, + file_id VARCHAR, + PRIMARY KEY (row_id), + FOREIGN KEY(run_id) REFERENCES run (id), + FOREIGN KEY(file_id) REFERENCES data_files (id) + ) + """, + """ + CREATE TABLE boolean_setting ( + "key" VARCHAR(21) NOT NULL, + value BOOLEAN NOT NULL, + PRIMARY KEY ("key"), + CONSTRAINT booleansettingkey CHECK ("key" IN ('enable_error_recovery')) + ) + """, + """ CREATE TABLE labware_offset ( row_id INTEGER NOT NULL, offset_id VARCHAR NOT NULL, @@ -181,9 +342,6 @@ ] -EXPECTED_STATEMENTS_V9 = EXPECTED_STATEMENTS_LATEST - - EXPECTED_STATEMENTS_V8 = [ """ CREATE TABLE protocol ( @@ -831,6 +989,7 @@ def _normalize_statement(statement: str) -> str: ("metadata", "expected_statements"), [ (latest_metadata, EXPECTED_STATEMENTS_LATEST), + (schema_10.metadata, EXPECTED_STATEMENTS_V10), (schema_9.metadata, EXPECTED_STATEMENTS_V9), (schema_8.metadata, EXPECTED_STATEMENTS_V8), (schema_7.metadata, EXPECTED_STATEMENTS_V7), From cffab4eb45c184aee5b7642303dea03b41431d26 Mon Sep 17 00:00:00 2001 From: TamarZanzouri Date: Tue, 4 Feb 2025 15:49:12 -0500 Subject: [PATCH 071/150] chore(app): reorder parameters in ODD protocol setup (#17416) --- app/src/pages/ODD/ProtocolSetup/index.tsx | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/app/src/pages/ODD/ProtocolSetup/index.tsx b/app/src/pages/ODD/ProtocolSetup/index.tsx index 9df261ba131..212e17cafaa 100644 --- a/app/src/pages/ODD/ProtocolSetup/index.tsx +++ b/app/src/pages/ODD/ProtocolSetup/index.tsx @@ -566,6 +566,16 @@ function PrepareToRun({ > {!isLoading ? ( <> + { + setSetupScreen('view only parameters') + }} + title={t('parameters')} + detail={parametersDetail} + subDetail={null} + status="ready" + interactionDisabled={!hasRunTimeParameters} + /> { setSetupScreen('instruments') @@ -600,16 +610,6 @@ function PrepareToRun({ } status={offsetsConfirmed ? 'ready' : 'general'} /> - { - setSetupScreen('view only parameters') - }} - title={t('parameters')} - detail={parametersDetail} - subDetail={null} - status="ready" - interactionDisabled={!hasRunTimeParameters} - /> { setSetupScreen('labware') From 643cf15cdbc8c8df2e1221bb13e91a9ba2fbe2e3 Mon Sep 17 00:00:00 2001 From: Max Marrone Date: Tue, 4 Feb 2025 17:01:46 -0500 Subject: [PATCH 072/150] test(shared-data): Continue testing other labware if one test fails (#17420) * When we're iterating over labware definition files to test, instead of using a JavaScript-level `forEach`, use a Vitest-level `it.each` or `test.each`. This just makes the error reporting a little bit better: if multiple labware definitions have errors, Vitest will now detect and print all of them instead of just the first one. * Adjust messages and swap some things between `it` and `test`. This is just for code readability and does not have any functional difference. --- .../js/__tests__/labwareDefSchemaV1.test.ts | 13 +++++----- .../js/__tests__/labwareDefSchemaV2.test.ts | 24 +++++++++---------- .../js/__tests__/labwareDefSchemaV3.test.ts | 11 ++++----- 3 files changed, 22 insertions(+), 26 deletions(-) diff --git a/shared-data/js/__tests__/labwareDefSchemaV1.test.ts b/shared-data/js/__tests__/labwareDefSchemaV1.test.ts index 3a14648eed3..f8fad10bc4e 100644 --- a/shared-data/js/__tests__/labwareDefSchemaV1.test.ts +++ b/shared-data/js/__tests__/labwareDefSchemaV1.test.ts @@ -1,7 +1,7 @@ import path from 'path' import glob from 'glob' import Ajv from 'ajv' -import { describe, expect, it, beforeAll } from 'vitest' +import { describe, expect, it, test } from 'vitest' import { labwareSchemaV1 } from '../schema' import type { LabwareDefinition1 } from '../types' @@ -57,26 +57,25 @@ describe('test the schema against a minimalist fixture', () => { }) }) -describe('test schemas of all definitions', () => { +describe('test all definitions', () => { const labwarePaths = glob.sync(DEFINITIONS_GLOB_PATTERN, GLOB_OPTIONS) - beforeAll(() => { - // Make sure definitions path didn't break, which would give you false positives + test("definition paths didn't break, which would give false positives", () => { expect(labwarePaths.length).toBeGreaterThan(0) }) - labwarePaths.forEach(labwarePath => { + describe.each(labwarePaths)('%s', labwarePath => { const filename = path.parse(labwarePath).name const labwareDef = require(labwarePath) as LabwareDefinition1 - it(filename, () => { + it('validates against the schema', () => { const valid = validate(labwareDef) const validationErrors = validate.errors expect(validationErrors).toBe(null) expect(valid).toBe(true) }) - it(`file name matches metadata.name: ${filename}`, () => { + it(`has a file name that matches metadata.name: ${filename}`, () => { expect(labwareDef.metadata.name).toEqual(filename) }) }) diff --git a/shared-data/js/__tests__/labwareDefSchemaV2.test.ts b/shared-data/js/__tests__/labwareDefSchemaV2.test.ts index 0f063a0bfa6..a5a39218fe6 100644 --- a/shared-data/js/__tests__/labwareDefSchemaV2.test.ts +++ b/shared-data/js/__tests__/labwareDefSchemaV2.test.ts @@ -197,34 +197,33 @@ test('fail on bad labware', () => { describe('test schemas of all opentrons definitions', () => { const labwarePaths = glob.sync(globPattern, { cwd: definitionsDir }) - beforeAll(() => { - // Make sure definitions path didn't break, which would give you false positives + test("definition paths didn't break, which would give false positives", () => { expect(labwarePaths.length).toBeGreaterThan(0) }) - labwarePaths.forEach(labwarePath => { + describe.each(labwarePaths)('%s', labwarePath => { const filename = path.parse(labwarePath).base const fullLabwarePath = path.join(definitionsDir, labwarePath) const labwareDef = require(fullLabwarePath) as LabwareDefinition2 - it(`${filename} validates against schema`, () => { + it('validates against the schema', () => { const valid = validate(labwareDef) const validationErrors = validate.errors expect(validationErrors).toBe(null) expect(valid).toBe(true) }) - it(`file name matches version: ${labwarePath}`, () => { + test('file name matches version', () => { expect(`${labwareDef.version}`).toEqual(path.basename(filename, '.json')) }) - it(`parent dir matches loadName: ${labwarePath}`, () => { + test('parent dir matches loadName', () => { expect(labwareDef.parameters.loadName).toEqual( path.basename(path.dirname(labwarePath)) ) }) - it(`namespace is "opentrons": ${labwarePath}`, () => { + test('namespace is "opentrons"', () => { expect(labwareDef.namespace).toEqual('opentrons') }) @@ -266,30 +265,29 @@ describe('test that the dimensions in all opentrons definitions make sense', () describe('test schemas of all v2 labware fixtures', () => { const labwarePaths = glob.sync(globPattern, { cwd: fixturesDir }) - beforeAll(() => { - // Make sure fixtures path didn't break, which would give you false positives + test("definition paths didn't break, which would give false positives", () => { expect(labwarePaths.length).toBeGreaterThan(0) }) - labwarePaths.forEach(labwarePath => { + describe.each(labwarePaths)('%s', labwarePath => { const filename = path.parse(labwarePath).base const fullLabwarePath = path.join(fixturesDir, labwarePath) const labwareDef = require(fullLabwarePath) as LabwareDefinition2 - it(`${filename} validates against schema`, () => { + test(`${filename} validates against schema`, () => { const valid = validate(labwareDef) const validationErrors = validate.errors expect(validationErrors).toBe(null) expect(valid).toBe(true) }) - it(`fixture file name matches loadName: ${labwarePath}`, () => { + test(`fixture file name matches loadName: ${labwarePath}`, () => { expect(labwareDef.parameters.loadName).toEqual( path.basename(filename, '.json') ) }) - it(`namespace is "fixture": ${labwarePath}`, () => { + test(`namespace is "fixture": ${labwarePath}`, () => { expect(labwareDef.namespace).toEqual('fixture') }) diff --git a/shared-data/js/__tests__/labwareDefSchemaV3.test.ts b/shared-data/js/__tests__/labwareDefSchemaV3.test.ts index 14d0c4bf968..a102cb5128f 100644 --- a/shared-data/js/__tests__/labwareDefSchemaV3.test.ts +++ b/shared-data/js/__tests__/labwareDefSchemaV3.test.ts @@ -1,6 +1,6 @@ import path from 'path' import glob from 'glob' -import { describe, expect, it, beforeAll, test } from 'vitest' +import { describe, expect, it, test } from 'vitest' import type { LabwareDefinition3 } from '../types' import Ajv from 'ajv' @@ -44,23 +44,22 @@ const checkGeometryDefinitions = ( describe(`test additions to labware schema in v3`, () => { const labwarePaths = glob.sync(globPattern, { cwd: fixturesDir }) - beforeAll(() => { - // Make sure definitions path didn't break, which would give you false positives + test("definition paths didn't break, which would give false positives", () => { expect(labwarePaths.length).toBeGreaterThan(0) }) - labwarePaths.forEach(labwarePath => { + describe.each(labwarePaths)('%s', labwarePath => { const filename = path.parse(labwarePath).base const fullLabwarePath = path.join(fixturesDir, labwarePath) const labwareDef = require(fullLabwarePath) as LabwareDefinition3 - checkGeometryDefinitions(labwareDef, labwarePath) - it(`${filename} validates against schema`, () => { const valid = validate(labwareDef) const validationErrors = validate.errors expect(validationErrors).toBe(null) expect(valid).toBe(true) }) + + checkGeometryDefinitions(labwareDef, labwarePath) }) }) From d3e189d9379fc952522282b3dd5067eb5ce6f164 Mon Sep 17 00:00:00 2001 From: Max Marrone Date: Wed, 5 Feb 2025 10:32:02 -0500 Subject: [PATCH 073/150] fix(shared-data): Pre-sort innerLabwareGeometry sections (#17426) --- .../js/__tests__/labwareDefSchemaV3.test.ts | 11 ++ .../3/agilent_1_reservoir_290ml/2.json | 18 +-- .../2.json | 18 +-- .../3.json | 18 +-- .../3/biorad_384_wellplate_50ul/3.json | 18 +-- .../3/biorad_96_wellplate_200ul_pcr/3.json | 34 ++-- .../3/nest_12_reservoir_15ml/2.json | 18 +-- .../3/nest_1_reservoir_195ml/3.json | 18 +-- .../3/nest_1_reservoir_290ml/2.json | 18 +-- .../3.json | 18 +-- .../3/nest_96_wellplate_2ml_deep/3.json | 18 +-- .../2.json | 44 +++--- .../2.json | 44 +++--- .../2.json | 58 +++---- .../2.json | 28 ++-- .../2.json | 16 +- .../2.json | 44 +++--- .../2.json | 28 ++-- .../2.json | 18 +-- .../2.json | 16 +- .../2.json | 50 +++--- .../2.json | 82 +++++----- .../2.json | 146 +++++++++--------- .../2.json | 16 +- .../2.json | 44 +++--- .../2.json | 28 ++-- .../2.json | 28 ++-- .../2.json | 16 +- .../2.json | 60 +++---- .../2.json | 16 +- .../2.json | 16 +- .../2.json | 34 ++-- .../2.json | 14 +- .../2.json | 18 +-- .../2.json | 18 +-- .../2.json | 14 +- .../3.json | 18 +-- .../2.json | 12 +- .../2.json | 12 +- .../3/usascientific_12_reservoir_22ml/2.json | 24 +-- .../2.json | 18 +-- shared-data/labware/schemas/3.json | 2 +- .../labware/labware_definition.py | 2 +- 43 files changed, 601 insertions(+), 590 deletions(-) diff --git a/shared-data/js/__tests__/labwareDefSchemaV3.test.ts b/shared-data/js/__tests__/labwareDefSchemaV3.test.ts index a102cb5128f..4631f327f29 100644 --- a/shared-data/js/__tests__/labwareDefSchemaV3.test.ts +++ b/shared-data/js/__tests__/labwareDefSchemaV3.test.ts @@ -16,6 +16,17 @@ const checkGeometryDefinitions = ( labwareDef: LabwareDefinition3, filename: string ): void => { + test('innerLabwareGeometry sections should be sorted top to bottom', () => { + const geometries = Object.values(labwareDef.innerLabwareGeometry ?? []) + for (const geometry of geometries) { + const sectionList = geometry.sections + const sortedSectionList = sectionList.toSorted( + (a, b) => b.topHeight - a.topHeight + ) + expect(sortedSectionList).toStrictEqual(sectionList) + } + }) + test(`all geometryDefinitionIds specified in {filename} should have an accompanying valid entry in innerLabwareGeometry`, () => { for (const wellName in labwareDef.wells) { const wellGeometryId = labwareDef.wells[wellName].geometryDefinitionId diff --git a/shared-data/labware/definitions/3/agilent_1_reservoir_290ml/2.json b/shared-data/labware/definitions/3/agilent_1_reservoir_290ml/2.json index f9bf94127ab..315a1375f27 100644 --- a/shared-data/labware/definitions/3/agilent_1_reservoir_290ml/2.json +++ b/shared-data/labware/definitions/3/agilent_1_reservoir_290ml/2.json @@ -55,6 +55,15 @@ "innerLabwareGeometry": { "cuboidalWell": { "sections": [ + { + "shape": "cuboidal", + "topXDimension": 107.5, + "topYDimension": 71.25, + "bottomXDimension": 106.79, + "bottomYDimension": 71.0, + "topHeight": 39.23, + "bottomHeight": 2.0 + }, { "shape": "cuboidal", "topXDimension": 106.79, @@ -64,15 +73,6 @@ "topHeight": 2, "bottomHeight": 0, "yCount": 8 - }, - { - "shape": "cuboidal", - "topXDimension": 107.5, - "topYDimension": 71.25, - "bottomXDimension": 106.79, - "bottomYDimension": 71.0, - "topHeight": 39.23, - "bottomHeight": 2.0 } ] } diff --git a/shared-data/labware/definitions/3/appliedbiosystemsmicroamp_384_wellplate_40ul/2.json b/shared-data/labware/definitions/3/appliedbiosystemsmicroamp_384_wellplate_40ul/2.json index d47afca68c4..e2ff42a3a3c 100644 --- a/shared-data/labware/definitions/3/appliedbiosystemsmicroamp_384_wellplate_40ul/2.json +++ b/shared-data/labware/definitions/3/appliedbiosystemsmicroamp_384_wellplate_40ul/2.json @@ -4705,10 +4705,11 @@ "conicalWell": { "sections": [ { - "shape": "spherical", - "radiusOfCurvature": 0.89, - "topHeight": 0.34, - "bottomHeight": 0.0 + "shape": "conical", + "bottomDiameter": 3.17, + "topDiameter": 3.17, + "topHeight": 9.09, + "bottomHeight": 5.77 }, { "shape": "conical", @@ -4718,11 +4719,10 @@ "bottomHeight": 0.34 }, { - "shape": "conical", - "bottomDiameter": 3.17, - "topDiameter": 3.17, - "topHeight": 9.09, - "bottomHeight": 5.77 + "shape": "spherical", + "radiusOfCurvature": 0.89, + "topHeight": 0.34, + "bottomHeight": 0.0 } ] } diff --git a/shared-data/labware/definitions/3/armadillo_96_wellplate_200ul_pcr_full_skirt/3.json b/shared-data/labware/definitions/3/armadillo_96_wellplate_200ul_pcr_full_skirt/3.json index 71c6f214707..292fe779e73 100644 --- a/shared-data/labware/definitions/3/armadillo_96_wellplate_200ul_pcr_full_skirt/3.json +++ b/shared-data/labware/definitions/3/armadillo_96_wellplate_200ul_pcr_full_skirt/3.json @@ -1142,10 +1142,11 @@ "conicalWell": { "sections": [ { - "shape": "spherical", - "radiusOfCurvature": 1.25, - "topHeight": 0.8, - "bottomHeight": 0.0 + "shape": "conical", + "bottomDiameter": 5.5, + "topDiameter": 5.5, + "topHeight": 14.95, + "bottomHeight": 11.35 }, { "shape": "conical", @@ -1155,11 +1156,10 @@ "bottomHeight": 0.8 }, { - "shape": "conical", - "bottomDiameter": 5.5, - "topDiameter": 5.5, - "topHeight": 14.95, - "bottomHeight": 11.35 + "shape": "spherical", + "radiusOfCurvature": 1.25, + "topHeight": 0.8, + "bottomHeight": 0.0 } ] } diff --git a/shared-data/labware/definitions/3/biorad_384_wellplate_50ul/3.json b/shared-data/labware/definitions/3/biorad_384_wellplate_50ul/3.json index d5fb3c926a2..5f6c47fb290 100644 --- a/shared-data/labware/definitions/3/biorad_384_wellplate_50ul/3.json +++ b/shared-data/labware/definitions/3/biorad_384_wellplate_50ul/3.json @@ -4716,10 +4716,11 @@ "conicalWell": { "sections": [ { - "shape": "spherical", - "radiusOfCurvature": 0.94, - "topHeight": 0.35, - "bottomHeight": 0.0 + "shape": "conical", + "bottomDiameter": 3, + "topDiameter": 3.1, + "topHeight": 9.35, + "bottomHeight": 5.35 }, { "shape": "conical", @@ -4729,11 +4730,10 @@ "bottomHeight": 0.35 }, { - "shape": "conical", - "bottomDiameter": 3, - "topDiameter": 3.1, - "topHeight": 9.35, - "bottomHeight": 5.35 + "shape": "spherical", + "radiusOfCurvature": 0.94, + "topHeight": 0.35, + "bottomHeight": 0.0 } ] } diff --git a/shared-data/labware/definitions/3/biorad_96_wellplate_200ul_pcr/3.json b/shared-data/labware/definitions/3/biorad_96_wellplate_200ul_pcr/3.json index 24f0656db6b..58a914c225d 100644 --- a/shared-data/labware/definitions/3/biorad_96_wellplate_200ul_pcr/3.json +++ b/shared-data/labware/definitions/3/biorad_96_wellplate_200ul_pcr/3.json @@ -1143,17 +1143,18 @@ "conicalWell": { "sections": [ { - "shape": "spherical", - "radiusOfCurvature": 1.42, - "topHeight": 1.21, - "bottomHeight": 0.0 + "shape": "conical", + "bottomDiameter": 5.44, + "topDiameter": 5.44, + "topHeight": 14.57, + "bottomHeight": 10.14 }, { "shape": "conical", - "topDiameter": 3.0, - "bottomDiameter": 2.81, - "topHeight": 1.87, - "bottomHeight": 1.21 + "topDiameter": 5.44, + "bottomDiameter": 4.98, + "topHeight": 10.14, + "bottomHeight": 8.58 }, { "shape": "conical", @@ -1164,17 +1165,16 @@ }, { "shape": "conical", - "topDiameter": 5.44, - "bottomDiameter": 4.98, - "topHeight": 10.14, - "bottomHeight": 8.58 + "topDiameter": 3.0, + "bottomDiameter": 2.81, + "topHeight": 1.87, + "bottomHeight": 1.21 }, { - "shape": "conical", - "bottomDiameter": 5.44, - "topDiameter": 5.44, - "topHeight": 14.57, - "bottomHeight": 10.14 + "shape": "spherical", + "radiusOfCurvature": 1.42, + "topHeight": 1.21, + "bottomHeight": 0.0 } ] } diff --git a/shared-data/labware/definitions/3/nest_12_reservoir_15ml/2.json b/shared-data/labware/definitions/3/nest_12_reservoir_15ml/2.json index 38423ed7234..e674aef77cc 100644 --- a/shared-data/labware/definitions/3/nest_12_reservoir_15ml/2.json +++ b/shared-data/labware/definitions/3/nest_12_reservoir_15ml/2.json @@ -202,15 +202,6 @@ "innerLabwareGeometry": { "cuboidalWell": { "sections": [ - { - "shape": "cuboidal", - "topXDimension": 7.95, - "topYDimension": 70.53, - "bottomXDimension": 1.87, - "bottomYDimension": 64.45, - "topHeight": 2.05, - "bottomHeight": 0.0 - }, { "shape": "cuboidal", "topXDimension": 8.35, @@ -219,6 +210,15 @@ "bottomYDimension": 70.53, "topHeight": 26.85, "bottomHeight": 2.05 + }, + { + "shape": "cuboidal", + "topXDimension": 7.95, + "topYDimension": 70.53, + "bottomXDimension": 1.87, + "bottomYDimension": 64.45, + "topHeight": 2.05, + "bottomHeight": 0.0 } ] } diff --git a/shared-data/labware/definitions/3/nest_1_reservoir_195ml/3.json b/shared-data/labware/definitions/3/nest_1_reservoir_195ml/3.json index a5fb287ad8c..a644eb99ae0 100644 --- a/shared-data/labware/definitions/3/nest_1_reservoir_195ml/3.json +++ b/shared-data/labware/definitions/3/nest_1_reservoir_195ml/3.json @@ -57,6 +57,15 @@ "innerLabwareGeometry": { "cuboidalWell": { "sections": [ + { + "shape": "cuboidal", + "topXDimension": 71.3, + "topYDimension": 107.3, + "bottomXDimension": 70.6, + "bottomYDimension": 106.8, + "topHeight": 26.85, + "bottomHeight": 2.0 + }, { "shape": "cuboidal", "topXDimension": 9, @@ -67,15 +76,6 @@ "bottomHeight": 0, "xCount": 12, "yCount": 8 - }, - { - "shape": "cuboidal", - "topXDimension": 71.3, - "topYDimension": 107.3, - "bottomXDimension": 70.6, - "bottomYDimension": 106.8, - "topHeight": 26.85, - "bottomHeight": 2.0 } ] } diff --git a/shared-data/labware/definitions/3/nest_1_reservoir_290ml/2.json b/shared-data/labware/definitions/3/nest_1_reservoir_290ml/2.json index 46c5a494533..1c7c8f1b02c 100644 --- a/shared-data/labware/definitions/3/nest_1_reservoir_290ml/2.json +++ b/shared-data/labware/definitions/3/nest_1_reservoir_290ml/2.json @@ -55,6 +55,15 @@ "innerLabwareGeometry": { "cuboidalWell": { "sections": [ + { + "shape": "cuboidal", + "topXDimension": 107.76, + "topYDimension": 71.0, + "bottomXDimension": 106.75, + "bottomYDimension": 70.75, + "topHeight": 39.55, + "bottomHeight": 2.0 + }, { "shape": "cuboidal", "topXDimension": 7.75, @@ -64,15 +73,6 @@ "topHeight": 2.0, "bottomHeight": 0.0, "xCount": 12 - }, - { - "shape": "cuboidal", - "topXDimension": 107.76, - "topYDimension": 71.0, - "bottomXDimension": 106.75, - "bottomYDimension": 70.75, - "topHeight": 39.55, - "bottomHeight": 2.0 } ] } diff --git a/shared-data/labware/definitions/3/nest_96_wellplate_100ul_pcr_full_skirt/3.json b/shared-data/labware/definitions/3/nest_96_wellplate_100ul_pcr_full_skirt/3.json index 44114349497..04bc8501f42 100644 --- a/shared-data/labware/definitions/3/nest_96_wellplate_100ul_pcr_full_skirt/3.json +++ b/shared-data/labware/definitions/3/nest_96_wellplate_100ul_pcr_full_skirt/3.json @@ -1136,10 +1136,11 @@ "conicalWell": { "sections": [ { - "shape": "spherical", - "radiusOfCurvature": 3.015, - "topHeight": 0.2, - "bottomHeight": 0.0 + "shape": "conical", + "bottomDiameter": 5.26, + "topDiameter": 5.34, + "topHeight": 14.7, + "bottomHeight": 9.89 }, { "shape": "conical", @@ -1149,11 +1150,10 @@ "bottomHeight": 0.2 }, { - "shape": "conical", - "bottomDiameter": 5.26, - "topDiameter": 5.34, - "topHeight": 14.7, - "bottomHeight": 9.89 + "shape": "spherical", + "radiusOfCurvature": 3.015, + "topHeight": 0.2, + "bottomHeight": 0.0 } ] } diff --git a/shared-data/labware/definitions/3/nest_96_wellplate_2ml_deep/3.json b/shared-data/labware/definitions/3/nest_96_wellplate_2ml_deep/3.json index e3651b1934b..cb30a8b93de 100644 --- a/shared-data/labware/definitions/3/nest_96_wellplate_2ml_deep/3.json +++ b/shared-data/labware/definitions/3/nest_96_wellplate_2ml_deep/3.json @@ -1238,15 +1238,6 @@ "innerLabwareGeometry": { "cuboidalWell": { "sections": [ - { - "shape": "cuboidal", - "topXDimension": 7.4, - "topYDimension": 7.4, - "bottomXDimension": 2.63, - "bottomYDimension": 2.63, - "topHeight": 1.67, - "bottomHeight": 0.0 - }, { "shape": "cuboidal", "topXDimension": 8.2, @@ -1255,6 +1246,15 @@ "bottomYDimension": 7.4, "topHeight": 38.05, "bottomHeight": 1.67 + }, + { + "shape": "cuboidal", + "topXDimension": 7.4, + "topYDimension": 7.4, + "bottomXDimension": 2.63, + "bottomYDimension": 2.63, + "topHeight": 1.67, + "bottomHeight": 0.0 } ] } diff --git a/shared-data/labware/definitions/3/opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical/2.json b/shared-data/labware/definitions/3/opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical/2.json index 788e56ee3ba..1069ccd457f 100644 --- a/shared-data/labware/definitions/3/opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical/2.json +++ b/shared-data/labware/definitions/3/opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical/2.json @@ -174,18 +174,12 @@ "innerLabwareGeometry": { "15mlconicalWell": { "sections": [ - { - "shape": "spherical", - "radiusOfCurvature": 2.9, - "topHeight": 0.8, - "bottomHeight": 0.0 - }, { "shape": "conical", - "bottomDiameter": 4, - "topDiameter": 13.5, - "topHeight": 20.7, - "bottomHeight": 0.8 + "bottomDiameter": 14.5, + "topDiameter": 14.7, + "topHeight": 118.2, + "bottomHeight": 108.6 }, { "shape": "conical", @@ -196,10 +190,16 @@ }, { "shape": "conical", - "bottomDiameter": 14.5, - "topDiameter": 14.7, - "topHeight": 118.2, - "bottomHeight": 108.6 + "bottomDiameter": 4, + "topDiameter": 13.5, + "topHeight": 20.7, + "bottomHeight": 0.8 + }, + { + "shape": "spherical", + "radiusOfCurvature": 2.9, + "topHeight": 0.8, + "bottomHeight": 0.0 } ] }, @@ -207,10 +207,10 @@ "sections": [ { "shape": "conical", - "bottomDiameter": 6.15, - "topDiameter": 26.18, - "topHeight": 14.3, - "bottomHeight": 0.0 + "bottomDiameter": 27.52, + "topDiameter": 27.81, + "topHeight": 112.85, + "bottomHeight": 100.65 }, { "shape": "conical", @@ -221,10 +221,10 @@ }, { "shape": "conical", - "bottomDiameter": 27.52, - "topDiameter": 27.81, - "topHeight": 112.85, - "bottomHeight": 100.65 + "bottomDiameter": 6.15, + "topDiameter": 26.18, + "topHeight": 14.3, + "bottomHeight": 0.0 } ] } diff --git a/shared-data/labware/definitions/3/opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic/2.json b/shared-data/labware/definitions/3/opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic/2.json index 4c7683521d7..05bb60d7de6 100644 --- a/shared-data/labware/definitions/3/opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic/2.json +++ b/shared-data/labware/definitions/3/opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic/2.json @@ -172,18 +172,12 @@ "innerLabwareGeometry": { "15mlconicalWell": { "sections": [ - { - "shape": "spherical", - "radiusOfCurvature": 2.9, - "topHeight": 0.8, - "bottomHeight": 0.0 - }, { "shape": "conical", - "bottomDiameter": 4, - "topDiameter": 13.5, - "topHeight": 20.7, - "bottomHeight": 0.8 + "bottomDiameter": 14.5, + "topDiameter": 14.7, + "topHeight": 118.2, + "bottomHeight": 108.6 }, { "shape": "conical", @@ -194,10 +188,16 @@ }, { "shape": "conical", - "bottomDiameter": 14.5, - "topDiameter": 14.7, - "topHeight": 118.2, - "bottomHeight": 108.6 + "bottomDiameter": 4, + "topDiameter": 13.5, + "topHeight": 20.7, + "bottomHeight": 0.8 + }, + { + "shape": "spherical", + "radiusOfCurvature": 2.9, + "topHeight": 0.8, + "bottomHeight": 0.0 } ] }, @@ -205,10 +205,10 @@ "sections": [ { "shape": "conical", - "bottomDiameter": 6.15, - "topDiameter": 26.18, - "topHeight": 14.3, - "bottomHeight": 0.0 + "bottomDiameter": 27.52, + "topDiameter": 27.81, + "topHeight": 112.85, + "bottomHeight": 100.65 }, { "shape": "conical", @@ -219,10 +219,10 @@ }, { "shape": "conical", - "bottomDiameter": 27.52, - "topDiameter": 27.81, - "topHeight": 112.85, - "bottomHeight": 100.65 + "bottomDiameter": 6.15, + "topDiameter": 26.18, + "topHeight": 14.3, + "bottomHeight": 0.0 } ] } diff --git a/shared-data/labware/definitions/3/opentrons_10_tuberack_nest_4x50ml_6x15ml_conical/2.json b/shared-data/labware/definitions/3/opentrons_10_tuberack_nest_4x50ml_6x15ml_conical/2.json index 209aeac29e6..4d0a1f85adb 100644 --- a/shared-data/labware/definitions/3/opentrons_10_tuberack_nest_4x50ml_6x15ml_conical/2.json +++ b/shared-data/labware/definitions/3/opentrons_10_tuberack_nest_4x50ml_6x15ml_conical/2.json @@ -170,18 +170,12 @@ "innerLabwareGeometry": { "conicalWell15mL": { "sections": [ - { - "shape": "spherical", - "radiusOfCurvature": 1.235, - "topHeight": 0.92, - "bottomHeight": 0.0 - }, { "shape": "conical", - "topDiameter": 13.8, - "bottomDiameter": 2.38, - "topHeight": 22.55, - "bottomHeight": 0.92 + "topDiameter": 15.5, + "bottomDiameter": 14.56, + "topHeight": 117.8, + "bottomHeight": 113.8 }, { "shape": "conical", @@ -192,10 +186,16 @@ }, { "shape": "conical", - "topDiameter": 15.5, - "bottomDiameter": 14.56, - "topHeight": 117.8, - "bottomHeight": 113.8 + "topDiameter": 13.8, + "bottomDiameter": 2.38, + "topHeight": 22.55, + "bottomHeight": 0.92 + }, + { + "shape": "spherical", + "radiusOfCurvature": 1.235, + "topHeight": 0.92, + "bottomHeight": 0.0 } ] }, @@ -203,17 +203,10 @@ "sections": [ { "shape": "conical", - "topDiameter": 26.0, - "bottomDiameter": 4.5, - "topHeight": 14.35, - "bottomHeight": 0.0 - }, - { - "shape": "conical", - "topDiameter": 27.69, - "bottomDiameter": 26.0, - "topHeight": 108.8, - "bottomHeight": 14.35 + "topDiameter": 28.18, + "bottomDiameter": 27.95, + "topHeight": 113.1, + "bottomHeight": 109.1 }, { "shape": "conical", @@ -224,10 +217,17 @@ }, { "shape": "conical", - "topDiameter": 28.18, - "bottomDiameter": 27.95, - "topHeight": 113.1, - "bottomHeight": 109.1 + "topDiameter": 27.69, + "bottomDiameter": 26.0, + "topHeight": 108.8, + "bottomHeight": 14.35 + }, + { + "shape": "conical", + "topDiameter": 26.0, + "bottomDiameter": 4.5, + "topHeight": 14.35, + "bottomHeight": 0.0 } ] } diff --git a/shared-data/labware/definitions/3/opentrons_15_tuberack_falcon_15ml_conical/2.json b/shared-data/labware/definitions/3/opentrons_15_tuberack_falcon_15ml_conical/2.json index f0ffc91ba63..2bc57239023 100644 --- a/shared-data/labware/definitions/3/opentrons_15_tuberack_falcon_15ml_conical/2.json +++ b/shared-data/labware/definitions/3/opentrons_15_tuberack_falcon_15ml_conical/2.json @@ -226,18 +226,12 @@ "innerLabwareGeometry": { "conicalWell": { "sections": [ - { - "shape": "spherical", - "radiusOfCurvature": 2.9, - "topHeight": 0.8, - "bottomHeight": 0.0 - }, { "shape": "conical", - "bottomDiameter": 4, - "topDiameter": 13.5, - "topHeight": 20.7, - "bottomHeight": 0.8 + "bottomDiameter": 14.5, + "topDiameter": 14.7, + "topHeight": 118.2, + "bottomHeight": 108.6 }, { "shape": "conical", @@ -248,10 +242,16 @@ }, { "shape": "conical", - "bottomDiameter": 14.5, - "topDiameter": 14.7, - "topHeight": 118.2, - "bottomHeight": 108.6 + "bottomDiameter": 4, + "topDiameter": 13.5, + "topHeight": 20.7, + "bottomHeight": 0.8 + }, + { + "shape": "spherical", + "radiusOfCurvature": 2.9, + "topHeight": 0.8, + "bottomHeight": 0.0 } ] } diff --git a/shared-data/labware/definitions/3/opentrons_15_tuberack_nest_15ml_conical/2.json b/shared-data/labware/definitions/3/opentrons_15_tuberack_nest_15ml_conical/2.json index 9fa2aa1b613..5f179e81796 100644 --- a/shared-data/labware/definitions/3/opentrons_15_tuberack_nest_15ml_conical/2.json +++ b/shared-data/labware/definitions/3/opentrons_15_tuberack_nest_15ml_conical/2.json @@ -226,10 +226,10 @@ "sections": [ { "shape": "conical", - "topDiameter": 13.8, - "bottomDiameter": 2.5, - "topHeight": 22.55, - "bottomHeight": 0.0 + "topDiameter": 15.5, + "bottomDiameter": 14.78, + "topHeight": 117.8, + "bottomHeight": 109.03 }, { "shape": "conical", @@ -240,10 +240,10 @@ }, { "shape": "conical", - "topDiameter": 15.5, - "bottomDiameter": 14.78, - "topHeight": 117.8, - "bottomHeight": 109.03 + "topDiameter": 13.8, + "bottomDiameter": 2.5, + "topHeight": 22.55, + "bottomHeight": 0.0 } ] } diff --git a/shared-data/labware/definitions/3/opentrons_24_aluminumblock_nest_0.5ml_screwcap/2.json b/shared-data/labware/definitions/3/opentrons_24_aluminumblock_nest_0.5ml_screwcap/2.json index d57d4e7942f..2597ac8c542 100644 --- a/shared-data/labware/definitions/3/opentrons_24_aluminumblock_nest_0.5ml_screwcap/2.json +++ b/shared-data/labware/definitions/3/opentrons_24_aluminumblock_nest_0.5ml_screwcap/2.json @@ -323,25 +323,19 @@ "innerLabwareGeometry": { "conicalWell": { "sections": [ - { - "shape": "spherical", - "radiusOfCurvature": 3.64, - "topHeight": 0.14, - "bottomHeight": 0.0 - }, { "shape": "conical", - "bottomDiameter": 2, - "topDiameter": 3, - "topHeight": 0.95, - "bottomHeight": 0.14 + "bottomDiameter": 8.56, + "topDiameter": 8.56, + "topHeight": 25.2, + "bottomHeight": 13.95 }, { "shape": "conical", - "bottomDiameter": 3, - "topDiameter": 5.8, - "topHeight": 10.2, - "bottomHeight": 0.95 + "bottomDiameter": 7.9, + "topDiameter": 8.56, + "topHeight": 13.95, + "bottomHeight": 11.9 }, { "shape": "conical", @@ -352,17 +346,23 @@ }, { "shape": "conical", - "bottomDiameter": 7.9, - "topDiameter": 8.56, - "topHeight": 13.95, - "bottomHeight": 11.9 + "bottomDiameter": 3, + "topDiameter": 5.8, + "topHeight": 10.2, + "bottomHeight": 0.95 }, { "shape": "conical", - "bottomDiameter": 8.56, - "topDiameter": 8.56, - "topHeight": 25.2, - "bottomHeight": 13.95 + "bottomDiameter": 2, + "topDiameter": 3, + "topHeight": 0.95, + "bottomHeight": 0.14 + }, + { + "shape": "spherical", + "radiusOfCurvature": 3.64, + "topHeight": 0.14, + "bottomHeight": 0.0 } ] } diff --git a/shared-data/labware/definitions/3/opentrons_24_aluminumblock_nest_1.5ml_screwcap/2.json b/shared-data/labware/definitions/3/opentrons_24_aluminumblock_nest_1.5ml_screwcap/2.json index 0e1d1eaaab3..b440b9d1330 100644 --- a/shared-data/labware/definitions/3/opentrons_24_aluminumblock_nest_1.5ml_screwcap/2.json +++ b/shared-data/labware/definitions/3/opentrons_24_aluminumblock_nest_1.5ml_screwcap/2.json @@ -323,18 +323,12 @@ "innerLabwareGeometry": { "conicalWell": { "sections": [ - { - "shape": "spherical", - "radiusOfCurvature": 2.36, - "topHeight": 0.2, - "bottomHeight": 0.0 - }, { "shape": "conical", - "topDiameter": 3.2, - "bottomDiameter": 1.9, - "topHeight": 1.88, - "bottomHeight": 0.2 + "topDiameter": 8.55, + "bottomDiameter": 8.2, + "topHeight": 42.6, + "bottomHeight": 13.7 }, { "shape": "conical", @@ -345,10 +339,16 @@ }, { "shape": "conical", - "topDiameter": 8.55, - "bottomDiameter": 8.2, - "topHeight": 42.6, - "bottomHeight": 13.7 + "topDiameter": 3.2, + "bottomDiameter": 1.9, + "topHeight": 1.88, + "bottomHeight": 0.2 + }, + { + "shape": "spherical", + "radiusOfCurvature": 2.36, + "topHeight": 0.2, + "bottomHeight": 0.0 } ] } diff --git a/shared-data/labware/definitions/3/opentrons_24_aluminumblock_nest_1.5ml_snapcap/2.json b/shared-data/labware/definitions/3/opentrons_24_aluminumblock_nest_1.5ml_snapcap/2.json index 51084d8df70..58ea723466f 100644 --- a/shared-data/labware/definitions/3/opentrons_24_aluminumblock_nest_1.5ml_snapcap/2.json +++ b/shared-data/labware/definitions/3/opentrons_24_aluminumblock_nest_1.5ml_snapcap/2.json @@ -326,10 +326,11 @@ "conicalWell": { "sections": [ { - "shape": "spherical", - "radiusOfCurvature": 2.72, - "topHeight": 1.57, - "bottomHeight": 0.0 + "shape": "conical", + "topDiameter": 9.28, + "bottomDiameter": 8.9, + "topHeight": 37.9, + "bottomHeight": 17.7 }, { "shape": "conical", @@ -339,11 +340,10 @@ "bottomHeight": 1.57 }, { - "shape": "conical", - "topDiameter": 9.28, - "bottomDiameter": 8.9, - "topHeight": 37.9, - "bottomHeight": 17.7 + "shape": "spherical", + "radiusOfCurvature": 2.72, + "topHeight": 1.57, + "bottomHeight": 0.0 } ] } diff --git a/shared-data/labware/definitions/3/opentrons_24_aluminumblock_nest_2ml_screwcap/2.json b/shared-data/labware/definitions/3/opentrons_24_aluminumblock_nest_2ml_screwcap/2.json index 4ce933a91d0..8340977dc9f 100644 --- a/shared-data/labware/definitions/3/opentrons_24_aluminumblock_nest_2ml_screwcap/2.json +++ b/shared-data/labware/definitions/3/opentrons_24_aluminumblock_nest_2ml_screwcap/2.json @@ -325,10 +325,10 @@ "sections": [ { "shape": "conical", - "bottomDiameter": 1.21, - "topDiameter": 6.5, - "topHeight": 2.08, - "bottomHeight": 0.0 + "bottomDiameter": 8.14, + "topDiameter": 8.55, + "topHeight": 43.4, + "bottomHeight": 3.04 }, { "shape": "conical", @@ -339,10 +339,10 @@ }, { "shape": "conical", - "bottomDiameter": 8.14, - "topDiameter": 8.55, - "topHeight": 43.4, - "bottomHeight": 3.04 + "bottomDiameter": 1.21, + "topDiameter": 6.5, + "topHeight": 2.08, + "bottomHeight": 0.0 } ] } diff --git a/shared-data/labware/definitions/3/opentrons_24_aluminumblock_nest_2ml_snapcap/2.json b/shared-data/labware/definitions/3/opentrons_24_aluminumblock_nest_2ml_snapcap/2.json index a2ee9e2d328..94d31ce04fb 100644 --- a/shared-data/labware/definitions/3/opentrons_24_aluminumblock_nest_2ml_snapcap/2.json +++ b/shared-data/labware/definitions/3/opentrons_24_aluminumblock_nest_2ml_snapcap/2.json @@ -326,24 +326,25 @@ "conicalWell": { "sections": [ { - "shape": "spherical", - "radiusOfCurvature": 3.19, - "topHeight": 1.21, - "bottomHeight": 0.0 + "shape": "conical", + "bottomDiameter": 8.9, + "topDiameter": 9.28, + "topHeight": 39.28, + "bottomHeight": 15.04 }, { "shape": "conical", - "bottomDiameter": 5, - "topDiameter": 6, - "topHeight": 1.83, - "bottomHeight": 1.21 + "bottomDiameter": 8, + "topDiameter": 8.9, + "topHeight": 15.05, + "bottomHeight": 3.89 }, { "shape": "conical", - "bottomDiameter": 6, - "topDiameter": 7, - "topHeight": 2.59, - "bottomHeight": 1.83 + "bottomDiameter": 7.2, + "topDiameter": 8, + "topHeight": 3.89, + "bottomHeight": 2.74 }, { "shape": "conical", @@ -354,24 +355,23 @@ }, { "shape": "conical", - "bottomDiameter": 7.2, - "topDiameter": 8, - "topHeight": 3.89, - "bottomHeight": 2.74 + "bottomDiameter": 6, + "topDiameter": 7, + "topHeight": 2.59, + "bottomHeight": 1.83 }, { "shape": "conical", - "bottomDiameter": 8, - "topDiameter": 8.9, - "topHeight": 15.05, - "bottomHeight": 3.89 + "bottomDiameter": 5, + "topDiameter": 6, + "topHeight": 1.83, + "bottomHeight": 1.21 }, { - "shape": "conical", - "bottomDiameter": 8.9, - "topDiameter": 9.28, - "topHeight": 39.28, - "bottomHeight": 15.04 + "shape": "spherical", + "radiusOfCurvature": 3.19, + "topHeight": 1.21, + "bottomHeight": 0.0 } ] } diff --git a/shared-data/labware/definitions/3/opentrons_24_tuberack_eppendorf_1.5ml_safelock_snapcap/2.json b/shared-data/labware/definitions/3/opentrons_24_tuberack_eppendorf_1.5ml_safelock_snapcap/2.json index 9d0953e53be..a7682390594 100644 --- a/shared-data/labware/definitions/3/opentrons_24_tuberack_eppendorf_1.5ml_safelock_snapcap/2.json +++ b/shared-data/labware/definitions/3/opentrons_24_tuberack_eppendorf_1.5ml_safelock_snapcap/2.json @@ -337,38 +337,39 @@ "conicalWell": { "sections": [ { - "shape": "spherical", - "radiusOfCurvature": 2.6, - "topHeight": 0.2, - "bottomHeight": 0.0 + "shape": "conical", + "bottomDiameter": 9.6, + "topDiameter": 10, + "topHeight": 37.8, + "bottomHeight": 32.49 }, { "shape": "conical", - "bottomDiameter": 2, - "topDiameter": 3.26, - "topHeight": 1, - "bottomHeight": 0.2 + "bottomDiameter": 9.2, + "topDiameter": 9.6, + "topHeight": 32.49, + "bottomHeight": 31.97 }, { "shape": "conical", - "bottomDiameter": 3.26, - "topDiameter": 4, - "topHeight": 2.9, - "bottomHeight": 1 + "bottomDiameter": 9.02, + "topDiameter": 9.2, + "topHeight": 31.97, + "bottomHeight": 31.16 }, { "shape": "conical", - "bottomDiameter": 4, - "topDiameter": 6, - "topHeight": 9.24, - "bottomHeight": 2.9 + "bottomDiameter": 8.9, + "topDiameter": 9.02, + "topHeight": 31.16, + "bottomHeight": 28.16 }, { "shape": "conical", - "bottomDiameter": 6, - "topDiameter": 8, - "topHeight": 15.89, - "bottomHeight": 9.24 + "bottomDiameter": 8.5, + "topDiameter": 8.9, + "topHeight": 28.16, + "bottomHeight": 17.56 }, { "shape": "conical", @@ -379,38 +380,37 @@ }, { "shape": "conical", - "bottomDiameter": 8.5, - "topDiameter": 8.9, - "topHeight": 28.16, - "bottomHeight": 17.56 + "bottomDiameter": 6, + "topDiameter": 8, + "topHeight": 15.89, + "bottomHeight": 9.24 }, { "shape": "conical", - "bottomDiameter": 8.9, - "topDiameter": 9.02, - "topHeight": 31.16, - "bottomHeight": 28.16 + "bottomDiameter": 4, + "topDiameter": 6, + "topHeight": 9.24, + "bottomHeight": 2.9 }, { "shape": "conical", - "bottomDiameter": 9.02, - "topDiameter": 9.2, - "topHeight": 31.97, - "bottomHeight": 31.16 + "bottomDiameter": 3.26, + "topDiameter": 4, + "topHeight": 2.9, + "bottomHeight": 1 }, { "shape": "conical", - "bottomDiameter": 9.2, - "topDiameter": 9.6, - "topHeight": 32.49, - "bottomHeight": 31.97 + "bottomDiameter": 2, + "topDiameter": 3.26, + "topHeight": 1, + "bottomHeight": 0.2 }, { - "shape": "conical", - "bottomDiameter": 9.6, - "topDiameter": 10, - "topHeight": 37.8, - "bottomHeight": 32.49 + "shape": "spherical", + "radiusOfCurvature": 2.6, + "topHeight": 0.2, + "bottomHeight": 0.0 } ] } diff --git a/shared-data/labware/definitions/3/opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap/2.json b/shared-data/labware/definitions/3/opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap/2.json index 97726f203f7..e3d0c3d917e 100644 --- a/shared-data/labware/definitions/3/opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap/2.json +++ b/shared-data/labware/definitions/3/opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap/2.json @@ -336,66 +336,67 @@ "conicalWell": { "sections": [ { - "shape": "spherical", - "radiusOfCurvature": 2.88, - "topHeight": 1.45, - "bottomHeight": 0.0 + "shape": "conical", + "topDiameter": 10.0, + "bottomDiameter": 9.6, + "topHeight": 39.02, + "bottomHeight": 33.96 }, { "shape": "conical", - "topDiameter": 6.0, - "bottomDiameter": 5.0, - "topHeight": 2.2, - "bottomHeight": 1.45 + "topDiameter": 9.6, + "bottomDiameter": 9.2, + "topHeight": 33.96, + "bottomHeight": 32.5 }, { "shape": "conical", - "topDiameter": 6.4, - "bottomDiameter": 6.0, - "topHeight": 2.45, - "bottomHeight": 2.2 + "topDiameter": 9.2, + "bottomDiameter": 9.1, + "topHeight": 32.5, + "bottomHeight": 25.26 }, { "shape": "conical", - "topDiameter": 6.8, - "bottomDiameter": 6.4, - "topHeight": 2.75, - "bottomHeight": 2.45 + "topDiameter": 9.1, + "bottomDiameter": 9.0, + "topHeight": 25.26, + "bottomHeight": 13.32 }, { "shape": "conical", - "topDiameter": 7.2, - "bottomDiameter": 6.8, - "topHeight": 3.14, - "bottomHeight": 2.75 + "topDiameter": 9.0, + "bottomDiameter": 8.9, + "topHeight": 13.32, + "bottomHeight": 10.17 }, { "shape": "conical", - "topDiameter": 7.6, - "bottomDiameter": 7.2, - "topHeight": 3.67, - "bottomHeight": 3.14 + "topDiameter": 8.9, + "bottomDiameter": 8.78, + "topHeight": 10.17, + "bottomHeight": 6.97 }, { "shape": "conical", - "topDiameter": 7.7, - "bottomDiameter": 7.6, - "topHeight": 3.93, - "bottomHeight": 3.67 + "topDiameter": 8.78, + "bottomDiameter": 8.6, + "topHeight": 6.97, + "bottomHeight": 5.43 }, { "shape": "conical", - "topDiameter": 8.0, - "bottomDiameter": 7.7, - "topHeight": 4.29, - "bottomHeight": 3.93 + "topDiameter": 8.6, + "bottomDiameter": 8.5, + "topHeight": 5.43, + "bottomHeight": 5.15 }, { "shape": "conical", - "topDiameter": 8.2, - "bottomDiameter": 8.0, - "topHeight": 4.53, - "bottomHeight": 4.29 + "topDiameter": 8.5, + "bottomDiameter": 8.4, + "topHeight": 5.15, + "bottomHeight": 5.03 }, { "shape": "conical", @@ -406,66 +407,65 @@ }, { "shape": "conical", - "topDiameter": 8.5, - "bottomDiameter": 8.4, - "topHeight": 5.15, - "bottomHeight": 5.03 + "topDiameter": 8.2, + "bottomDiameter": 8.0, + "topHeight": 4.53, + "bottomHeight": 4.29 }, { "shape": "conical", - "topDiameter": 8.6, - "bottomDiameter": 8.5, - "topHeight": 5.43, - "bottomHeight": 5.15 + "topDiameter": 8.0, + "bottomDiameter": 7.7, + "topHeight": 4.29, + "bottomHeight": 3.93 }, { "shape": "conical", - "topDiameter": 8.78, - "bottomDiameter": 8.6, - "topHeight": 6.97, - "bottomHeight": 5.43 + "topDiameter": 7.7, + "bottomDiameter": 7.6, + "topHeight": 3.93, + "bottomHeight": 3.67 }, { "shape": "conical", - "topDiameter": 8.9, - "bottomDiameter": 8.78, - "topHeight": 10.17, - "bottomHeight": 6.97 + "topDiameter": 7.6, + "bottomDiameter": 7.2, + "topHeight": 3.67, + "bottomHeight": 3.14 }, { "shape": "conical", - "topDiameter": 9.0, - "bottomDiameter": 8.9, - "topHeight": 13.32, - "bottomHeight": 10.17 + "topDiameter": 7.2, + "bottomDiameter": 6.8, + "topHeight": 3.14, + "bottomHeight": 2.75 }, { "shape": "conical", - "topDiameter": 9.1, - "bottomDiameter": 9.0, - "topHeight": 25.26, - "bottomHeight": 13.32 + "topDiameter": 6.8, + "bottomDiameter": 6.4, + "topHeight": 2.75, + "bottomHeight": 2.45 }, { "shape": "conical", - "topDiameter": 9.2, - "bottomDiameter": 9.1, - "topHeight": 32.5, - "bottomHeight": 25.26 + "topDiameter": 6.4, + "bottomDiameter": 6.0, + "topHeight": 2.45, + "bottomHeight": 2.2 }, { "shape": "conical", - "topDiameter": 9.6, - "bottomDiameter": 9.2, - "topHeight": 33.96, - "bottomHeight": 32.5 + "topDiameter": 6.0, + "bottomDiameter": 5.0, + "topHeight": 2.2, + "bottomHeight": 1.45 }, { - "shape": "conical", - "topDiameter": 10.0, - "bottomDiameter": 9.6, - "topHeight": 39.02, - "bottomHeight": 33.96 + "shape": "spherical", + "radiusOfCurvature": 2.88, + "topHeight": 1.45, + "bottomHeight": 0.0 } ] } diff --git a/shared-data/labware/definitions/3/opentrons_24_tuberack_generic_2ml_screwcap/2.json b/shared-data/labware/definitions/3/opentrons_24_tuberack_generic_2ml_screwcap/2.json index 0914789708c..43fd7f20d26 100644 --- a/shared-data/labware/definitions/3/opentrons_24_tuberack_generic_2ml_screwcap/2.json +++ b/shared-data/labware/definitions/3/opentrons_24_tuberack_generic_2ml_screwcap/2.json @@ -326,10 +326,10 @@ "sections": [ { "shape": "conical", - "topDiameter": 6.5, - "bottomDiameter": 1.21, - "topHeight": 2.08, - "bottomHeight": 0.0 + "topDiameter": 8.5, + "bottomDiameter": 8.14, + "topHeight": 42.0, + "bottomHeight": 3.04 }, { "shape": "conical", @@ -340,10 +340,10 @@ }, { "shape": "conical", - "topDiameter": 8.5, - "bottomDiameter": 8.14, - "topHeight": 42.0, - "bottomHeight": 3.04 + "topDiameter": 6.5, + "bottomDiameter": 1.21, + "topHeight": 2.08, + "bottomHeight": 0.0 } ] } diff --git a/shared-data/labware/definitions/3/opentrons_24_tuberack_nest_0.5ml_screwcap/2.json b/shared-data/labware/definitions/3/opentrons_24_tuberack_nest_0.5ml_screwcap/2.json index 0b29c336b23..ea2717e2cb5 100644 --- a/shared-data/labware/definitions/3/opentrons_24_tuberack_nest_0.5ml_screwcap/2.json +++ b/shared-data/labware/definitions/3/opentrons_24_tuberack_nest_0.5ml_screwcap/2.json @@ -324,25 +324,19 @@ "innerLabwareGeometry": { "conicalWell": { "sections": [ - { - "shape": "spherical", - "radiusOfCurvature": 3.64, - "topHeight": 0.14, - "bottomHeight": 0.0 - }, { "shape": "conical", - "topDiameter": 3, - "bottomDiameter": 2, - "topHeight": 0.95, - "bottomHeight": 0.14 + "topDiameter": 8.56, + "bottomDiameter": 8.56, + "topHeight": 25.2, + "bottomHeight": 13.95 }, { "shape": "conical", - "topDiameter": 5.8, - "bottomDiameter": 3, - "topHeight": 10.2, - "bottomHeight": 0.95 + "topDiameter": 8.56, + "bottomDiameter": 7.9, + "topHeight": 13.95, + "bottomHeight": 11.9 }, { "shape": "conical", @@ -353,17 +347,23 @@ }, { "shape": "conical", - "topDiameter": 8.56, - "bottomDiameter": 7.9, - "topHeight": 13.95, - "bottomHeight": 11.9 + "topDiameter": 5.8, + "bottomDiameter": 3, + "topHeight": 10.2, + "bottomHeight": 0.95 }, { "shape": "conical", - "topDiameter": 8.56, - "bottomDiameter": 8.56, - "topHeight": 25.2, - "bottomHeight": 13.95 + "topDiameter": 3, + "bottomDiameter": 2, + "topHeight": 0.95, + "bottomHeight": 0.14 + }, + { + "shape": "spherical", + "radiusOfCurvature": 3.64, + "topHeight": 0.14, + "bottomHeight": 0.0 } ] } diff --git a/shared-data/labware/definitions/3/opentrons_24_tuberack_nest_1.5ml_screwcap/2.json b/shared-data/labware/definitions/3/opentrons_24_tuberack_nest_1.5ml_screwcap/2.json index 9544e5cc9c2..e274cb83e20 100644 --- a/shared-data/labware/definitions/3/opentrons_24_tuberack_nest_1.5ml_screwcap/2.json +++ b/shared-data/labware/definitions/3/opentrons_24_tuberack_nest_1.5ml_screwcap/2.json @@ -324,18 +324,12 @@ "innerLabwareGeometry": { "conicalWell": { "sections": [ - { - "shape": "spherical", - "radiusOfCurvature": 2.36, - "topHeight": 0.2, - "bottomHeight": 0.0 - }, { "shape": "conical", - "topDiameter": 3.2, - "bottomDiameter": 1.9, - "topHeight": 1.88, - "bottomHeight": 0.2 + "topDiameter": 8.55, + "bottomDiameter": 8.2, + "topHeight": 42.6, + "bottomHeight": 13.7 }, { "shape": "conical", @@ -346,10 +340,16 @@ }, { "shape": "conical", - "topDiameter": 8.55, - "bottomDiameter": 8.2, - "topHeight": 42.6, - "bottomHeight": 13.7 + "topDiameter": 3.2, + "bottomDiameter": 1.9, + "topHeight": 1.88, + "bottomHeight": 0.2 + }, + { + "shape": "spherical", + "radiusOfCurvature": 2.36, + "topHeight": 0.2, + "bottomHeight": 0.0 } ] } diff --git a/shared-data/labware/definitions/3/opentrons_24_tuberack_nest_1.5ml_snapcap/2.json b/shared-data/labware/definitions/3/opentrons_24_tuberack_nest_1.5ml_snapcap/2.json index af1f609a7f4..0f5270b9bfd 100644 --- a/shared-data/labware/definitions/3/opentrons_24_tuberack_nest_1.5ml_snapcap/2.json +++ b/shared-data/labware/definitions/3/opentrons_24_tuberack_nest_1.5ml_snapcap/2.json @@ -326,18 +326,12 @@ "innerLabwareGeometry": { "conicalWell": { "sections": [ - { - "shape": "spherical", - "radiusOfCurvature": 1.87, - "topHeight": 1.56, - "bottomHeight": 0.0 - }, { "shape": "conical", - "topDiameter": 8.98, - "bottomDiameter": 3.69, - "topHeight": 17.4, - "bottomHeight": 1.56 + "topDiameter": 9.9, + "bottomDiameter": 9.28, + "topHeight": 37.9, + "bottomHeight": 35.4 }, { "shape": "conical", @@ -348,10 +342,16 @@ }, { "shape": "conical", - "topDiameter": 9.9, - "bottomDiameter": 9.28, - "topHeight": 37.9, - "bottomHeight": 35.4 + "topDiameter": 8.98, + "bottomDiameter": 3.69, + "topHeight": 17.4, + "bottomHeight": 1.56 + }, + { + "shape": "spherical", + "radiusOfCurvature": 1.87, + "topHeight": 1.56, + "bottomHeight": 0.0 } ] } diff --git a/shared-data/labware/definitions/3/opentrons_24_tuberack_nest_2ml_screwcap/2.json b/shared-data/labware/definitions/3/opentrons_24_tuberack_nest_2ml_screwcap/2.json index a66604fbb00..0ccc0a0e25b 100644 --- a/shared-data/labware/definitions/3/opentrons_24_tuberack_nest_2ml_screwcap/2.json +++ b/shared-data/labware/definitions/3/opentrons_24_tuberack_nest_2ml_screwcap/2.json @@ -326,10 +326,10 @@ "sections": [ { "shape": "conical", - "bottomDiameter": 1.21, - "topDiameter": 6.5, - "topHeight": 2.08, - "bottomHeight": 0.0 + "topDiameter": 8.55, + "bottomDiameter": 8.14, + "topHeight": 43.4, + "bottomHeight": 3.04 }, { "shape": "conical", @@ -340,10 +340,10 @@ }, { "shape": "conical", - "topDiameter": 8.55, - "bottomDiameter": 8.14, - "topHeight": 43.4, - "bottomHeight": 3.04 + "bottomDiameter": 1.21, + "topDiameter": 6.5, + "topHeight": 2.08, + "bottomHeight": 0.0 } ] } diff --git a/shared-data/labware/definitions/3/opentrons_24_tuberack_nest_2ml_snapcap/2.json b/shared-data/labware/definitions/3/opentrons_24_tuberack_nest_2ml_snapcap/2.json index 3918d0c0c42..961d0ef75f3 100644 --- a/shared-data/labware/definitions/3/opentrons_24_tuberack_nest_2ml_snapcap/2.json +++ b/shared-data/labware/definitions/3/opentrons_24_tuberack_nest_2ml_snapcap/2.json @@ -326,32 +326,26 @@ "innerLabwareGeometry": { "conicalWell": { "sections": [ - { - "shape": "spherical", - "radiusOfCurvature": 3.19, - "topHeight": 1.21, - "bottomHeight": 0.0 - }, { "shape": "conical", - "topDiameter": 6.0, - "bottomDiameter": 5.0, - "topHeight": 1.83, - "bottomHeight": 1.21 + "topDiameter": 9.28, + "bottomDiameter": 8.9, + "topHeight": 39.28, + "bottomHeight": 15.04 }, { "shape": "conical", - "topDiameter": 7.0, - "bottomDiameter": 6.0, - "topHeight": 2.59, - "bottomHeight": 1.83 + "topDiameter": 8.9, + "bottomDiameter": 8.74, + "topHeight": 15.04, + "bottomHeight": 6.26 }, { "shape": "conical", - "topDiameter": 7.2, - "bottomDiameter": 7.0, - "topHeight": 2.74, - "bottomHeight": 2.59 + "topDiameter": 8.74, + "bottomDiameter": 8.0, + "topHeight": 6.26, + "bottomHeight": 3.98 }, { "shape": "conical", @@ -362,24 +356,30 @@ }, { "shape": "conical", - "topDiameter": 8.74, - "bottomDiameter": 8.0, - "topHeight": 6.26, - "bottomHeight": 3.98 + "topDiameter": 7.2, + "bottomDiameter": 7.0, + "topHeight": 2.74, + "bottomHeight": 2.59 }, { "shape": "conical", - "topDiameter": 8.9, - "bottomDiameter": 8.74, - "topHeight": 15.04, - "bottomHeight": 6.26 + "topDiameter": 7.0, + "bottomDiameter": 6.0, + "topHeight": 2.59, + "bottomHeight": 1.83 }, { "shape": "conical", - "topDiameter": 9.28, - "bottomDiameter": 8.9, - "topHeight": 39.28, - "bottomHeight": 15.04 + "topDiameter": 6.0, + "bottomDiameter": 5.0, + "topHeight": 1.83, + "bottomHeight": 1.21 + }, + { + "shape": "spherical", + "radiusOfCurvature": 3.19, + "topHeight": 1.21, + "bottomHeight": 0.0 } ] } diff --git a/shared-data/labware/definitions/3/opentrons_6_tuberack_falcon_50ml_conical/2.json b/shared-data/labware/definitions/3/opentrons_6_tuberack_falcon_50ml_conical/2.json index e94df16c28e..7f39388b16c 100644 --- a/shared-data/labware/definitions/3/opentrons_6_tuberack_falcon_50ml_conical/2.json +++ b/shared-data/labware/definitions/3/opentrons_6_tuberack_falcon_50ml_conical/2.json @@ -120,10 +120,10 @@ "sections": [ { "shape": "conical", - "bottomDiameter": 6.15, - "topDiameter": 26.18, - "topHeight": 14.3, - "bottomHeight": 0.0 + "bottomDiameter": 27.52, + "topDiameter": 27.81, + "topHeight": 112.85, + "bottomHeight": 100.65 }, { "shape": "conical", @@ -134,10 +134,10 @@ }, { "shape": "conical", - "bottomDiameter": 27.52, - "topDiameter": 27.81, - "topHeight": 112.85, - "bottomHeight": 100.65 + "bottomDiameter": 6.15, + "topDiameter": 26.18, + "topHeight": 14.3, + "bottomHeight": 0.0 } ] } diff --git a/shared-data/labware/definitions/3/opentrons_6_tuberack_nest_50ml_conical/2.json b/shared-data/labware/definitions/3/opentrons_6_tuberack_nest_50ml_conical/2.json index 01ce776b887..fdf2012b10e 100644 --- a/shared-data/labware/definitions/3/opentrons_6_tuberack_nest_50ml_conical/2.json +++ b/shared-data/labware/definitions/3/opentrons_6_tuberack_nest_50ml_conical/2.json @@ -118,10 +118,10 @@ "sections": [ { "shape": "conical", - "topDiameter": 26.0, - "bottomDiameter": 6.0, - "topHeight": 14.28, - "bottomHeight": 0.0 + "topDiameter": 27.45, + "bottomDiameter": 27.0, + "topHeight": 113.3, + "bottomHeight": 109.0 }, { "shape": "conical", @@ -132,10 +132,10 @@ }, { "shape": "conical", - "topDiameter": 27.45, - "bottomDiameter": 27.0, - "topHeight": 113.3, - "bottomHeight": 109.0 + "topDiameter": 26.0, + "bottomDiameter": 6.0, + "topHeight": 14.28, + "bottomHeight": 0.0 } ] } diff --git a/shared-data/labware/definitions/3/opentrons_96_aluminumblock_biorad_wellplate_200ul/2.json b/shared-data/labware/definitions/3/opentrons_96_aluminumblock_biorad_wellplate_200ul/2.json index 48811ce64cd..ff19a886e26 100644 --- a/shared-data/labware/definitions/3/opentrons_96_aluminumblock_biorad_wellplate_200ul/2.json +++ b/shared-data/labware/definitions/3/opentrons_96_aluminumblock_biorad_wellplate_200ul/2.json @@ -1126,17 +1126,18 @@ "conicalWell": { "sections": [ { - "shape": "spherical", - "radiusOfCurvature": 1.42, - "topHeight": 1.21, - "bottomHeight": 0.0 + "shape": "conical", + "bottomDiameter": 5.44, + "topDiameter": 5.44, + "topHeight": 14.57, + "bottomHeight": 10.14 }, { "shape": "conical", - "bottomDiameter": 2.81, - "topDiameter": 3, - "topHeight": 1.87, - "bottomHeight": 1.21 + "bottomDiameter": 3, + "topDiameter": 5.44, + "topHeight": 10.14, + "bottomHeight": 8.58 }, { "shape": "conical", @@ -1147,17 +1148,16 @@ }, { "shape": "conical", - "bottomDiameter": 3, - "topDiameter": 5.44, - "topHeight": 10.14, - "bottomHeight": 8.58 + "bottomDiameter": 2.81, + "topDiameter": 3, + "topHeight": 1.87, + "bottomHeight": 1.21 }, { - "shape": "conical", - "bottomDiameter": 5.44, - "topDiameter": 5.44, - "topHeight": 14.57, - "bottomHeight": 10.14 + "shape": "spherical", + "radiusOfCurvature": 1.42, + "topHeight": 1.21, + "bottomHeight": 0.0 } ] } diff --git a/shared-data/labware/definitions/3/opentrons_96_aluminumblock_nest_wellplate_100ul/2.json b/shared-data/labware/definitions/3/opentrons_96_aluminumblock_nest_wellplate_100ul/2.json index 567af45ba6f..7feac27841f 100644 --- a/shared-data/labware/definitions/3/opentrons_96_aluminumblock_nest_wellplate_100ul/2.json +++ b/shared-data/labware/definitions/3/opentrons_96_aluminumblock_nest_wellplate_100ul/2.json @@ -1123,6 +1123,13 @@ "innerLabwareGeometry": { "conicalWell": { "sections": [ + { + "shape": "conical", + "bottomDiameter": 5.26, + "topDiameter": 5.34, + "topHeight": 14.7, + "bottomHeight": 9.89 + }, { "shape": "spherical", "radiusOfCurvature": 3.015, @@ -1135,13 +1142,6 @@ "topDiameter": 5.26, "topHeight": 0.2, "bottomHeight": 9.89 - }, - { - "shape": "conical", - "bottomDiameter": 5.26, - "topDiameter": 5.34, - "topHeight": 14.7, - "bottomHeight": 9.89 } ] } diff --git a/shared-data/labware/definitions/3/opentrons_96_deep_well_adapter_nest_wellplate_2ml_deep/2.json b/shared-data/labware/definitions/3/opentrons_96_deep_well_adapter_nest_wellplate_2ml_deep/2.json index 4f4a32320eb..10c63d8ad4a 100644 --- a/shared-data/labware/definitions/3/opentrons_96_deep_well_adapter_nest_wellplate_2ml_deep/2.json +++ b/shared-data/labware/definitions/3/opentrons_96_deep_well_adapter_nest_wellplate_2ml_deep/2.json @@ -1217,15 +1217,6 @@ "innerLabwareGeometry": { "cuboidalWell": { "sections": [ - { - "shape": "cuboidal", - "topXDimension": 7.4, - "topYDimension": 7.4, - "bottomXDimension": 2.63, - "bottomYDimension": 2.63, - "topHeight": 1.67, - "bottomHeight": 0.0 - }, { "shape": "cuboidal", "topXDimension": 8.2, @@ -1234,6 +1225,15 @@ "bottomYDimension": 7.4, "topHeight": 38.05, "bottomHeight": 1.67 + }, + { + "shape": "cuboidal", + "topXDimension": 7.4, + "topYDimension": 7.4, + "bottomXDimension": 2.63, + "bottomYDimension": 2.63, + "topHeight": 1.67, + "bottomHeight": 0.0 } ] } diff --git a/shared-data/labware/definitions/3/opentrons_96_pcr_adapter_armadillo_wellplate_200ul/2.json b/shared-data/labware/definitions/3/opentrons_96_pcr_adapter_armadillo_wellplate_200ul/2.json index 3ac68ba32be..a21f759a713 100644 --- a/shared-data/labware/definitions/3/opentrons_96_pcr_adapter_armadillo_wellplate_200ul/2.json +++ b/shared-data/labware/definitions/3/opentrons_96_pcr_adapter_armadillo_wellplate_200ul/2.json @@ -1124,10 +1124,11 @@ "conicalWell": { "sections": [ { - "shape": "spherical", - "radiusOfCurvature": 1.25, - "topHeight": 0.8, - "bottomHeight": 0.0 + "shape": "conical", + "bottomDiameter": 5.5, + "topDiameter": 5.5, + "topHeight": 14.95, + "bottomHeight": 11.35 }, { "shape": "conical", @@ -1137,11 +1138,10 @@ "bottomHeight": 0.8 }, { - "shape": "conical", - "bottomDiameter": 5.5, - "topDiameter": 5.5, - "topHeight": 14.95, - "bottomHeight": 11.35 + "shape": "spherical", + "radiusOfCurvature": 1.25, + "topHeight": 0.8, + "bottomHeight": 0.0 } ] } diff --git a/shared-data/labware/definitions/3/opentrons_96_pcr_adapter_nest_wellplate_100ul_pcr_full_skirt/2.json b/shared-data/labware/definitions/3/opentrons_96_pcr_adapter_nest_wellplate_100ul_pcr_full_skirt/2.json index 013108e6d70..b5a3891c396 100644 --- a/shared-data/labware/definitions/3/opentrons_96_pcr_adapter_nest_wellplate_100ul_pcr_full_skirt/2.json +++ b/shared-data/labware/definitions/3/opentrons_96_pcr_adapter_nest_wellplate_100ul_pcr_full_skirt/2.json @@ -1121,6 +1121,13 @@ "innerLabwareGeometry": { "conicalWell": { "sections": [ + { + "shape": "conical", + "bottomDiameter": 5.26, + "topDiameter": 5.34, + "topHeight": 14.7, + "bottomHeight": 9.89 + }, { "shape": "spherical", "radiusOfCurvature": 3.015, @@ -1133,13 +1140,6 @@ "topDiameter": 5.26, "topHeight": 0.2, "bottomHeight": 9.89 - }, - { - "shape": "conical", - "bottomDiameter": 5.26, - "topDiameter": 5.34, - "topHeight": 14.7, - "bottomHeight": 9.89 } ] } diff --git a/shared-data/labware/definitions/3/opentrons_96_wellplate_200ul_pcr_full_skirt/3.json b/shared-data/labware/definitions/3/opentrons_96_wellplate_200ul_pcr_full_skirt/3.json index d868db657cf..2cfa376d741 100644 --- a/shared-data/labware/definitions/3/opentrons_96_wellplate_200ul_pcr_full_skirt/3.json +++ b/shared-data/labware/definitions/3/opentrons_96_wellplate_200ul_pcr_full_skirt/3.json @@ -1149,10 +1149,11 @@ "conicalWell": { "sections": [ { - "shape": "spherical", - "radiusOfCurvature": 1.25, - "topHeight": 0.8, - "bottomHeight": 0.0 + "shape": "conical", + "bottomDiameter": 5.5, + "topDiameter": 5.5, + "topHeight": 14.95, + "bottomHeight": 11.35 }, { "shape": "conical", @@ -1162,11 +1163,10 @@ "bottomHeight": 0.8 }, { - "shape": "conical", - "bottomDiameter": 5.5, - "topDiameter": 5.5, - "topHeight": 14.95, - "bottomHeight": 11.35 + "shape": "spherical", + "radiusOfCurvature": 1.25, + "topHeight": 0.8, + "bottomHeight": 0.0 } ] } diff --git a/shared-data/labware/definitions/3/thermoscientificnunc_96_wellplate_1300ul/2.json b/shared-data/labware/definitions/3/thermoscientificnunc_96_wellplate_1300ul/2.json index 88007da25ed..a022cc88192 100644 --- a/shared-data/labware/definitions/3/thermoscientificnunc_96_wellplate_1300ul/2.json +++ b/shared-data/labware/definitions/3/thermoscientificnunc_96_wellplate_1300ul/2.json @@ -1115,18 +1115,18 @@ "innerLabwareGeometry": { "conicalWell": { "sections": [ - { - "shape": "spherical", - "radiusOfCurvature": 3.6, - "topHeight": 3.6, - "bottomHeight": 0.0 - }, { "shape": "conical", "bottomDiameter": 7.2, "topDiameter": 8.4, "topHeight": 29.1, "bottomHeight": 3.6 + }, + { + "shape": "spherical", + "radiusOfCurvature": 3.6, + "topHeight": 3.6, + "bottomHeight": 0.0 } ] } diff --git a/shared-data/labware/definitions/3/thermoscientificnunc_96_wellplate_2000ul/2.json b/shared-data/labware/definitions/3/thermoscientificnunc_96_wellplate_2000ul/2.json index e76dca47616..dfa3f26f224 100644 --- a/shared-data/labware/definitions/3/thermoscientificnunc_96_wellplate_2000ul/2.json +++ b/shared-data/labware/definitions/3/thermoscientificnunc_96_wellplate_2000ul/2.json @@ -1115,18 +1115,18 @@ "innerLabwareGeometry": { "conicalWell": { "sections": [ - { - "shape": "spherical", - "radiusOfCurvature": 3.6, - "topHeight": 3.6, - "bottomHeight": 0.0 - }, { "shape": "conical", "bottomDiameter": 7.2, "topDiameter": 8.5, "topHeight": 41.5, "bottomHeight": 3.6 + }, + { + "shape": "spherical", + "radiusOfCurvature": 3.6, + "topHeight": 3.6, + "bottomHeight": 0.0 } ] } diff --git a/shared-data/labware/definitions/3/usascientific_12_reservoir_22ml/2.json b/shared-data/labware/definitions/3/usascientific_12_reservoir_22ml/2.json index bbc013e5d09..2db2ff306a2 100644 --- a/shared-data/labware/definitions/3/usascientific_12_reservoir_22ml/2.json +++ b/shared-data/labware/definitions/3/usascientific_12_reservoir_22ml/2.json @@ -205,11 +205,13 @@ "cuboidalWell": { "sections": [ { - "shape": "spherical", - "radiusOfCurvature": 1.5362, - "topHeight": 0.25, - "bottomHeight": 0.0, - "yCount": 8 + "shape": "cuboidal", + "topXDimension": 8.34, + "topYDimension": 71.85, + "bottomXDimension": 7.9, + "bottomYDimension": 71.75, + "topHeight": 41.75, + "bottomHeight": 4.0 }, { "shape": "squaredcone", @@ -223,13 +225,11 @@ "yCount": 8 }, { - "shape": "cuboidal", - "topXDimension": 8.34, - "topYDimension": 71.85, - "bottomXDimension": 7.9, - "bottomYDimension": 71.75, - "topHeight": 41.75, - "bottomHeight": 4.0 + "shape": "spherical", + "radiusOfCurvature": 1.5362, + "topHeight": 0.25, + "bottomHeight": 0.0, + "yCount": 8 } ] } diff --git a/shared-data/labware/definitions/3/usascientific_96_wellplate_2.4ml_deep/2.json b/shared-data/labware/definitions/3/usascientific_96_wellplate_2.4ml_deep/2.json index d7011a4920e..4e9ecec2a22 100644 --- a/shared-data/labware/definitions/3/usascientific_96_wellplate_2.4ml_deep/2.json +++ b/shared-data/labware/definitions/3/usascientific_96_wellplate_2.4ml_deep/2.json @@ -1212,15 +1212,6 @@ "innerLabwareGeometry": { "cuboidalWell": { "sections": [ - { - "shape": "cuboidal", - "topXDimension": 7.52, - "topYDimension": 7.52, - "bottomXDimension": 0.25, - "bottomYDimension": 0.25, - "topHeight": 2.63, - "bottomHeight": 0.0 - }, { "shape": "cuboidal", "topXDimension": 8.2, @@ -1229,6 +1220,15 @@ "bottomYDimension": 7.52, "topHeight": 41.3, "bottomHeight": 2.63 + }, + { + "shape": "cuboidal", + "topXDimension": 7.52, + "topYDimension": 7.52, + "bottomXDimension": 0.25, + "bottomYDimension": 0.25, + "topHeight": 2.63, + "bottomHeight": 0.0 } ] } diff --git a/shared-data/labware/schemas/3.json b/shared-data/labware/schemas/3.json index d386cbfbb8d..5e02c45a981 100644 --- a/shared-data/labware/schemas/3.json +++ b/shared-data/labware/schemas/3.json @@ -277,7 +277,7 @@ "required": ["sections"], "properties": { "sections": { - "description": "A list of all of the sections of the well that have a contiguous shape", + "description": "A list of all of the sections of the well that have a contiguous shape. Must be ordered from top (highest z) to bottom (lowest z).", "type": "array", "items": { "oneOf": [ diff --git a/shared-data/python/opentrons_shared_data/labware/labware_definition.py b/shared-data/python/opentrons_shared_data/labware/labware_definition.py index 57f86016de5..6a834a8654e 100644 --- a/shared-data/python/opentrons_shared_data/labware/labware_definition.py +++ b/shared-data/python/opentrons_shared_data/labware/labware_definition.py @@ -679,7 +679,7 @@ class Group(BaseModel): class InnerWellGeometry(BaseModel): sections: List[WellSegment] = Field( ..., - description="A list of all of the sections of the well that have a contiguous shape", + description="A list of all of the sections of the well that have a contiguous shape. Must be ordered from top (highest z) to bottom (lowest z).", ) From f9e3f04a7cf239770da280288a3921be0544b2e7 Mon Sep 17 00:00:00 2001 From: Max Marrone Date: Wed, 5 Feb 2025 11:26:31 -0500 Subject: [PATCH 074/150] test(shared-data): Fix schema 3 labware definitions not being tested (#17425) --- .../js/__tests__/labwareDefSchemaV3.test.ts | 61 ++++++++++++------- 1 file changed, 39 insertions(+), 22 deletions(-) diff --git a/shared-data/js/__tests__/labwareDefSchemaV3.test.ts b/shared-data/js/__tests__/labwareDefSchemaV3.test.ts index 4631f327f29..e115dccc570 100644 --- a/shared-data/js/__tests__/labwareDefSchemaV3.test.ts +++ b/shared-data/js/__tests__/labwareDefSchemaV3.test.ts @@ -7,15 +7,13 @@ import Ajv from 'ajv' import schema from '../../labware/schemas/3.json' const fixturesDir = path.join(__dirname, '../../labware/fixtures/3') +const definitionsDir = path.join(__dirname, '../../labware/definitions/3') const globPattern = '**/*.json' const ajv = new Ajv({ allErrors: true, jsonPointers: true }) const validate = ajv.compile(schema) -const checkGeometryDefinitions = ( - labwareDef: LabwareDefinition3, - filename: string -): void => { +const checkGeometryDefinitions = (labwareDef: LabwareDefinition3): void => { test('innerLabwareGeometry sections should be sorted top to bottom', () => { const geometries = Object.values(labwareDef.innerLabwareGeometry ?? []) for (const geometry of geometries) { @@ -27,7 +25,7 @@ const checkGeometryDefinitions = ( } }) - test(`all geometryDefinitionIds specified in {filename} should have an accompanying valid entry in innerLabwareGeometry`, () => { + test('all geometryDefinitionIds should have an accompanying valid entry in innerLabwareGeometry', () => { for (const wellName in labwareDef.wells) { const wellGeometryId = labwareDef.wells[wellName].geometryDefinitionId @@ -43,34 +41,53 @@ const checkGeometryDefinitions = ( expect(wellGeometryId in labwareDef.innerLabwareGeometry).toBe(true) - const wellDepth = labwareDef.wells[wellName].depth - const topFrustumHeight = - labwareDef.innerLabwareGeometry[wellGeometryId].sections[0].topHeight - - expect(wellDepth).toEqual(topFrustumHeight) + // FIXME(mm, 2025-02-04): + // `wellDepth` != `topFrustumHeight` for ~23/60 definitions. + // + // const wellDepth = labwareDef.wells[wellName].depth + // const topFrustumHeight = + // labwareDef.innerLabwareGeometry[wellGeometryId].sections[0].topHeight + // expect(wellDepth).toEqual(topFrustumHeight) } }) } -describe(`test additions to labware schema in v3`, () => { - const labwarePaths = glob.sync(globPattern, { cwd: fixturesDir }) +describe(`test labware definitions with schema v3`, () => { + const definitionPaths = glob.sync(globPattern, { + cwd: definitionsDir, + absolute: true, + }) + const fixturePaths = glob.sync(globPattern, { + cwd: fixturesDir, + absolute: true, + }) + const allPaths = definitionPaths.concat(fixturePaths) - test("definition paths didn't break, which would give false positives", () => { - expect(labwarePaths.length).toBeGreaterThan(0) + test("paths didn't break, which would give false positives", () => { + expect(definitionPaths.length).toBeGreaterThan(0) + expect(fixturePaths.length).toBeGreaterThan(0) }) - describe.each(labwarePaths)('%s', labwarePath => { - const filename = path.parse(labwarePath).base - const fullLabwarePath = path.join(fixturesDir, labwarePath) - const labwareDef = require(fullLabwarePath) as LabwareDefinition3 + describe.each(allPaths)('%s', labwarePath => { + const labwareDef = require(labwarePath) as LabwareDefinition3 - it(`${filename} validates against schema`, () => { + it('validates against schema', () => { const valid = validate(labwareDef) const validationErrors = validate.errors - expect(validationErrors).toBe(null) - expect(valid).toBe(true) + + // FIXME(mm, 2025-02-04): These new definitions have a displayCategory that + // the schema does not recognize. Either they need to change or the schema does. + const expectFailure = [ + 'opentrons_flex_tiprack_lid', + 'opentrons_tough_pcr_auto_sealing_lid', + 'protocol_engine_lid_stack_object', + ].includes(labwareDef.parameters.loadName) + + if (expectFailure) expect(validationErrors).not.toBe(null) + else expect(validationErrors).toBe(null) + expect(valid).toBe(!expectFailure) }) - checkGeometryDefinitions(labwareDef, labwarePath) + checkGeometryDefinitions(labwareDef) }) }) From d0ff21cf049a82dd70d917ef7b47a2e16156f223 Mon Sep 17 00:00:00 2001 From: Seth Foster Date: Wed, 5 Feb 2025 13:57:40 -0500 Subject: [PATCH 075/150] fix(shared-data): tc lids are schema v2 now (#17427) We need to not use any schema v3 labware in 8.3 because we're going to change the schema. The thermocycler lids were only available in schema 3. Change that by making the lid v1 def a schema 2 def, and making a lid v2 def that is a schema 3 def. All the data is the same, and we even kept the stackLimit and added it to labware schema 2, so all the machine behavior should be exactly the same. The only other thing that's not in schema 2 now is the new lid stuff support, but that code isn't in 8.3 so we should be good. Closes EXEC-1180 ## review - seem ok? ## testing - run a smoke test for these. the data is literally all the same and nothing identity checks schemas, just whether data is there, and the same data is all still there. --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: y3rsh <502770+y3rsh@users.noreply.github.com> --- ...2_21_P1000_96_GRIP_HS_MB_TC_TM_Smoke].json | 45 +----- shared-data/js/labware.ts | 2 +- shared-data/js/types.ts | 1 + .../1.json | 9 +- .../2.json | 128 ++++++++++++++++++ shared-data/labware/schemas/2.json | 4 + 6 files changed, 140 insertions(+), 49 deletions(-) rename shared-data/labware/definitions/{3 => 2}/opentrons_tough_pcr_auto_sealing_lid/1.json (88%) create mode 100644 shared-data/labware/definitions/3/opentrons_tough_pcr_auto_sealing_lid/2.json diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2b866b03f3][Flex_S_v2_21_P1000_96_GRIP_HS_MB_TC_TM_Smoke].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2b866b03f3][Flex_S_v2_21_P1000_96_GRIP_HS_MB_TC_TM_Smoke].json index 0454e8ec9c9..6f593ad18e8 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2b866b03f3][Flex_S_v2_21_P1000_96_GRIP_HS_MB_TC_TM_Smoke].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2b866b03f3][Flex_S_v2_21_P1000_96_GRIP_HS_MB_TC_TM_Smoke].json @@ -1248,13 +1248,6 @@ "brand": "Opentrons", "brandId": [] }, - "compatibleParentLabware": [ - "armadillo_96_wellplate_200ul_pcr_full_skirt", - "biorad_96_wellplate_200ul_pcr", - "opentrons_96_wellplate_200ul_pcr_full_skirt", - "opentrons_flex_deck_riser", - "opentrons_tough_pcr_auto_sealing_lid" - ], "cornerOffsetFromSlot": { "x": 0, "y": 0, @@ -1326,7 +1319,7 @@ "loadName": "opentrons_tough_pcr_auto_sealing_lid", "quirks": [] }, - "schemaVersion": 3, + "schemaVersion": 2, "stackLimit": 5, "stackingOffsetWithLabware": { "armadillo_96_wellplate_200ul_pcr_full_skirt": { @@ -1400,13 +1393,6 @@ "brand": "Opentrons", "brandId": [] }, - "compatibleParentLabware": [ - "armadillo_96_wellplate_200ul_pcr_full_skirt", - "biorad_96_wellplate_200ul_pcr", - "opentrons_96_wellplate_200ul_pcr_full_skirt", - "opentrons_flex_deck_riser", - "opentrons_tough_pcr_auto_sealing_lid" - ], "cornerOffsetFromSlot": { "x": 0, "y": 0, @@ -1478,7 +1464,7 @@ "loadName": "opentrons_tough_pcr_auto_sealing_lid", "quirks": [] }, - "schemaVersion": 3, + "schemaVersion": 2, "stackLimit": 5, "stackingOffsetWithLabware": { "armadillo_96_wellplate_200ul_pcr_full_skirt": { @@ -1552,13 +1538,6 @@ "brand": "Opentrons", "brandId": [] }, - "compatibleParentLabware": [ - "armadillo_96_wellplate_200ul_pcr_full_skirt", - "biorad_96_wellplate_200ul_pcr", - "opentrons_96_wellplate_200ul_pcr_full_skirt", - "opentrons_flex_deck_riser", - "opentrons_tough_pcr_auto_sealing_lid" - ], "cornerOffsetFromSlot": { "x": 0, "y": 0, @@ -1630,7 +1609,7 @@ "loadName": "opentrons_tough_pcr_auto_sealing_lid", "quirks": [] }, - "schemaVersion": 3, + "schemaVersion": 2, "stackLimit": 5, "stackingOffsetWithLabware": { "armadillo_96_wellplate_200ul_pcr_full_skirt": { @@ -1704,13 +1683,6 @@ "brand": "Opentrons", "brandId": [] }, - "compatibleParentLabware": [ - "armadillo_96_wellplate_200ul_pcr_full_skirt", - "biorad_96_wellplate_200ul_pcr", - "opentrons_96_wellplate_200ul_pcr_full_skirt", - "opentrons_flex_deck_riser", - "opentrons_tough_pcr_auto_sealing_lid" - ], "cornerOffsetFromSlot": { "x": 0, "y": 0, @@ -1782,7 +1754,7 @@ "loadName": "opentrons_tough_pcr_auto_sealing_lid", "quirks": [] }, - "schemaVersion": 3, + "schemaVersion": 2, "stackLimit": 5, "stackingOffsetWithLabware": { "armadillo_96_wellplate_200ul_pcr_full_skirt": { @@ -1856,13 +1828,6 @@ "brand": "Opentrons", "brandId": [] }, - "compatibleParentLabware": [ - "armadillo_96_wellplate_200ul_pcr_full_skirt", - "biorad_96_wellplate_200ul_pcr", - "opentrons_96_wellplate_200ul_pcr_full_skirt", - "opentrons_flex_deck_riser", - "opentrons_tough_pcr_auto_sealing_lid" - ], "cornerOffsetFromSlot": { "x": 0, "y": 0, @@ -1934,7 +1899,7 @@ "loadName": "opentrons_tough_pcr_auto_sealing_lid", "quirks": [] }, - "schemaVersion": 3, + "schemaVersion": 2, "stackLimit": 5, "stackingOffsetWithLabware": { "armadillo_96_wellplate_200ul_pcr_full_skirt": { diff --git a/shared-data/js/labware.ts b/shared-data/js/labware.ts index 9faa6ced497..d404893bdee 100644 --- a/shared-data/js/labware.ts +++ b/shared-data/js/labware.ts @@ -112,7 +112,7 @@ import opentronsFlex96Tiprack50UlV1Uncasted from '../labware/definitions/2/opent import opentronsFlex96TiprackAdapterV1Uncasted from '../labware/definitions/2/opentrons_flex_96_tiprack_adapter/1.json' import opentronsFlexDeckRiserV1Uncasted from '../labware/definitions/2/opentrons_flex_deck_riser/1.json' import opentronsFlexLidAbsorbancePlateReaderModuleV1Uncasted from '../labware/definitions/2/opentrons_flex_lid_absorbance_plate_reader_module/1.json' -import opentronsToughPcrAutoSealingLidV1Uncasted from '../labware/definitions/3/opentrons_tough_pcr_auto_sealing_lid/1.json' +import opentronsToughPcrAutoSealingLidV1Uncasted from '../labware/definitions/2/opentrons_tough_pcr_auto_sealing_lid/1.json' import opentronsUniversalFlatAdapterV1Uncasted from '../labware/definitions/2/opentrons_universal_flat_adapter/1.json' import opentronsUniversalFlatAdapterCorning384Wellplate112UlFlatV1Uncasted from '../labware/definitions/2/opentrons_universal_flat_adapter_corning_384_wellplate_112ul_flat/1.json' import opentrons96DeepWellTempModAdapterV1Uncasted from '../labware/definitions/2/opentrons_96_deep_well_temp_mod_adapter/1.json' diff --git a/shared-data/js/types.ts b/shared-data/js/types.ts index dab252a54ec..36602ddd0c7 100644 --- a/shared-data/js/types.ts +++ b/shared-data/js/types.ts @@ -256,6 +256,7 @@ export interface LabwareDefinition2 { allowedRoles?: LabwareRoles[] stackingOffsetWithLabware?: Record stackingOffsetWithModule?: Record + stackLimit?: number } export interface LabwareDefinition3 { diff --git a/shared-data/labware/definitions/3/opentrons_tough_pcr_auto_sealing_lid/1.json b/shared-data/labware/definitions/2/opentrons_tough_pcr_auto_sealing_lid/1.json similarity index 88% rename from shared-data/labware/definitions/3/opentrons_tough_pcr_auto_sealing_lid/1.json rename to shared-data/labware/definitions/2/opentrons_tough_pcr_auto_sealing_lid/1.json index 342fd30c4e0..06ff72a5064 100644 --- a/shared-data/labware/definitions/3/opentrons_tough_pcr_auto_sealing_lid/1.json +++ b/shared-data/labware/definitions/2/opentrons_tough_pcr_auto_sealing_lid/1.json @@ -37,7 +37,7 @@ }, "namespace": "opentrons", "version": 1, - "schemaVersion": 3, + "schemaVersion": 2, "stackingOffsetWithModule": { "thermocyclerModuleV2": { "x": 0, @@ -78,13 +78,6 @@ } }, "stackLimit": 5, - "compatibleParentLabware": [ - "armadillo_96_wellplate_200ul_pcr_full_skirt", - "opentrons_96_wellplate_200ul_pcr_full_skirt", - "opentrons_tough_pcr_auto_sealing_lid", - "biorad_96_wellplate_200ul_pcr", - "opentrons_flex_deck_riser" - ], "gripForce": 15, "gripHeightFromLabwareBottom": 7.91, "gripperOffsets": { diff --git a/shared-data/labware/definitions/3/opentrons_tough_pcr_auto_sealing_lid/2.json b/shared-data/labware/definitions/3/opentrons_tough_pcr_auto_sealing_lid/2.json new file mode 100644 index 00000000000..966a3c8472f --- /dev/null +++ b/shared-data/labware/definitions/3/opentrons_tough_pcr_auto_sealing_lid/2.json @@ -0,0 +1,128 @@ +{ + "allowedRoles": ["labware", "lid"], + "ordering": [], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "metadata": { + "displayName": "Opentrons Tough PCR Auto-Sealing Lid", + "displayCategory": "lid", + "displayVolumeUnits": "\u00b5L", + "tags": [] + }, + "dimensions": { + "xDimension": 127.7, + "yDimension": 85.48, + "zDimension": 12.8 + }, + "wells": {}, + "groups": [ + { + "metadata": {}, + "wells": [] + } + ], + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": -0.71 + }, + "parameters": { + "format": "irregular", + "quirks": [], + "isTiprack": false, + "isMagneticModuleCompatible": false, + "loadName": "opentrons_tough_pcr_auto_sealing_lid" + }, + "namespace": "opentrons", + "version": 2, + "schemaVersion": 2, + "stackingOffsetWithModule": { + "thermocyclerModuleV2": { + "x": 0, + "y": 0, + "z": 0 + } + }, + "stackingOffsetWithLabware": { + "default": { + "x": 0, + "y": 0, + "z": 8.193 + }, + "opentrons_tough_pcr_auto_sealing_lid": { + "x": 0, + "y": 0, + "z": 6.492 + }, + "armadillo_96_wellplate_200ul_pcr_full_skirt": { + "x": 0, + "y": 0, + "z": 8.193 + }, + "opentrons_96_wellplate_200ul_pcr_full_skirt": { + "x": 0, + "y": 0, + "z": 8.193 + }, + "biorad_96_wellplate_200ul_pcr": { + "x": 0, + "y": 0, + "z": 8.08 + }, + "opentrons_flex_deck_riser": { + "x": 0, + "y": 0, + "z": 34 + } + }, + "stackLimit": 5, + "compatibleParentLabware": [ + "armadillo_96_wellplate_200ul_pcr_full_skirt", + "opentrons_96_wellplate_200ul_pcr_full_skirt", + "opentrons_tough_pcr_auto_sealing_lid", + "biorad_96_wellplate_200ul_pcr", + "opentrons_flex_deck_riser" + ], + "gripForce": 15, + "gripHeightFromLabwareBottom": 7.91, + "gripperOffsets": { + "default": { + "pickUpOffset": { + "x": 0, + "y": 0, + "z": 1.5 + }, + "dropOffset": { + "x": 0, + "y": 0.52, + "z": -6 + } + }, + "lidOffsets": { + "pickUpOffset": { + "x": 0.5, + "y": 0, + "z": -5 + }, + "dropOffset": { + "x": 0.5, + "y": 0, + "z": -1 + } + }, + "lidDisposalOffsets": { + "pickUpOffset": { + "x": 0, + "y": 0, + "z": 0 + }, + "dropOffset": { + "x": 0, + "y": 5.0, + "z": 50.0 + } + } + } +} diff --git a/shared-data/labware/schemas/2.json b/shared-data/labware/schemas/2.json index 51ff453829a..a6d6f4fbbb3 100644 --- a/shared-data/labware/schemas/2.json +++ b/shared-data/labware/schemas/2.json @@ -391,6 +391,10 @@ "gripHeightFromLabwareBottom": { "type": "number", "description": "Recommended Z-height, from labware bottom to the center of gripper pads, when gripping the labware." + }, + "stackLimit": { + "type": "number", + "description": "The limit representing the maximum stack size for a given labware." } } } From 9d289712decb269e222a24040577822737068cd3 Mon Sep 17 00:00:00 2001 From: Jethary Alcid <66035149+jerader@users.noreply.github.com> Date: Wed, 5 Feb 2025 14:35:24 -0500 Subject: [PATCH 076/150] feat(protocol-designer): introduce new -locationUpdates (#17414) closes AUTH-1396 The goal of this PR is so when importing JSON/python protocols back into PD, we can determine the additionalEquipment entities from `stepForms` instead of reading the commands. This PR introduces a few new `-locationUpdate` keys in `savedStepForms`'s `INITIAL_DECK_SETUP_STEP` step. The locations include: - `trashBinLocationUpdate` - `wasteChuteLocationUpdate` - `gripperLocationUpdate` - `stagingAreaLocationUpdate` --- protocol-designer/cypress/support/import.ts | 49 +- .../protocol/8/doItAllV3MigratedToV8.json | 110 ++-- .../protocol/8/doItAllV4MigratedToV8.json | 60 +- .../protocol/8/doItAllV7MigratedToV8.json | 262 ++++---- .../fixtures/protocol/8/doItAllV8.json | 167 ++--- .../protocol/8/example_1_1_0MigratedToV8.json | 398 ++++++------ .../fixtures/protocol/8/mix_8_0_0.json | 3 + .../8/newAdvancedSettingsAndMultiTemp.json | 50 +- .../8/ninetySixChannelFullAndColumn.json | 56 +- .../8/thermocyclerOnOt2V7MigratedToV8.json | 34 +- protocol-designer/src/constants.ts | 2 + protocol-designer/src/file-types.ts | 3 +- .../src/load-file/migration/8_5_0.ts | 73 +-- .../getAdditionalEquipmentLocationUpdate.ts | 270 ++++++++ .../utils/getMigrationPositionFromTop.ts | 44 ++ .../EditInstrumentsModal/PipetteOverview.tsx | 11 +- .../src/step-forms/actions/additionalItems.ts | 6 +- .../src/step-forms/reducers/index.ts | 430 +++++-------- .../src/step-forms/selectors/index.ts | 6 +- .../src/step-forms/test/utils.test.ts | 575 +++++++++--------- .../src/step-forms/utils/index.ts | 10 +- .../formLevel/getDefaultsForStepType.ts | 4 + .../test/getDefaultsForStepType.test.ts | 4 + 23 files changed, 1436 insertions(+), 1191 deletions(-) create mode 100644 protocol-designer/src/load-file/migration/utils/getAdditionalEquipmentLocationUpdate.ts create mode 100644 protocol-designer/src/load-file/migration/utils/getMigrationPositionFromTop.ts diff --git a/protocol-designer/cypress/support/import.ts b/protocol-designer/cypress/support/import.ts index 829450c2189..3de7ee53ebe 100644 --- a/protocol-designer/cypress/support/import.ts +++ b/protocol-designer/cypress/support/import.ts @@ -104,6 +104,7 @@ export const migrateAndMatchSnapshot = ({ savedFile.designerApplication.version as string ) assert(version !== null, 'PD version is not valid semver') + const isBelowVersion850 = semver.lt(version ?? '', '8.5.0') const files = [savedFile, expectedFile] files.forEach(f => { @@ -111,25 +112,43 @@ export const migrateAndMatchSnapshot = ({ f.designerApplication.data._internalAppBuildDate = 'Foo Date' f.designerApplication.version = 'x.x.x' - Object.values( - f.designerApplication.data.savedStepForms as Record - ).forEach(stepForm => { - const stepFormTyped = stepForm as { - stepType: string - dropTip_location?: string - blowout_location?: string + const savedStepForms = f.designerApplication.data.savedStepForms + const initialDeckSetupStep = '__INITIAL_DECK_SETUP_STEP__' + + // a uuid is randomly generated each time you upload a protocol that is less than version 8_5_0 + // which is the migration version that adds these keys. Due to this, we need to ignore + // the uuids + if (savedStepForms[initialDeckSetupStep] && isBelowVersion850) { + savedStepForms[initialDeckSetupStep].trashBinLocationUpdate = { + trashBin: 'trashLocation', + } + savedStepForms[initialDeckSetupStep].gripperLocationUpdate = { + gripper: 'gripperLocation', } - if (stepFormTyped.stepType === 'moveLiquid') { - stepFormTyped.dropTip_location = 'trash drop tip location' - if (stepFormTyped.blowout_location?.includes('trashBin') ?? false) { + } + + Object.values(savedStepForms as Record).forEach( + stepForm => { + const stepFormTyped = stepForm as { + stepType: string + dropTip_location?: string + blowout_location?: string + } + if (stepFormTyped.stepType === 'moveLiquid') { + stepFormTyped.dropTip_location = 'trash drop tip location' + if ( + stepFormTyped.blowout_location?.includes('trashBin') ?? + false + ) { + stepFormTyped.blowout_location = 'trash blowout location' + } + } + if (stepFormTyped.stepType === 'mix') { + stepFormTyped.dropTip_location = 'trash drop tip location' stepFormTyped.blowout_location = 'trash blowout location' } } - if (stepFormTyped.stepType === 'mix') { - stepFormTyped.dropTip_location = 'trash drop tip location' - stepFormTyped.blowout_location = 'trash blowout location' - } - }) + ) f.commands.forEach((command: { key: string }) => { if ('key' in command) command.key = '123' diff --git a/protocol-designer/fixtures/protocol/8/doItAllV3MigratedToV8.json b/protocol-designer/fixtures/protocol/8/doItAllV3MigratedToV8.json index eb34f8a175c..bfe4767cdff 100644 --- a/protocol-designer/fixtures/protocol/8/doItAllV3MigratedToV8.json +++ b/protocol-designer/fixtures/protocol/8/doItAllV3MigratedToV8.json @@ -6,7 +6,7 @@ "author": "Fixture", "description": "Test all v3 commands", "created": 1585930833548, - "lastModified": 1738157114365, + "lastModified": 1738682273658, "category": null, "subcategory": null, "tags": [] @@ -15,7 +15,7 @@ "name": "opentrons/protocol-designer", "version": "8.5.0", "data": { - "_internalAppBuildDate": "Wed, 29 Jan 2025 13:23:47 GMT", + "_internalAppBuildDate": "Tue, 04 Feb 2025 15:16:30 GMT", "defaultValues": { "aspirate_mmFromBottom": 1, "dispense_mmFromBottom": 1, @@ -135,6 +135,12 @@ "pipetteLocationUpdate": { "0b3f2210-75c7-11ea-b42f-4b64e50f43e5": "left" }, + "trashBinLocationUpdate": { + "bcdf4269-85da-4293-aeb6-bc7eddce6ecf:trashBin": "cutout12" + }, + "wasteChuteLocationUpdate": {}, + "stagingAreaLocationUpdate": {}, + "gripperLocationUpdate": {}, "stepType": "manualIntervention", "id": "__INITIAL_DECK_SETUP_STEP__" }, @@ -162,7 +168,7 @@ "aspirate_y_position": 0, "blowout_checkbox": false, "blowout_flowRate": null, - "blowout_location": "64e49cf0-e3d6-4da3-966f-a3da759c57b8:trashBin", + "blowout_location": "bcdf4269-85da-4293-aeb6-bc7eddce6ecf:trashBin", "blowout_z_offset": 0, "changeTip": "always", "dispense_airGap_checkbox": false, @@ -187,7 +193,7 @@ "dispense_y_position": 0, "disposalVolume_checkbox": true, "disposalVolume_volume": "20", - "dropTip_location": "64e49cf0-e3d6-4da3-966f-a3da759c57b8:trashBin", + "dropTip_location": "bcdf4269-85da-4293-aeb6-bc7eddce6ecf:trashBin", "nozzles": null, "path": "multiDispense", "pipette": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", @@ -228,13 +234,13 @@ "aspirate_flowRate": 40, "blowout_checkbox": true, "blowout_flowRate": 46.43, - "blowout_location": "64e49cf0-e3d6-4da3-966f-a3da759c57b8:trashBin", + "blowout_location": "bcdf4269-85da-4293-aeb6-bc7eddce6ecf:trashBin", "blowout_z_offset": 0, "changeTip": "always", "dispense_delay_checkbox": false, "dispense_delay_seconds": "1", "dispense_flowRate": 35, - "dropTip_location": "64e49cf0-e3d6-4da3-966f-a3da759c57b8:trashBin", + "dropTip_location": "bcdf4269-85da-4293-aeb6-bc7eddce6ecf:trashBin", "labware": "1e610d40-75c7-11ea-b42f-4b64e50f43e5:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1", "mix_mmFromBottom": 0.5, "mix_touchTip_checkbox": true, @@ -2618,7 +2624,7 @@ "commandSchemaId": "opentronsCommandSchemaV8", "commands": [ { - "key": "3bed79e7-58b0-44f7-b69b-f6bbfca92050", + "key": "6419176b-cd87-4854-81de-ff98c98e02ff", "commandType": "loadPipette", "params": { "pipetteName": "p300_single_gen2", @@ -2627,7 +2633,7 @@ } }, { - "key": "4dde1dc9-5acc-472b-a31c-bde389335fa6", + "key": "65aef24f-726a-48de-8791-171484462a98", "commandType": "loadLabware", "params": { "displayName": "Opentrons 96 Tip Rack 300 µL", @@ -2641,7 +2647,7 @@ } }, { - "key": "224b643f-b209-4d3f-99c4-c277ea89bc8f", + "key": "c40e41be-86b5-4895-a9d5-83d3e433085f", "commandType": "loadLabware", "params": { "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", @@ -2655,7 +2661,7 @@ } }, { - "key": "a4e63613-8f60-4bc7-bb1e-112564d35720", + "key": "bbeda67b-78da-4797-89a3-7f8cd1c62af5", "commandType": "loadLabware", "params": { "displayName": "Opentrons 24 Well Aluminum Block with Generic 2 mL Screwcap", @@ -2670,7 +2676,7 @@ }, { "commandType": "loadLiquid", - "key": "c820e00d-268f-4d4c-86ee-cdd27b529efc", + "key": "8bfed0bd-7ea5-4d38-a51e-e8e4ada4a2c5", "params": { "liquidId": "0", "labwareId": "1e610d40-75c7-11ea-b42f-4b64e50f43e5:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1", @@ -2696,7 +2702,7 @@ }, { "commandType": "waitForDuration", - "key": "243817c3-d196-48ca-b644-2869c8831be8", + "key": "7790203c-558f-41b2-b9e3-51945c332c46", "params": { "seconds": 62, "message": "" @@ -2704,7 +2710,7 @@ }, { "commandType": "pickUpTip", - "key": "d9a2045f-f90d-4f38-9853-48ccee28ae19", + "key": "21ecac03-c066-4533-bba7-0c5565022cc1", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "labwareId": "0b44c760-75c7-11ea-b42f-4b64e50f43e5:opentrons/opentrons_96_tiprack_300ul/1", @@ -2713,7 +2719,7 @@ }, { "commandType": "aspirate", - "key": "cd570d0a-52d3-4c05-be48-951c0c697a70", + "key": "7e76d464-1033-44fe-a4c1-7c6eb162f087", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 30, @@ -2732,7 +2738,7 @@ }, { "commandType": "dispense", - "key": "1324b2c8-7000-4eb5-bb99-8044e5d2d4a1", + "key": "e6e1b4e9-e957-424c-899a-12e0d6225812", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 30, @@ -2751,7 +2757,7 @@ }, { "commandType": "aspirate", - "key": "d6fc2391-2fce-4757-841e-b812a0ca7cbd", + "key": "0f7fdf60-f57b-4ddc-8812-de968ac82f1a", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 30, @@ -2770,7 +2776,7 @@ }, { "commandType": "dispense", - "key": "0e182daa-bba3-4709-94a2-c09cadf77049", + "key": "43933543-902f-47e9-9f5f-58c13c404913", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 30, @@ -2789,7 +2795,7 @@ }, { "commandType": "aspirate", - "key": "8e66053b-fea4-4ac1-9509-23dd7371678b", + "key": "8144319f-d13a-4bce-bab3-778fd104bc7e", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 100, @@ -2808,7 +2814,7 @@ }, { "commandType": "touchTip", - "key": "39c918f8-615c-4a0d-99b7-d5439942ced3", + "key": "e3dfde52-41fe-41e0-939a-74de6032ae1a", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "labwareId": "1e610d40-75c7-11ea-b42f-4b64e50f43e5:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1", @@ -2823,7 +2829,7 @@ }, { "commandType": "dispense", - "key": "5f583194-0869-4fc9-93f7-bc07580ff7ba", + "key": "98ea90df-2a74-4fdc-934e-98101d3a1b8a", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 40, @@ -2842,7 +2848,7 @@ }, { "commandType": "touchTip", - "key": "670e4b7e-c246-4fba-8f76-490d0064f8e7", + "key": "7260abd2-176c-4893-8df5-2c8027d9b00d", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "labwareId": "21ed8f60-75c7-11ea-b42f-4b64e50f43e5:opentrons/opentrons_24_aluminumblock_generic_2ml_screwcap/1", @@ -2857,7 +2863,7 @@ }, { "commandType": "dispense", - "key": "40cfe456-331b-43d8-bee0-1806d93b45a2", + "key": "05cd3ff2-9057-40b1-93ce-00aea1817b98", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 40, @@ -2876,7 +2882,7 @@ }, { "commandType": "touchTip", - "key": "b8335845-cabd-4af1-ab1b-1379c7bcd62b", + "key": "6632555e-36f1-48dd-98ce-36304ff52769", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "labwareId": "21ed8f60-75c7-11ea-b42f-4b64e50f43e5:opentrons/opentrons_24_aluminumblock_generic_2ml_screwcap/1", @@ -2891,7 +2897,7 @@ }, { "commandType": "moveToAddressableArea", - "key": "c1d8d6b9-1a62-456f-8ca5-c4f21b3af4f3", + "key": "44dfa5fa-72bf-4ff7-a15a-7eb28641d6fa", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "addressableAreaName": "fixedTrash", @@ -2904,7 +2910,7 @@ }, { "commandType": "blowOutInPlace", - "key": "8352e715-668b-4f80-aa35-0d2776137243", + "key": "46471c16-ca43-4756-a2c0-aac770de55af", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "flowRate": 46.43 @@ -2912,7 +2918,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "79c8d331-5c79-4f03-b8c5-4dc4b3315546", + "key": "46b7a955-be07-4d7b-be96-390cecc365de", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "addressableAreaName": "fixedTrash", @@ -2926,21 +2932,21 @@ }, { "commandType": "dropTipInPlace", - "key": "52ee7e0d-ccb4-4e1e-b706-0ee8f9037bcb", + "key": "36a530a3-7a1c-4a93-8096-62e627866160", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5" } }, { "commandType": "waitForResume", - "key": "add4e276-fc31-4b72-a3c5-612506159a10", + "key": "d326737f-cbea-478a-ada0-9f203daf4b25", "params": { "message": "Wait until user intervention" } }, { "commandType": "pickUpTip", - "key": "c3ced120-cd18-4abf-9e89-0cacea5a5da6", + "key": "6f000bcb-b2d0-4064-a68f-71760550bd06", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "labwareId": "0b44c760-75c7-11ea-b42f-4b64e50f43e5:opentrons/opentrons_96_tiprack_300ul/1", @@ -2949,7 +2955,7 @@ }, { "commandType": "aspirate", - "key": "cc110c4c-0d07-4373-919a-7941b288a0f8", + "key": "40646531-5cc5-4cf6-a0d0-21a5ce517ce9", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 35, @@ -2968,7 +2974,7 @@ }, { "commandType": "dispense", - "key": "61d7a6ed-1fb7-4c5f-b8c0-b8a02385a9a5", + "key": "58d50ea9-5ec1-4b21-ba19-f0ba8d3d420b", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 35, @@ -2987,7 +2993,7 @@ }, { "commandType": "aspirate", - "key": "1e1174dd-f3e9-446a-9e3d-46c68958487d", + "key": "6e151ed2-4cc1-4be3-ad2c-32457158e267", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 35, @@ -3006,7 +3012,7 @@ }, { "commandType": "dispense", - "key": "fc92a66c-c81d-4645-9761-17b82eace5ca", + "key": "9fedc83e-e57e-40ff-9c38-13d83c803bba", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 35, @@ -3025,7 +3031,7 @@ }, { "commandType": "aspirate", - "key": "d5ae7a38-aa11-47ea-a3a9-72dcc81bbed3", + "key": "c1815836-420a-425d-8a55-3615b34e99ea", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 35, @@ -3044,7 +3050,7 @@ }, { "commandType": "dispense", - "key": "96411ac4-fe34-4d79-8197-69be37727d22", + "key": "0cacce9a-e295-489e-a4a9-b02a06f7110e", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 35, @@ -3063,7 +3069,7 @@ }, { "commandType": "moveToAddressableArea", - "key": "2c6a94b7-ded9-4613-8440-07d61d1aeab9", + "key": "cdc11c6e-25ab-4829-bef8-3081c5dc7de9", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "addressableAreaName": "fixedTrash", @@ -3076,7 +3082,7 @@ }, { "commandType": "blowOutInPlace", - "key": "388ff506-8805-43c4-a28d-fdb1d71af2d6", + "key": "b19f51af-7b62-4943-94f7-e7a9d8126ca8", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "flowRate": 46.43 @@ -3084,7 +3090,7 @@ }, { "commandType": "touchTip", - "key": "e5af286f-12fb-4f6a-9ce9-fdc4a2e630df", + "key": "00297047-f664-4682-8b60-d0ff5b7fa2d5", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "labwareId": "1e610d40-75c7-11ea-b42f-4b64e50f43e5:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1", @@ -3099,7 +3105,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "e2e64d0a-98f7-44b2-a30e-55f947ce383b", + "key": "60374221-4dae-45fc-9571-30981f3e54e3", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "addressableAreaName": "fixedTrash", @@ -3113,14 +3119,14 @@ }, { "commandType": "dropTipInPlace", - "key": "c66dab4c-5675-468f-a202-be5136e26d97", + "key": "f4ed4d99-695e-4c33-b451-c96b3a8fe6f8", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5" } }, { "commandType": "pickUpTip", - "key": "9b0ee879-5d40-44b4-b8d6-7de4dc308448", + "key": "2d3f2caa-2b46-450e-a5bd-ab8d2f5a1b61", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "labwareId": "0b44c760-75c7-11ea-b42f-4b64e50f43e5:opentrons/opentrons_96_tiprack_300ul/1", @@ -3129,7 +3135,7 @@ }, { "commandType": "aspirate", - "key": "59c5aff6-b946-4846-84a3-68701edbd869", + "key": "1405face-d940-42a8-aa3d-c3dcfdf9f819", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 35, @@ -3148,7 +3154,7 @@ }, { "commandType": "dispense", - "key": "4b1e2446-55b0-4503-8528-c446066b8f95", + "key": "6e29b113-6ffc-4b92-b7c9-f6639ba502ff", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 35, @@ -3167,7 +3173,7 @@ }, { "commandType": "aspirate", - "key": "1454a903-58ab-401b-ba6e-682ee6144051", + "key": "4fa89603-362f-4526-b19a-9e8cb1c2cf9f", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 35, @@ -3186,7 +3192,7 @@ }, { "commandType": "dispense", - "key": "b0f636be-6cce-4d2d-8526-51c80ed8fbe1", + "key": "dc862f46-d111-44e8-aeec-b8e55bba3271", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 35, @@ -3205,7 +3211,7 @@ }, { "commandType": "aspirate", - "key": "c2ad1175-0a40-4982-9fa9-1354744ca6d4", + "key": "6fb0201b-6839-44ce-86b6-c384cd763c9b", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 35, @@ -3224,7 +3230,7 @@ }, { "commandType": "dispense", - "key": "d1147be5-d627-48ca-97a9-c92e643b313a", + "key": "f6b42a01-340b-43f7-b9fa-25cc68612df2", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 35, @@ -3243,7 +3249,7 @@ }, { "commandType": "moveToAddressableArea", - "key": "563170a0-0e79-4992-8f1c-830653392ef7", + "key": "48da44e2-869a-4af8-9001-d165a3b86b0e", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "addressableAreaName": "fixedTrash", @@ -3256,7 +3262,7 @@ }, { "commandType": "blowOutInPlace", - "key": "40f0e993-5b4b-4d9e-b9df-a7ef8a3bdf9b", + "key": "b1181ea5-9121-4bde-a3f4-fc67f4059aa6", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "flowRate": 46.43 @@ -3264,7 +3270,7 @@ }, { "commandType": "touchTip", - "key": "19a60b57-c610-4df1-88a2-5259038b3687", + "key": "f102022c-8365-490f-a7e4-cbc11395bd57", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "labwareId": "1e610d40-75c7-11ea-b42f-4b64e50f43e5:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1", @@ -3279,7 +3285,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "f703c506-0bf4-4736-9790-7eab435672ae", + "key": "750b4051-6a23-4c0b-b999-e68a1d9285fd", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "addressableAreaName": "fixedTrash", @@ -3293,7 +3299,7 @@ }, { "commandType": "dropTipInPlace", - "key": "49ded239-d74e-4a3f-944d-0b307cfa3de1", + "key": "4b4dcf1d-59e7-4691-aa73-9a159c72cd74", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5" } diff --git a/protocol-designer/fixtures/protocol/8/doItAllV4MigratedToV8.json b/protocol-designer/fixtures/protocol/8/doItAllV4MigratedToV8.json index b008ecabf73..5ef201e8e50 100644 --- a/protocol-designer/fixtures/protocol/8/doItAllV4MigratedToV8.json +++ b/protocol-designer/fixtures/protocol/8/doItAllV4MigratedToV8.json @@ -6,7 +6,7 @@ "author": "Fixture", "description": "Test all v4 commands", "created": 1585930833548, - "lastModified": 1738157148111, + "lastModified": 1738682299723, "category": null, "subcategory": null, "tags": [] @@ -15,7 +15,7 @@ "name": "opentrons/protocol-designer", "version": "8.5.0", "data": { - "_internalAppBuildDate": "Wed, 29 Jan 2025 13:23:47 GMT", + "_internalAppBuildDate": "Tue, 04 Feb 2025 15:16:30 GMT", "defaultValues": { "aspirate_mmFromBottom": 1, "dispense_mmFromBottom": 1, @@ -138,6 +138,12 @@ "pipetteLocationUpdate": { "0b3f2210-75c7-11ea-b42f-4b64e50f43e5": "left" }, + "trashBinLocationUpdate": { + "8c280499-46f1-4a7c-9096-553e87fe9d1e:trashBin": "cutout12" + }, + "wasteChuteLocationUpdate": {}, + "stagingAreaLocationUpdate": {}, + "gripperLocationUpdate": {}, "stepType": "manualIntervention", "id": "__INITIAL_DECK_SETUP_STEP__" }, @@ -194,7 +200,7 @@ "aspirate_y_position": 0, "blowout_checkbox": false, "blowout_flowRate": null, - "blowout_location": "9bf036e9-ccfd-4732-80bc-d366731ce6d1:trashBin", + "blowout_location": "8c280499-46f1-4a7c-9096-553e87fe9d1e:trashBin", "blowout_z_offset": 0, "changeTip": "always", "dispense_airGap_checkbox": false, @@ -219,7 +225,7 @@ "dispense_y_position": 0, "disposalVolume_checkbox": true, "disposalVolume_volume": "20", - "dropTip_location": "9bf036e9-ccfd-4732-80bc-d366731ce6d1:trashBin", + "dropTip_location": "8c280499-46f1-4a7c-9096-553e87fe9d1e:trashBin", "nozzles": null, "path": "single", "pipette": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", @@ -2640,7 +2646,7 @@ "commandSchemaId": "opentronsCommandSchemaV8", "commands": [ { - "key": "8f11bef2-009b-4a4d-99f3-7c710ada996b", + "key": "f18c57de-1196-4656-9149-6f8f519ded50", "commandType": "loadPipette", "params": { "pipetteName": "p300_single_gen2", @@ -2649,7 +2655,7 @@ } }, { - "key": "9a510ad2-a606-4227-86e5-14635f3ec519", + "key": "f659bbae-c163-4770-ba70-94d779944e3e", "commandType": "loadModule", "params": { "model": "magneticModuleV2", @@ -2660,7 +2666,7 @@ } }, { - "key": "c98334f7-8f68-4f0b-9ff3-d98a85764e19", + "key": "211b1d23-4554-4fcb-9053-9b7620f3370a", "commandType": "loadModule", "params": { "model": "temperatureModuleV2", @@ -2671,7 +2677,7 @@ } }, { - "key": "692d8775-0de4-472c-9e1a-0a7458e6c080", + "key": "02c8120e-ca2c-4fa2-a48c-0bf29c82d552", "commandType": "loadLabware", "params": { "displayName": "Opentrons 96 Tip Rack 300 µL", @@ -2685,7 +2691,7 @@ } }, { - "key": "2f354149-0585-4fe6-ac4d-571e5d020f9a", + "key": "692d6fc7-be48-40ae-8b96-46a6ae939af3", "commandType": "loadLabware", "params": { "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", @@ -2699,7 +2705,7 @@ } }, { - "key": "e873508f-7a6b-472a-88cc-4d83a0d9d303", + "key": "e96ea68c-e1e6-43f2-a4b2-213372f41623", "commandType": "loadLabware", "params": { "displayName": "Opentrons 24 Well Aluminum Block with Generic 2 mL Screwcap", @@ -2714,7 +2720,7 @@ }, { "commandType": "loadLiquid", - "key": "0a0b8038-bf92-4829-9d3b-cd6e950aafd1", + "key": "8e9bdf50-5ef7-451f-9d0e-95015241fc6e", "params": { "liquidId": "0", "labwareId": "1e610d40-75c7-11ea-b42f-4b64e50f43e5:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1", @@ -2740,7 +2746,7 @@ }, { "commandType": "magneticModule/engage", - "key": "7d74d316-4910-4827-836e-bb211eb6f9f0", + "key": "77b1d364-2ab1-4a4e-8fae-a9ecf4b88323", "params": { "moduleId": "0b419310-75c7-11ea-b42f-4b64e50f43e5:magneticModuleType", "height": 6 @@ -2748,7 +2754,7 @@ }, { "commandType": "temperatureModule/setTargetTemperature", - "key": "200de5f5-905a-4ea8-b48f-95b748597b56", + "key": "11956c88-bcad-4580-9036-869cc86a7b6b", "params": { "moduleId": "0b4319b0-75c7-11ea-b42f-4b64e50f43e5:temperatureModuleType", "celsius": 25 @@ -2756,7 +2762,7 @@ }, { "commandType": "waitForDuration", - "key": "93982f84-7c02-4609-aac0-916c85341221", + "key": "c9520683-6f9d-44ae-b158-3f5de7b1a4b5", "params": { "seconds": 62, "message": "" @@ -2764,7 +2770,7 @@ }, { "commandType": "pickUpTip", - "key": "8336f57c-7e0d-41a7-b4a7-d76b6436c073", + "key": "56cecd58-ca52-433d-aa71-98d59558d388", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "labwareId": "0b44c760-75c7-11ea-b42f-4b64e50f43e5:opentrons/opentrons_96_tiprack_300ul/1", @@ -2773,7 +2779,7 @@ }, { "commandType": "aspirate", - "key": "c7ada14a-1730-4237-9a6a-b9c9659cc70a", + "key": "e5f246a4-3ebf-4f73-99c9-2a69ad19f4bc", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 30, @@ -2792,7 +2798,7 @@ }, { "commandType": "dispense", - "key": "cb1db2cb-2901-4fac-9953-84227b284de9", + "key": "fb1f0bb6-8f12-4662-be15-7e8d49368112", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 30, @@ -2811,7 +2817,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "3b131455-38d8-4657-a72a-154e3e2e79c9", + "key": "321568ae-8d86-4c60-9ff3-2af0e73b6ab1", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "addressableAreaName": "fixedTrash", @@ -2825,14 +2831,14 @@ }, { "commandType": "dropTipInPlace", - "key": "7fbc3b35-82c0-4db1-83ba-f079d1b6f8a7", + "key": "d432d161-9da6-462d-a757-196de673d3d4", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5" } }, { "commandType": "pickUpTip", - "key": "8facdb58-99b9-4838-8276-7c0e834ec587", + "key": "1fd1fdbf-592a-43f4-99ad-b1e5c3b1feab", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "labwareId": "0b44c760-75c7-11ea-b42f-4b64e50f43e5:opentrons/opentrons_96_tiprack_300ul/1", @@ -2841,7 +2847,7 @@ }, { "commandType": "aspirate", - "key": "3284fa14-23dd-40c2-8e93-74ccd0ebb309", + "key": "8af4e21b-c9da-4dc9-b033-3f2ae823fa4c", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 30, @@ -2860,7 +2866,7 @@ }, { "commandType": "dispense", - "key": "f713e4a5-f9f0-4814-8856-c606f88d26e1", + "key": "6b4526b1-4738-4600-9920-53881f0735c8", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 30, @@ -2879,7 +2885,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "b05b8e43-b996-49d3-b5fe-0197a66783e9", + "key": "0510a4d6-796d-4917-8a2f-f26a19078091", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "addressableAreaName": "fixedTrash", @@ -2893,14 +2899,14 @@ }, { "commandType": "dropTipInPlace", - "key": "dc46cc37-9c1b-4da3-b8fc-60fff04b758c", + "key": "69bac7a6-d8a0-4674-9b7f-5b8b0174d765", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5" } }, { "commandType": "temperatureModule/waitForTemperature", - "key": "d71653aa-0905-4d08-aa6c-661389fee829", + "key": "d58f0651-b95c-4997-a06d-017fab7c27e4", "params": { "moduleId": "0b4319b0-75c7-11ea-b42f-4b64e50f43e5:temperatureModuleType", "celsius": 25 @@ -2908,14 +2914,14 @@ }, { "commandType": "magneticModule/disengage", - "key": "a156c1ba-2508-46b5-8318-f735bb8b42bb", + "key": "92a4f6f7-521f-42d7-aa0a-c8553fc11333", "params": { "moduleId": "0b419310-75c7-11ea-b42f-4b64e50f43e5:magneticModuleType" } }, { "commandType": "waitForResume", - "key": "c53a9aa2-c092-45d5-b427-2f2c6c7c9b8b", + "key": "df776ec4-c8ef-416b-be42-1b2ea7ef51bc", "params": { "message": "Wait until user intervention" } diff --git a/protocol-designer/fixtures/protocol/8/doItAllV7MigratedToV8.json b/protocol-designer/fixtures/protocol/8/doItAllV7MigratedToV8.json index 5b51d300ff3..17257c9b64d 100644 --- a/protocol-designer/fixtures/protocol/8/doItAllV7MigratedToV8.json +++ b/protocol-designer/fixtures/protocol/8/doItAllV7MigratedToV8.json @@ -6,7 +6,7 @@ "author": "", "description": "", "created": 1689346890165, - "lastModified": 1738157178084, + "lastModified": 1738682341234, "category": null, "subcategory": null, "tags": [] @@ -15,7 +15,7 @@ "name": "opentrons/protocol-designer", "version": "8.5.0", "data": { - "_internalAppBuildDate": "Wed, 29 Jan 2025 13:23:47 GMT", + "_internalAppBuildDate": "Tue, 04 Feb 2025 15:16:30 GMT", "defaultValues": { "aspirate_mmFromBottom": 1, "dispense_mmFromBottom": 1, @@ -120,6 +120,14 @@ "2e7c6344-58ab-465c-b542-489883cb63fe": "left", "6d1e53c3-2db3-451b-ad60-3fe13781a193": "right" }, + "trashBinLocationUpdate": { + "302cf064-0438-4a62-9ce5-a80556c04cf2:trashBin": "cutoutA3" + }, + "wasteChuteLocationUpdate": {}, + "stagingAreaLocationUpdate": {}, + "gripperLocationUpdate": { + "08c02e37-4783-4c70-89bd-1f72ddb37a37:gripper": "mounted" + }, "stepType": "manualIntervention", "id": "__INITIAL_DECK_SETUP_STEP__" }, @@ -211,7 +219,7 @@ "aspirate_y_position": 0, "blowout_checkbox": false, "blowout_flowRate": null, - "blowout_location": "ba8cacad-80e9-4cb8-b16e-12a5dc3669f0:trashBin", + "blowout_location": "302cf064-0438-4a62-9ce5-a80556c04cf2:trashBin", "blowout_z_offset": 0, "changeTip": "always", "dispense_airGap_checkbox": false, @@ -236,7 +244,7 @@ "dispense_y_position": 0, "disposalVolume_checkbox": true, "disposalVolume_volume": "100", - "dropTip_location": "ba8cacad-80e9-4cb8-b16e-12a5dc3669f0:trashBin", + "dropTip_location": "302cf064-0438-4a62-9ce5-a80556c04cf2:trashBin", "nozzles": null, "path": "single", "pipette": "2e7c6344-58ab-465c-b542-489883cb63fe", @@ -255,13 +263,13 @@ "aspirate_flowRate": null, "blowout_checkbox": false, "blowout_flowRate": null, - "blowout_location": "ba8cacad-80e9-4cb8-b16e-12a5dc3669f0:trashBin", + "blowout_location": "302cf064-0438-4a62-9ce5-a80556c04cf2:trashBin", "blowout_z_offset": 0, "changeTip": "always", "dispense_delay_checkbox": false, "dispense_delay_seconds": "1", "dispense_flowRate": null, - "dropTip_location": "ba8cacad-80e9-4cb8-b16e-12a5dc3669f0:trashBin", + "dropTip_location": "302cf064-0438-4a62-9ce5-a80556c04cf2:trashBin", "labware": "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", "mix_mmFromBottom": 0.5, "mix_touchTip_checkbox": false, @@ -3867,7 +3875,7 @@ "commandSchemaId": "opentronsCommandSchemaV8", "commands": [ { - "key": "086f94d9-065f-4c44-8006-caf80b83783c", + "key": "f265d7a8-ea31-479c-8908-2e14bb0c9bd6", "commandType": "loadPipette", "params": { "pipetteName": "p1000_single_flex", @@ -3876,7 +3884,7 @@ } }, { - "key": "505163b8-41fd-4983-93a7-be71a7d6ae9c", + "key": "91f878d6-9229-4f2f-94d1-3d7ee7e9f698", "commandType": "loadPipette", "params": { "pipetteName": "p50_multi_flex", @@ -3885,7 +3893,7 @@ } }, { - "key": "aec18895-04b5-4fef-a696-77741e3aea42", + "key": "63f60970-b543-4c00-a945-957a7c4c2be3", "commandType": "loadModule", "params": { "model": "magneticBlockV1", @@ -3896,7 +3904,7 @@ } }, { - "key": "f36b8ebe-0c9b-41bc-a1c0-eb754f7648f2", + "key": "789473a8-de30-4530-852d-ad88c445ed8c", "commandType": "loadModule", "params": { "model": "heaterShakerModuleV1", @@ -3907,7 +3915,7 @@ } }, { - "key": "8db7cf16-2bf4-404d-9112-08c448797f28", + "key": "9fa18898-60a7-4773-8977-545029d36c0d", "commandType": "loadModule", "params": { "model": "temperatureModuleV2", @@ -3918,7 +3926,7 @@ } }, { - "key": "cfe53e87-ab1d-487a-b48c-d7ae8f82da0f", + "key": "2beee7c0-d00b-4e41-b301-881c2fb5cc1b", "commandType": "loadModule", "params": { "model": "thermocyclerModuleV2", @@ -3929,7 +3937,7 @@ } }, { - "key": "625d5aa2-3b3e-4eea-8255-906705b30f56", + "key": "68412459-534c-461f-a207-d728cec975ae", "commandType": "loadLabware", "params": { "displayName": "Opentrons 96 Flat Bottom Heater-Shaker Adapter", @@ -3943,7 +3951,7 @@ } }, { - "key": "01f439b9-bd14-4b2a-829a-04dc59532b28", + "key": "5bcbacbc-5cca-4bf9-805c-25c164337ac8", "commandType": "loadLabware", "params": { "displayName": "Opentrons Flex 96 Filter Tip Rack 50 µL", @@ -3957,7 +3965,7 @@ } }, { - "key": "ce2c9a52-8e8c-4499-a9f4-28d875310ddc", + "key": "1ce1022c-ecca-4cc9-bf5f-160f5bd31798", "commandType": "loadLabware", "params": { "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", @@ -3971,7 +3979,7 @@ } }, { - "key": "8e919382-c46f-4715-8acc-3e89d9ad20da", + "key": "ddcf60bc-f272-4cc5-9e47-9bcac0e99991", "commandType": "loadLabware", "params": { "displayName": "Opentrons 24 Well Aluminum Block with NEST 1.5 mL Snapcap", @@ -3985,7 +3993,7 @@ } }, { - "key": "e3c83855-cea3-4c64-9a83-4569d7ec6c1c", + "key": "6f98dbb8-15f2-4fe1-bde1-4e5964e610e8", "commandType": "loadLabware", "params": { "displayName": "NEST 96 Well Plate 200 µL Flat", @@ -4000,7 +4008,7 @@ }, { "commandType": "loadLiquid", - "key": "4e2f124b-fdbd-4468-b13f-ff623614c7d5", + "key": "0f2a8671-36fc-47a4-a82b-30c740665573", "params": { "liquidId": "1", "labwareId": "a793a135-06aa-4ed6-a1d3-c176c7810afa:opentrons/opentrons_24_aluminumblock_nest_1.5ml_snapcap/1", @@ -4011,7 +4019,7 @@ }, { "commandType": "loadLiquid", - "key": "d1b5d49e-0c3a-4fcf-8908-d5683f62ef8d", + "key": "b282401a-e28e-4f5c-a6ec-506cedfa3eb5", "params": { "liquidId": "0", "labwareId": "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", @@ -4029,7 +4037,7 @@ }, { "commandType": "temperatureModule/setTargetTemperature", - "key": "92fc9b4c-1952-447a-a6fa-d3f8c572f74c", + "key": "eb2202f7-0004-47ff-9b37-2b914259d64b", "params": { "moduleId": "ef44ad7f-0fd9-46d6-8bc0-c70785644cc8:temperatureModuleType", "celsius": 4 @@ -4037,7 +4045,7 @@ }, { "commandType": "heaterShaker/waitForTemperature", - "key": "a0a69251-318f-42df-953f-de79a0caf8c7", + "key": "dc7697a9-0490-4327-a4e0-0d2268cee8a8", "params": { "moduleId": "c19dffa3-cb34-4702-bcf6-dcea786257d1:heaterShakerModuleType", "celsius": 4 @@ -4045,14 +4053,14 @@ }, { "commandType": "thermocycler/closeLid", - "key": "86747e7e-5adf-4739-8372-da00fd6081f0", + "key": "fa3191c0-243e-4b4c-bf7f-6bb16e6626fc", "params": { "moduleId": "627b7a27-5bb7-46de-a530-67af45652e3b:thermocyclerModuleType" } }, { "commandType": "thermocycler/setTargetLidTemperature", - "key": "2c00f180-7898-461e-a7a2-d087e92812bb", + "key": "b9d2da30-cf26-41a6-8946-d2c70323ef91", "params": { "moduleId": "627b7a27-5bb7-46de-a530-67af45652e3b:thermocyclerModuleType", "celsius": 40 @@ -4060,14 +4068,14 @@ }, { "commandType": "thermocycler/waitForLidTemperature", - "key": "64440fd5-a728-4ad3-b5ac-8f952d0f6a10", + "key": "3f3acf32-7d90-4a54-b20f-55ebf801519b", "params": { "moduleId": "627b7a27-5bb7-46de-a530-67af45652e3b:thermocyclerModuleType" } }, { "commandType": "thermocycler/runProfile", - "key": "b5b4ff79-43a7-4ff5-91a1-fdc9e481190a", + "key": "b22bef2a-43d2-45da-ac7c-1f536ef436c6", "params": { "moduleId": "627b7a27-5bb7-46de-a530-67af45652e3b:thermocyclerModuleType", "profile": [ @@ -4085,28 +4093,28 @@ }, { "commandType": "thermocycler/deactivateBlock", - "key": "4105ee32-8759-4410-b87f-15d19fa555dd", + "key": "658817ba-e619-4a4b-9869-08d7b65b9c3f", "params": { "moduleId": "627b7a27-5bb7-46de-a530-67af45652e3b:thermocyclerModuleType" } }, { "commandType": "thermocycler/deactivateLid", - "key": "7b8c3e27-58d7-4385-a1e9-3e4353b6c837", + "key": "84525785-eac5-49a8-a651-b1c41694bc8d", "params": { "moduleId": "627b7a27-5bb7-46de-a530-67af45652e3b:thermocyclerModuleType" } }, { "commandType": "thermocycler/openLid", - "key": "155179f3-86a7-4588-ade0-7f68fe5f0254", + "key": "aba48bb7-787f-45a2-a168-b0152b4ef8dd", "params": { "moduleId": "627b7a27-5bb7-46de-a530-67af45652e3b:thermocyclerModuleType" } }, { "commandType": "pickUpTip", - "key": "4460ed34-d392-47ec-acc1-be1b1193282e", + "key": "bbe616eb-f6b9-41d5-b493-6b0c41a39571", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4115,7 +4123,7 @@ }, { "commandType": "aspirate", - "key": "5d23683a-9a8b-4e0f-a934-faf55d04e62b", + "key": "9888f41d-7b3d-430d-8559-449bfa6040d2", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4134,7 +4142,7 @@ }, { "commandType": "dispense", - "key": "2ce5f9af-f4d3-4467-92f1-4a748db40c60", + "key": "3aaaeb62-8ff0-4a8c-9373-53bf404f37db", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4153,7 +4161,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "a6c0a9ba-3986-4c58-9423-30d802dc7aa4", + "key": "23d49cfb-0387-415b-9d03-c6f67d5448d7", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", @@ -4167,14 +4175,14 @@ }, { "commandType": "dropTipInPlace", - "key": "0e93144b-9c3d-4444-b69e-a2aa5a731886", + "key": "fc7a5edf-6500-4a65-ad28-72d0ce576d8b", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } }, { "commandType": "pickUpTip", - "key": "5a636309-7090-49fc-8630-c1d00b014427", + "key": "c922a053-4b6f-4526-9447-42d907785d0e", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4183,7 +4191,7 @@ }, { "commandType": "aspirate", - "key": "dfe14619-1011-4e6d-a6f5-ec4412332cb1", + "key": "56136b24-573e-4025-b491-b41d6c6771a8", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4202,7 +4210,7 @@ }, { "commandType": "dispense", - "key": "d47fae77-e4b8-47bd-8749-ed3b1ae597a5", + "key": "225b7a34-db3e-4d33-9068-3edc597d5624", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4221,7 +4229,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "152e5896-8695-4805-b85c-819db216921c", + "key": "8e2e3fe7-80db-446c-9126-87590ba95471", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", @@ -4235,14 +4243,14 @@ }, { "commandType": "dropTipInPlace", - "key": "a85f27c1-2384-4da8-98a8-108836e8eb71", + "key": "997fa5ed-e3e9-4187-88d2-7375cb83f16c", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } }, { "commandType": "pickUpTip", - "key": "d45ffd65-eff6-4a8b-bd6f-5abde6dbf388", + "key": "4fbb8d44-4c69-4ab1-874f-e357d868d1b9", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4251,7 +4259,7 @@ }, { "commandType": "aspirate", - "key": "ea9a5388-329c-4587-8363-549269e6a4c8", + "key": "4f707665-6a5b-4668-a9c4-5fd00370475a", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4270,7 +4278,7 @@ }, { "commandType": "dispense", - "key": "d496cd3f-2189-438e-b9d5-95c698d8a6c0", + "key": "540f30fc-b8f8-4f05-8182-0a12c3647b01", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4289,7 +4297,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "7c444a4b-626d-449c-98a9-beeaf09e9196", + "key": "9a0e07ae-4c90-4b7e-b353-3ca7fc993ca7", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", @@ -4303,14 +4311,14 @@ }, { "commandType": "dropTipInPlace", - "key": "168dc853-1c29-4304-aa4c-5d706d2863a9", + "key": "b4116910-b28e-4e71-8a7b-dfb41cc99204", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } }, { "commandType": "pickUpTip", - "key": "3e501992-3a68-48a3-8a35-c97f6d922fb5", + "key": "c777b30d-05c8-4dc7-af5d-c41acaa617df", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4319,7 +4327,7 @@ }, { "commandType": "aspirate", - "key": "e414d931-38f5-4ca3-93e0-28ab8d09a5ce", + "key": "106c22bd-295a-44e9-8dfb-580348ba8cc2", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4338,7 +4346,7 @@ }, { "commandType": "dispense", - "key": "1b30be1e-9ab1-4ad2-8528-d0aac15649be", + "key": "1316892d-4ba4-4c8d-bdc6-117478905f1e", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4357,7 +4365,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "333263db-9887-48f9-9cec-5e76264d02de", + "key": "c53a4989-107d-4e0d-a12a-39ef4558abe7", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", @@ -4371,14 +4379,14 @@ }, { "commandType": "dropTipInPlace", - "key": "0613a633-8c69-4273-a40b-25f7d432b9ef", + "key": "b5ad828c-bd7f-4de9-b421-904c31eba20a", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } }, { "commandType": "pickUpTip", - "key": "dce17552-dc58-4420-9566-720bd62d2723", + "key": "be671102-5e97-4a4b-b863-f05d8aca05b8", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4387,7 +4395,7 @@ }, { "commandType": "aspirate", - "key": "d102217f-33c0-4f6d-81e8-ebfa23227b3b", + "key": "ceaa9cc8-30da-4161-a76b-91946d48995b", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4406,7 +4414,7 @@ }, { "commandType": "dispense", - "key": "5624dd4a-9428-4764-b72b-854c372ac9b9", + "key": "e6a5d225-a65b-4c22-b6fa-f865a64473f8", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4425,7 +4433,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "c9bb306f-9769-4fdf-8425-e6ef485b8053", + "key": "b14be9e9-2970-411e-b1d1-7f1e94e52f5c", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", @@ -4439,14 +4447,14 @@ }, { "commandType": "dropTipInPlace", - "key": "4d34ac41-1e14-47dc-bddd-e035bc34562c", + "key": "4bff8b00-01b9-442d-88dc-3dba96e2d069", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } }, { "commandType": "pickUpTip", - "key": "0737c0cc-cf01-4fa0-b624-ba162f8a5daf", + "key": "600313ef-a0a0-49f2-bc0a-f348297314f9", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4455,7 +4463,7 @@ }, { "commandType": "aspirate", - "key": "d121c382-86f2-4743-b043-d8f3606186de", + "key": "74e5e835-ade4-45e3-9932-b1482d2db302", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4474,7 +4482,7 @@ }, { "commandType": "dispense", - "key": "5b3da3c8-578e-4570-a9c0-12ba4eccd8ef", + "key": "e3389ddd-33e9-4ca2-95b9-1a65fe29c086", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4493,7 +4501,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "7a73f125-8cea-4846-9503-b1c15b16ca7f", + "key": "99778c37-6113-442e-9e86-cab1d013e876", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", @@ -4507,14 +4515,14 @@ }, { "commandType": "dropTipInPlace", - "key": "ad8346ba-09c0-48e5-a4e2-585992b780ff", + "key": "2355a34d-8412-4b88-8af3-916d885df3a2", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } }, { "commandType": "pickUpTip", - "key": "bb55a704-2741-4543-8ec9-9d7cbe646913", + "key": "65af5661-1c7e-45e5-986d-ce8daf7a3eff", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4523,7 +4531,7 @@ }, { "commandType": "aspirate", - "key": "fa987ffe-4b77-4f23-87e3-26ffff498da2", + "key": "6a847f78-42ac-445b-b19d-e1630756a5fa", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4542,7 +4550,7 @@ }, { "commandType": "dispense", - "key": "e2fead50-1166-45a6-9a7c-19239a635dcb", + "key": "6784a579-0b34-43b8-9326-77e637f8bbb2", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4561,7 +4569,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "37bd2126-ea04-43d9-8153-abca7aa37bf2", + "key": "1ff4b385-ae44-4fd2-946d-46ee52afe6ac", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", @@ -4575,14 +4583,14 @@ }, { "commandType": "dropTipInPlace", - "key": "f2254539-3d1c-475f-9545-2254338bc877", + "key": "4f557a9c-80da-4494-afab-d8257227e355", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } }, { "commandType": "pickUpTip", - "key": "d238b33c-0a51-4593-884d-f294ca9b34bd", + "key": "eb772f74-767e-4356-bd3c-2f3b53b85668", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4591,7 +4599,7 @@ }, { "commandType": "aspirate", - "key": "d8cc4fb2-c789-4c19-a279-3ab277db620a", + "key": "d91a44ad-f6fe-43ba-a208-947b82e8bb17", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4610,7 +4618,7 @@ }, { "commandType": "dispense", - "key": "04130047-9fc1-4a1d-a437-6d35c9bbc736", + "key": "0883bc19-bb17-4e75-b825-16bf0bf608a0", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4629,7 +4637,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "ea98ad61-5358-4695-aeac-5c45e45f3945", + "key": "43f04f6e-29e3-41fc-846f-70159de5b574", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", @@ -4643,14 +4651,14 @@ }, { "commandType": "dropTipInPlace", - "key": "aa748779-1bee-4277-9a0b-cef4c9596db2", + "key": "12f108e2-5910-416e-8986-cd4eab636d07", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } }, { "commandType": "pickUpTip", - "key": "1104a432-4c46-4048-a167-66935bcbbe46", + "key": "cc7a1825-c463-472a-93ff-01961ca421ad", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4659,7 +4667,7 @@ }, { "commandType": "aspirate", - "key": "96051ed2-d577-406e-8fcc-6d57489b8098", + "key": "5993e970-eaaa-4fff-be59-6718e4f97869", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4678,7 +4686,7 @@ }, { "commandType": "dispense", - "key": "2aa56498-12ea-4ed1-8d1f-cfc771631231", + "key": "dcfc6676-d254-44ca-80da-70f79ee7db21", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4697,7 +4705,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "feec6043-4715-4e0f-8ffb-c7e11625b8ae", + "key": "a5cfb634-c2cb-4098-8279-5c43d26e6e55", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", @@ -4711,14 +4719,14 @@ }, { "commandType": "dropTipInPlace", - "key": "18c174f1-00c7-4429-a00d-1fb23fa1ab95", + "key": "27a06d31-9297-467d-a634-ad39b172fe64", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } }, { "commandType": "pickUpTip", - "key": "c6e4b756-57e6-4b99-a13f-b4cc9f68007e", + "key": "8b20661a-2842-4d0c-b307-988a0ac3232f", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4727,7 +4735,7 @@ }, { "commandType": "aspirate", - "key": "f2d8efcd-563d-400e-a517-19c2e5b6daff", + "key": "6f05b0af-50df-4ce8-9c29-682caa2a1c58", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4746,7 +4754,7 @@ }, { "commandType": "dispense", - "key": "a167d2fa-005b-4cd7-b877-bc9bc7118576", + "key": "717b0e93-244b-4570-b1e0-c332a5a2445d", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4765,7 +4773,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "d9b25719-f389-47d7-969c-f4b9d5eac924", + "key": "dbefc2d7-4e42-497f-825c-a78fc748b7b6", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", @@ -4779,14 +4787,14 @@ }, { "commandType": "dropTipInPlace", - "key": "f120bb0a-aeb5-456f-9400-61c0d086405c", + "key": "7d46b0cc-f7ca-4d0a-8bb6-bcb818533a47", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } }, { "commandType": "pickUpTip", - "key": "181f302a-6f86-43ea-8bec-34787329ea91", + "key": "e3b4e5f9-e7a8-4656-8823-f4beb6770cc3", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4795,7 +4803,7 @@ }, { "commandType": "aspirate", - "key": "7af713fd-92ec-4125-9fdc-c4caf6d96881", + "key": "66ae5863-34b3-4c17-bdfb-e43ddc9b7b77", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4814,7 +4822,7 @@ }, { "commandType": "dispense", - "key": "74f0f1d4-ede7-4034-bb8a-569af6e51116", + "key": "07642783-9101-4233-b42a-aa4a09ad66f0", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4833,7 +4841,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "e1062927-fbc0-43f4-aec0-2c4db796f520", + "key": "cc7a366d-b712-4871-9ce6-e3ba29d1a0f8", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", @@ -4847,14 +4855,14 @@ }, { "commandType": "dropTipInPlace", - "key": "4fb208b2-406f-41d9-bd75-1bb25c7b6090", + "key": "2bd9a08c-f47e-4107-846f-ac7fc0931617", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } }, { "commandType": "pickUpTip", - "key": "99e371f5-ac49-40f5-b077-0ba095fb8b0e", + "key": "96bdb207-8b5d-4d7d-855c-94fed7b1047f", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4863,7 +4871,7 @@ }, { "commandType": "aspirate", - "key": "36456527-abc3-46b3-9be8-d8c3e35d7589", + "key": "619cc69d-c660-4128-b0d3-91440e65332c", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4882,7 +4890,7 @@ }, { "commandType": "dispense", - "key": "fcc09ee3-1280-42ad-9c96-5a35cc7e3682", + "key": "115828bc-a4f1-44db-8169-7f50d2d31957", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4901,7 +4909,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "973f8392-57e1-4436-8ff3-066370111552", + "key": "c0e44ca1-3f1a-468c-ba46-223f08885e21", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", @@ -4915,14 +4923,14 @@ }, { "commandType": "dropTipInPlace", - "key": "61e589ec-3621-4296-832e-ddf05ed87d71", + "key": "18e8f523-31d1-4586-8b1b-4b91a76f89d7", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } }, { "commandType": "pickUpTip", - "key": "dee716cf-0a38-434f-87cf-ed2db7753f22", + "key": "fc6a5426-0655-4b8a-85ee-8f6dc1fac2f4", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4931,7 +4939,7 @@ }, { "commandType": "aspirate", - "key": "2de3cf3c-ec05-4c71-8da5-5f202dd2067d", + "key": "0fd9c8d4-e795-4ebc-9eb6-7295033e4474", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4950,7 +4958,7 @@ }, { "commandType": "dispense", - "key": "27a832fc-a5da-4c38-ba4f-53fe056a3289", + "key": "4fe712c2-b11d-48a2-976a-cc83c5d4a4d0", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -4969,7 +4977,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "272a9711-02c5-4290-8ef5-82c66ae6db99", + "key": "10f14f3b-098b-4250-8212-351906ee2b6d", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", @@ -4983,14 +4991,14 @@ }, { "commandType": "dropTipInPlace", - "key": "9b5c566f-2fb7-4803-9f87-d613609a1766", + "key": "05c86f7d-da3a-4239-bab1-95b8b898b149", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } }, { "commandType": "pickUpTip", - "key": "c4e4cc2b-1151-471b-82d4-75291a5a85fc", + "key": "de4b2c5a-75a5-467d-aee0-fee7fda26f72", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4999,7 +5007,7 @@ }, { "commandType": "aspirate", - "key": "134995c4-0c67-4fbc-be2a-60c9284e30a9", + "key": "99b31e9c-bdbf-43cf-b0b8-7412322ffb47", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -5018,7 +5026,7 @@ }, { "commandType": "dispense", - "key": "4db8313b-64f1-499b-9f52-4df29c5d4ca7", + "key": "8afd5122-fa7b-48a2-b976-ee1c1b27cb4f", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -5037,7 +5045,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "f2bbe525-de0c-4309-90c9-d09ca189f8de", + "key": "d100c5db-07fb-4ac5-a880-71d9a8666a2c", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", @@ -5051,14 +5059,14 @@ }, { "commandType": "dropTipInPlace", - "key": "56125dae-842e-45c7-af67-ffdeb9fb6869", + "key": "3dce1c59-9d80-484e-be98-28609a791928", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } }, { "commandType": "pickUpTip", - "key": "d2b518d3-97d0-4a59-80c7-7a73a64579d3", + "key": "11cdde60-4006-4389-8de6-ef236788f07b", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -5067,7 +5075,7 @@ }, { "commandType": "aspirate", - "key": "72198d46-cbfb-4b7a-9a26-d1ea9f7dff77", + "key": "c846af6e-2991-4d0e-a77d-0e35165bd016", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -5086,7 +5094,7 @@ }, { "commandType": "dispense", - "key": "138f0bf8-14f1-431b-9db6-8566a9078e83", + "key": "b1f96011-4c25-4cc3-b571-dd8727377d2e", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -5105,7 +5113,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "a6f012e5-f1e3-46fe-8243-4f64987786bf", + "key": "88565966-2577-4aca-9f43-7f772da64315", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", @@ -5119,14 +5127,14 @@ }, { "commandType": "dropTipInPlace", - "key": "c3f57ad8-cf7d-42ba-b009-f62e309b9c7c", + "key": "b1e8abbb-693b-4541-a72a-4ec3c49f523e", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } }, { "commandType": "pickUpTip", - "key": "6590c871-dbef-474b-86f8-1c4b71388df2", + "key": "8526f83f-2860-4596-8620-45063361d374", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -5135,7 +5143,7 @@ }, { "commandType": "aspirate", - "key": "ce93c608-81b7-4a26-b5fd-b6cfa4004ce4", + "key": "2ad19b06-5c41-4b4e-b546-e0bdd0f66a45", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -5154,7 +5162,7 @@ }, { "commandType": "dispense", - "key": "6c20edf3-2d8e-48e1-b872-708e23b71e5d", + "key": "2cae1082-1b08-4abf-989a-c09ef7288ad7", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, @@ -5173,7 +5181,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "4ae15bd8-e502-4267-a1ef-844ccd97fe73", + "key": "4a85393c-fe4a-48f1-a5ae-32174c09abac", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", @@ -5187,14 +5195,14 @@ }, { "commandType": "dropTipInPlace", - "key": "9358bb52-e112-4ac8-ac27-c75fa3a31129", + "key": "60828ffa-b38c-460e-936c-8641ad617a38", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } }, { "commandType": "pickUpTip", - "key": "1e35aa06-95f7-4073-8f8f-68fdc557e3bc", + "key": "35a89a24-24a7-409f-b7b9-d30befbba26b", "params": { "pipetteId": "6d1e53c3-2db3-451b-ad60-3fe13781a193", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -5203,7 +5211,7 @@ }, { "commandType": "configureForVolume", - "key": "1953c27c-abd9-4284-80b5-42c1df10bfa9", + "key": "c176761e-3996-47ea-ba6c-3af6e5d1a983", "params": { "pipetteId": "6d1e53c3-2db3-451b-ad60-3fe13781a193", "volume": 10 @@ -5211,7 +5219,7 @@ }, { "commandType": "aspirate", - "key": "ae530f5a-e921-4cbb-bea2-8563e38d6966", + "key": "f0d53d5e-00de-4d4a-854d-0d074da37350", "params": { "pipetteId": "6d1e53c3-2db3-451b-ad60-3fe13781a193", "volume": 10, @@ -5230,7 +5238,7 @@ }, { "commandType": "dispense", - "key": "756cfa2f-0df6-4d73-8dd0-4869c25aaa00", + "key": "74dd1f94-3e6d-49c7-9fb1-4ae0cc859e9d", "params": { "pipetteId": "6d1e53c3-2db3-451b-ad60-3fe13781a193", "volume": 10, @@ -5249,7 +5257,7 @@ }, { "commandType": "aspirate", - "key": "e12837d4-0bc3-454e-80a5-a530a046b03c", + "key": "fcae4e04-1a58-449a-a248-2f561cbfd793", "params": { "pipetteId": "6d1e53c3-2db3-451b-ad60-3fe13781a193", "volume": 10, @@ -5268,7 +5276,7 @@ }, { "commandType": "dispense", - "key": "1435fcd2-2e3d-480b-9b3c-c606b83e1507", + "key": "62875262-eab0-4519-a11e-354b14a2793b", "params": { "pipetteId": "6d1e53c3-2db3-451b-ad60-3fe13781a193", "volume": 10, @@ -5287,7 +5295,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "3e9986af-42fe-4168-b49d-67b25072aedb", + "key": "ebb19d7f-4ccb-43b8-b60c-44db670096b1", "params": { "pipetteId": "6d1e53c3-2db3-451b-ad60-3fe13781a193", "addressableAreaName": "movableTrashA3", @@ -5301,14 +5309,14 @@ }, { "commandType": "dropTipInPlace", - "key": "c51cf48c-ff9f-4329-b2bb-475589c03cc8", + "key": "cfe4bc7d-4153-4d9e-ad28-61ef961835ed", "params": { "pipetteId": "6d1e53c3-2db3-451b-ad60-3fe13781a193" } }, { "commandType": "moveLabware", - "key": "ca2b894f-a4d4-425a-b85b-9954f9b61819", + "key": "08d54fbe-590c-4f7a-b585-86faf5c94af9", "params": { "labwareId": "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", "strategy": "usingGripper", @@ -5319,7 +5327,7 @@ }, { "commandType": "waitForDuration", - "key": "4f455d59-03a6-4b79-be48-64db49d6ff59", + "key": "6fcaa53f-b9fa-4e22-9d1c-0d4b9717540e", "params": { "seconds": 60, "message": "" @@ -5327,7 +5335,7 @@ }, { "commandType": "moveLabware", - "key": "4481fc65-451f-4c8f-aa14-2b369a600312", + "key": "3a7099a7-7a2d-42c4-a739-24e8585c3aee", "params": { "labwareId": "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", "strategy": "usingGripper", @@ -5338,21 +5346,21 @@ }, { "commandType": "heaterShaker/closeLabwareLatch", - "key": "3e22fda8-3a29-4ec1-a8c5-4a1c2311537b", + "key": "d10e7bf3-5322-4abd-9306-343d481996c1", "params": { "moduleId": "c19dffa3-cb34-4702-bcf6-dcea786257d1:heaterShakerModuleType" } }, { "commandType": "heaterShaker/deactivateHeater", - "key": "68523f3c-f1be-46ec-b235-768fad253de5", + "key": "97ca52a8-e23f-457f-9015-f010f330531c", "params": { "moduleId": "c19dffa3-cb34-4702-bcf6-dcea786257d1:heaterShakerModuleType" } }, { "commandType": "heaterShaker/setAndWaitForShakeSpeed", - "key": "364c37d4-826a-4d67-ae4a-8c3a4f246577", + "key": "b315a60a-32ab-4572-8d62-f6c8dbcb7889", "params": { "moduleId": "c19dffa3-cb34-4702-bcf6-dcea786257d1:heaterShakerModuleType", "rpm": 500 @@ -5360,28 +5368,28 @@ }, { "commandType": "heaterShaker/deactivateHeater", - "key": "d5c426ba-1acc-440c-939b-9c0be548a4a3", + "key": "314fba64-2efd-4f53-b07c-917bc04dc01a", "params": { "moduleId": "c19dffa3-cb34-4702-bcf6-dcea786257d1:heaterShakerModuleType" } }, { "commandType": "heaterShaker/deactivateShaker", - "key": "ff1818d5-6f75-44f5-bfd2-fe5bc202e050", + "key": "f20d8dc8-c41c-4aa8-9447-06f00854fdfa", "params": { "moduleId": "c19dffa3-cb34-4702-bcf6-dcea786257d1:heaterShakerModuleType" } }, { "commandType": "heaterShaker/openLabwareLatch", - "key": "497f9b04-7d40-47ae-9a87-185280821361", + "key": "a72f4873-d977-4b22-aa7f-3c18c17f334c", "params": { "moduleId": "c19dffa3-cb34-4702-bcf6-dcea786257d1:heaterShakerModuleType" } }, { "commandType": "moveLabware", - "key": "1ab82be8-439a-4c7f-ae3d-2421bc2b85a6", + "key": "bf8a31d9-23ab-4c8b-9c3d-7dc894bda46c", "params": { "labwareId": "a793a135-06aa-4ed6-a1d3-c176c7810afa:opentrons/opentrons_24_aluminumblock_nest_1.5ml_snapcap/1", "strategy": "manualMoveWithPause", @@ -5390,7 +5398,7 @@ }, { "commandType": "moveLabware", - "key": "6dc1e703-64ee-48ad-a5e5-451ce9eb917a", + "key": "2c067101-8353-4bfa-ad4b-869569ce4923", "params": { "labwareId": "239ceac8-23ec-4900-810a-70aeef880273:opentrons/nest_96_wellplate_200ul_flat/2", "strategy": "manualMoveWithPause", diff --git a/protocol-designer/fixtures/protocol/8/doItAllV8.json b/protocol-designer/fixtures/protocol/8/doItAllV8.json index d0323f3faf5..aaece68eb3a 100644 --- a/protocol-designer/fixtures/protocol/8/doItAllV8.json +++ b/protocol-designer/fixtures/protocol/8/doItAllV8.json @@ -6,7 +6,7 @@ "author": "", "description": "", "created": 1701659107408, - "lastModified": 1738157218097, + "lastModified": 1738780362701, "category": null, "subcategory": null, "tags": [] @@ -15,7 +15,7 @@ "name": "opentrons/protocol-designer", "version": "8.5.0", "data": { - "_internalAppBuildDate": "Wed, 29 Jan 2025 13:23:47 GMT", + "_internalAppBuildDate": "Wed, 05 Feb 2025 18:32:26 GMT", "defaultValues": { "aspirate_mmFromBottom": 1, "dispense_mmFromBottom": 1, @@ -34,17 +34,17 @@ "ingredients": { "0": { "displayName": "h20", - "displayColor": "#b925ff", "description": null, - "pythonName": "liquid_0", - "liquidGroupId": "1" + "liquidGroupId": "0", + "pythonName": "liquid_1", + "displayColor": "#b925ff" }, "1": { "displayName": "sample", - "displayColor": "#ffd600", "description": null, - "liquidGroupId": "2", - "pythonName": "liquid_1" + "liquidGroupId": "1", + "pythonName": "liquid_2", + "displayColor": "#ffd600" } }, "ingredLocations": { @@ -113,6 +113,17 @@ "pipetteLocationUpdate": { "9fcd50d9-92b2-45ac-acf1-e2cf773feffc": "left" }, + "trashBinLocationUpdate": {}, + "wasteChuteLocationUpdate": { + "9d61f642-8f9b-467d-b2f7-b67fb162fd26:wasteChute": "cutoutD3" + }, + "stagingAreaLocationUpdate": { + "f2213242-0dd4-416c-9994-38432d85e5e2:stagingArea": "cutoutB3", + "db5516ce-eb6a-47b7-8d5e-d983836679ef:stagingArea": "cutoutA3" + }, + "gripperLocationUpdate": { + "13816147-787e-46f1-b950-a925eddfd65f:gripper": "mounted" + }, "stepType": "manualIntervention", "id": "__INITIAL_DECK_SETUP_STEP__" }, @@ -3532,7 +3543,7 @@ "commandSchemaId": "opentronsCommandSchemaV8", "commands": [ { - "key": "fdb1f640-85f6-4bcf-bfff-63e37f55ce27", + "key": "49fc1872-6cc3-410a-9aa7-5af54346a9fc", "commandType": "loadPipette", "params": { "pipetteName": "p1000_single_flex", @@ -3541,7 +3552,7 @@ } }, { - "key": "5913deb1-157f-4ac4-bcbc-f8915aa68fa2", + "key": "dd48f009-562a-4b60-8873-ac25455668bf", "commandType": "loadModule", "params": { "model": "heaterShakerModuleV1", @@ -3552,7 +3563,7 @@ } }, { - "key": "279b491f-78fe-4147-bdbd-31469adf8c01", + "key": "48f70873-c026-439f-8588-1353aa72d88e", "commandType": "loadModule", "params": { "model": "thermocyclerModuleV2", @@ -3563,7 +3574,7 @@ } }, { - "key": "d4a96fb9-9d44-444b-8eef-f69bee47b4f7", + "key": "1b2d55b6-d739-4ba1-ad73-f48e978ac550", "commandType": "loadLabware", "params": { "displayName": "Opentrons 96 PCR Heater-Shaker Adapter", @@ -3577,7 +3588,7 @@ } }, { - "key": "c3a137ef-3ecd-44c7-9221-7167c6576d5b", + "key": "0b252830-d1f1-408a-b2a6-95cc6c21f436", "commandType": "loadLabware", "params": { "displayName": "Opentrons Flex 96 Tip Rack 1000 µL", @@ -3591,7 +3602,7 @@ } }, { - "key": "83929c9c-e7b0-49a3-a369-d2061a29af8f", + "key": "d4e64cb5-fd40-4b1f-a22d-72f24219d366", "commandType": "loadLabware", "params": { "displayName": "Opentrons Tough 96 Well Plate 200 µL PCR Full Skirt", @@ -3605,7 +3616,7 @@ } }, { - "key": "e16a38b6-1a7a-47e0-bd3f-10f3044813dc", + "key": "3501c509-5979-420a-b7e3-dc84ebe3b032", "commandType": "loadLabware", "params": { "displayName": "Axygen 1 Well Reservoir 90 mL", @@ -3620,7 +3631,7 @@ }, { "commandType": "loadLiquid", - "key": "5eef2542-3751-49f9-a83f-cdfbdb3bcd60", + "key": "244176d2-3b89-4fe6-a7c7-590dccb09b3f", "params": { "liquidId": "1", "labwareId": "54370838-4fca-4a14-b88a-7840e4903649:opentrons/opentrons_96_wellplate_200ul_pcr_full_skirt/2", @@ -3638,7 +3649,7 @@ }, { "commandType": "loadLiquid", - "key": "347a434b-a0e3-40ab-9821-4bd8b5fa22cd", + "key": "9c34fe7c-38e4-4939-959c-3120653a51bb", "params": { "liquidId": "0", "labwareId": "8bacda22-9e05-45e8-bef4-cc04414a204f:opentrons/axygen_1_reservoir_90ml/1", @@ -3649,14 +3660,14 @@ }, { "commandType": "thermocycler/openLid", - "key": "bfc09a97-2926-4995-9fb2-0e014373d0e1", + "key": "7b08e12a-df2a-4205-925a-b7e69683e3fd", "params": { "moduleId": "fd6da9f1-d63b-414b-929e-c646b64790e9:thermocyclerModuleType" } }, { "commandType": "moveLabware", - "key": "767e876f-0cb7-4d0c-a5ff-a415585d6a62", + "key": "c543fe64-a47d-4b17-8127-0d0115d458c7", "params": { "labwareId": "8bacda22-9e05-45e8-bef4-cc04414a204f:opentrons/axygen_1_reservoir_90ml/1", "strategy": "usingGripper", @@ -3667,7 +3678,7 @@ }, { "commandType": "pickUpTip", - "key": "8d183275-f3e4-4e20-a148-1280a28be7ea", + "key": "d541acc1-ef32-4088-a8b8-d22e945bf472", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "labwareId": "f2d371ea-5146-4c89-8200-9c056a7f321a:opentrons/opentrons_flex_96_tiprack_1000ul/1", @@ -3676,7 +3687,7 @@ }, { "commandType": "aspirate", - "key": "63759336-84a5-4812-b762-1a9aebf34cfe", + "key": "58ad495c-586a-4753-8595-e9bd3ea684e0", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, @@ -3695,7 +3706,7 @@ }, { "commandType": "dispense", - "key": "ff8ba56e-1a2c-49d7-852b-9bad8dbf34b0", + "key": "a7759e48-c23e-478f-a605-cc8e873fd800", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, @@ -3714,7 +3725,7 @@ }, { "commandType": "moveToAddressableArea", - "key": "1b1844e7-f89f-4594-b76a-e789972a6495", + "key": "031cfe55-1318-4cf0-9fdd-85dcd3a54700", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "addressableAreaName": "1ChannelWasteChute", @@ -3727,14 +3738,14 @@ }, { "commandType": "dropTipInPlace", - "key": "0bb4b9ce-c7f1-4436-be9f-682ba654c130", + "key": "7b3f4a34-e56a-4b45-a019-4b2a9e52a912", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc" } }, { "commandType": "pickUpTip", - "key": "f6ff0fe7-1331-4c28-81ff-a35fed4ad8e5", + "key": "86dd97b7-eef2-4a17-b7d6-862a56f750bc", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "labwareId": "f2d371ea-5146-4c89-8200-9c056a7f321a:opentrons/opentrons_flex_96_tiprack_1000ul/1", @@ -3743,7 +3754,7 @@ }, { "commandType": "aspirate", - "key": "c5cd2686-6a09-4b35-b098-c57eac017185", + "key": "de7b1a56-e6f6-44de-b47c-05fb6b80db6f", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, @@ -3762,7 +3773,7 @@ }, { "commandType": "dispense", - "key": "2f187fb7-9fea-4854-9e98-a311d265bcb6", + "key": "ccf526b2-2186-4c00-a882-818e1eeb1fb7", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, @@ -3781,7 +3792,7 @@ }, { "commandType": "moveToAddressableArea", - "key": "1307485b-cd41-47a5-a044-b028c8224d4f", + "key": "ca62bd2f-6a7f-44c0-98e2-0330a4642d10", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "addressableAreaName": "1ChannelWasteChute", @@ -3794,14 +3805,14 @@ }, { "commandType": "dropTipInPlace", - "key": "8ade5883-8117-425e-8a60-4670efeb9883", + "key": "06623121-26be-487f-b355-2d49d3af3bbe", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc" } }, { "commandType": "pickUpTip", - "key": "cb28e92b-993f-474e-bc73-e72764652c1a", + "key": "9baaba76-fe28-4ced-8936-c4d1c38af6a6", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "labwareId": "f2d371ea-5146-4c89-8200-9c056a7f321a:opentrons/opentrons_flex_96_tiprack_1000ul/1", @@ -3810,7 +3821,7 @@ }, { "commandType": "aspirate", - "key": "14f97753-b078-482a-bf27-204bc3ce8c61", + "key": "700f6fee-6870-446c-a7e9-3921f48f214d", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, @@ -3829,7 +3840,7 @@ }, { "commandType": "dispense", - "key": "5810d6b0-8e1e-4ee8-b89d-bd298e452fbf", + "key": "01c89683-7d52-42c2-b3d1-6df5a190c494", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, @@ -3848,7 +3859,7 @@ }, { "commandType": "moveToAddressableArea", - "key": "2e29334d-4195-40ad-a423-f7200177caae", + "key": "9dd839fe-326a-4e63-985c-b68477e217cf", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "addressableAreaName": "1ChannelWasteChute", @@ -3861,14 +3872,14 @@ }, { "commandType": "dropTipInPlace", - "key": "d17b7128-1a57-4ef2-b46b-280e97b564c3", + "key": "2221613f-1e5a-4a44-88c2-66e4fbfacef1", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc" } }, { "commandType": "pickUpTip", - "key": "4e957f48-d363-48b3-ab6c-7c32c0d5ab80", + "key": "e6f8407d-1611-4d46-bfe2-8059b2b47432", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "labwareId": "f2d371ea-5146-4c89-8200-9c056a7f321a:opentrons/opentrons_flex_96_tiprack_1000ul/1", @@ -3877,7 +3888,7 @@ }, { "commandType": "aspirate", - "key": "1de52706-ab40-48ac-9114-b918de28d0ed", + "key": "bb19aeb4-024c-4df8-beba-3408c96a331a", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, @@ -3896,7 +3907,7 @@ }, { "commandType": "dispense", - "key": "6bdc0516-21ac-48a4-9323-2712e60afe7e", + "key": "c8cbae6d-9cb1-47e3-a7f2-b7d01756d8a3", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, @@ -3915,7 +3926,7 @@ }, { "commandType": "moveToAddressableArea", - "key": "c273367a-57a3-4879-9a2d-93d8ab671265", + "key": "e7cd3520-2abd-4fcd-a251-a62ba48e02a9", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "addressableAreaName": "1ChannelWasteChute", @@ -3928,14 +3939,14 @@ }, { "commandType": "dropTipInPlace", - "key": "5e2e4629-426f-41c5-af38-4a252ef544f6", + "key": "483d5ffa-3f63-4146-ab1f-9fa0aa516e85", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc" } }, { "commandType": "pickUpTip", - "key": "6aa9ea70-9d0c-4c9a-8b26-d168c66edcac", + "key": "571a56a0-a9ac-4782-a6a9-5305e2c91e2c", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "labwareId": "f2d371ea-5146-4c89-8200-9c056a7f321a:opentrons/opentrons_flex_96_tiprack_1000ul/1", @@ -3944,7 +3955,7 @@ }, { "commandType": "aspirate", - "key": "c1848064-ccac-4488-b658-54765b53c014", + "key": "bcbcfca7-f535-4a30-a6ab-2b9656bcb504", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, @@ -3963,7 +3974,7 @@ }, { "commandType": "dispense", - "key": "79622aac-e2ae-4578-8ea8-5288d566b17b", + "key": "bf428081-b108-4791-877f-4cbccc32d9fe", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, @@ -3982,7 +3993,7 @@ }, { "commandType": "moveToAddressableArea", - "key": "0a2c66b2-97cc-45ae-ad05-d4e644b5d09d", + "key": "24890fba-56b8-4ee8-bbe1-3fdadc84e433", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "addressableAreaName": "1ChannelWasteChute", @@ -3995,14 +4006,14 @@ }, { "commandType": "dropTipInPlace", - "key": "88141e29-f3e9-456a-9227-53cc3e4b7306", + "key": "27b9ed52-4dde-4188-9959-3d60064398f0", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc" } }, { "commandType": "pickUpTip", - "key": "493734a6-abb9-4e4a-bbd7-9b7b46a18b21", + "key": "30526659-9e21-4229-a300-ff5b35e86df1", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "labwareId": "f2d371ea-5146-4c89-8200-9c056a7f321a:opentrons/opentrons_flex_96_tiprack_1000ul/1", @@ -4011,7 +4022,7 @@ }, { "commandType": "aspirate", - "key": "17284684-55c4-477a-a775-33989cccb7a7", + "key": "95b90404-e7ca-4afd-ab79-18fc5e309604", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, @@ -4030,7 +4041,7 @@ }, { "commandType": "dispense", - "key": "f1acfe9d-4496-433e-b40f-1a5409ff4094", + "key": "e32849fe-bb1b-44c1-adb3-91dac3165a44", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, @@ -4049,7 +4060,7 @@ }, { "commandType": "moveToAddressableArea", - "key": "025a6244-db88-4635-95a0-14648468a844", + "key": "b0f2fcac-d86f-4221-9395-3ee3ab4af76b", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "addressableAreaName": "1ChannelWasteChute", @@ -4062,14 +4073,14 @@ }, { "commandType": "dropTipInPlace", - "key": "8257d866-81f5-4327-8fde-908c2cc58f4b", + "key": "d528da30-bd87-4719-bb1e-1c615ae0aac6", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc" } }, { "commandType": "pickUpTip", - "key": "3f000483-4802-4332-9ed8-7986267d4bf0", + "key": "15623419-24fd-48a3-ab69-b4b083c754df", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "labwareId": "f2d371ea-5146-4c89-8200-9c056a7f321a:opentrons/opentrons_flex_96_tiprack_1000ul/1", @@ -4078,7 +4089,7 @@ }, { "commandType": "aspirate", - "key": "cc718e17-898c-475e-8213-18a8c4e7de63", + "key": "8ab0f6a8-d0dd-4505-99f6-240d1c73c39a", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, @@ -4097,7 +4108,7 @@ }, { "commandType": "dispense", - "key": "9b2d6845-866c-4cbb-85c5-be29f0e59c7f", + "key": "dc325be3-9e6b-468b-84f6-b7e2efc7ddba", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, @@ -4116,7 +4127,7 @@ }, { "commandType": "moveToAddressableArea", - "key": "e204cacd-03f9-4f52-a48a-a4fba1f217c4", + "key": "1d23f50b-2735-4818-b53f-bffebcfacfeb", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "addressableAreaName": "1ChannelWasteChute", @@ -4129,14 +4140,14 @@ }, { "commandType": "dropTipInPlace", - "key": "3f3a6583-8548-4e1b-af12-c4157c573aa6", + "key": "417cfecc-87f2-468a-9164-d654f72afddc", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc" } }, { "commandType": "pickUpTip", - "key": "3000eef7-2dbb-49b7-8242-b5f71cee8e84", + "key": "0bedaae9-376e-48fe-93ba-21d7af4447b4", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "labwareId": "f2d371ea-5146-4c89-8200-9c056a7f321a:opentrons/opentrons_flex_96_tiprack_1000ul/1", @@ -4145,7 +4156,7 @@ }, { "commandType": "aspirate", - "key": "4e21f8b9-a480-43a5-b3bb-23a0baa99bc4", + "key": "6591d94b-b15a-42ee-a8f8-428d98c51351", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, @@ -4164,7 +4175,7 @@ }, { "commandType": "dispense", - "key": "a4ed53f0-3ba5-4b30-9a8a-a0abf5f558bc", + "key": "ebade313-94ab-4438-9cbf-63a0219a1eaf", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, @@ -4183,7 +4194,7 @@ }, { "commandType": "moveToAddressableArea", - "key": "920cc11e-1a35-4a84-ba6b-93f742bd8780", + "key": "90528e7c-da57-4747-a752-f3c591931fb0", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "addressableAreaName": "1ChannelWasteChute", @@ -4196,21 +4207,21 @@ }, { "commandType": "dropTipInPlace", - "key": "b05b1f55-87ac-4989-a937-c6e63abc04fc", + "key": "67862c8f-0825-4e69-9f3a-43b97dfd076d", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc" } }, { "commandType": "thermocycler/closeLid", - "key": "f4e356c4-5160-478d-9419-b919f411324a", + "key": "a7278a36-19b0-4842-801e-76361a8aa766", "params": { "moduleId": "fd6da9f1-d63b-414b-929e-c646b64790e9:thermocyclerModuleType" } }, { "commandType": "thermocycler/setTargetBlockTemperature", - "key": "bc344e58-dedd-44a1-bcbb-1108852aa188", + "key": "09d59dec-9554-4ebb-8166-c77a9395914f", "params": { "moduleId": "fd6da9f1-d63b-414b-929e-c646b64790e9:thermocyclerModuleType", "celsius": 40 @@ -4218,14 +4229,14 @@ }, { "commandType": "thermocycler/waitForBlockTemperature", - "key": "b573b603-fa89-4213-a1ea-6f6d24f4f372", + "key": "731dcfcf-07ca-48fd-ae41-9a7011ede0bb", "params": { "moduleId": "fd6da9f1-d63b-414b-929e-c646b64790e9:thermocyclerModuleType" } }, { "commandType": "waitForDuration", - "key": "1e8e67b6-e2ed-476b-8f5a-f985a68fbd22", + "key": "cc242e9f-90d1-4801-bb91-97090d67f7d7", "params": { "seconds": 60, "message": "" @@ -4233,35 +4244,35 @@ }, { "commandType": "thermocycler/openLid", - "key": "165eaa13-69df-49b5-965a-83cf19c40fda", + "key": "8bb12bf8-0ef2-4725-af0a-1a398f70bf23", "params": { "moduleId": "fd6da9f1-d63b-414b-929e-c646b64790e9:thermocyclerModuleType" } }, { "commandType": "thermocycler/deactivateBlock", - "key": "d9c25977-9163-472b-b0e6-4840b8135b52", + "key": "00476092-d870-469d-a86c-1b3c28e33d95", "params": { "moduleId": "fd6da9f1-d63b-414b-929e-c646b64790e9:thermocyclerModuleType" } }, { "commandType": "heaterShaker/deactivateHeater", - "key": "a9591c3d-4413-447b-81ed-b10e0b64593a", + "key": "cdbb8ffd-dcba-4c2c-9900-93b9876209f6", "params": { "moduleId": "23347241-80bb-4a7e-9c91-5d9727a9e483:heaterShakerModuleType" } }, { "commandType": "heaterShaker/openLabwareLatch", - "key": "8e0d13ac-d6c9-4aee-bf38-8b65cbb23cd3", + "key": "ac78164f-d06e-468c-8a2e-7f665773bf5e", "params": { "moduleId": "23347241-80bb-4a7e-9c91-5d9727a9e483:heaterShakerModuleType" } }, { "commandType": "moveLabware", - "key": "cdbee473-2621-49d4-b233-99a80d4aa6ea", + "key": "dd7006a1-71cb-4927-9380-5869aea6cf5c", "params": { "labwareId": "54370838-4fca-4a14-b88a-7840e4903649:opentrons/opentrons_96_wellplate_200ul_pcr_full_skirt/2", "strategy": "usingGripper", @@ -4272,21 +4283,21 @@ }, { "commandType": "heaterShaker/closeLabwareLatch", - "key": "90f0a48f-d198-49cc-b985-8b60b9eeb97a", + "key": "8297dcfd-1dc2-48d4-a03c-e9136c6ad2c3", "params": { "moduleId": "23347241-80bb-4a7e-9c91-5d9727a9e483:heaterShakerModuleType" } }, { "commandType": "heaterShaker/deactivateHeater", - "key": "66d3b91c-6a48-4ccc-880f-8f9b00702e47", + "key": "629e702b-aade-4a3c-9967-6ebb8f8ddb6f", "params": { "moduleId": "23347241-80bb-4a7e-9c91-5d9727a9e483:heaterShakerModuleType" } }, { "commandType": "heaterShaker/setAndWaitForShakeSpeed", - "key": "f4746eaa-e860-44ec-ba60-27c60a3f251f", + "key": "7be4d22c-bd4d-4aef-973a-54ac5e43853b", "params": { "moduleId": "23347241-80bb-4a7e-9c91-5d9727a9e483:heaterShakerModuleType", "rpm": 200 @@ -4294,42 +4305,42 @@ }, { "commandType": "waitForDuration", - "key": "4f9d6581-3793-4f5e-b29b-a4f59878348b", + "key": "e8b35707-452c-490b-937a-a6f0a55b8549", "params": { "seconds": 60 } }, { "commandType": "heaterShaker/deactivateShaker", - "key": "9a4026e4-5fb0-4cca-9cc0-09274213418d", + "key": "c70641c6-d6bc-46ad-9812-6acfdacff8be", "params": { "moduleId": "23347241-80bb-4a7e-9c91-5d9727a9e483:heaterShakerModuleType" } }, { "commandType": "heaterShaker/deactivateHeater", - "key": "0e0a6e22-6d87-457e-841e-063e74b92bcd", + "key": "86d364f1-b6a0-4069-ad7b-1973a3160488", "params": { "moduleId": "23347241-80bb-4a7e-9c91-5d9727a9e483:heaterShakerModuleType" } }, { "commandType": "heaterShaker/deactivateHeater", - "key": "43ef8004-1be7-4eec-9fca-83571590170d", + "key": "a6a78183-cefd-4c2d-ba40-e16f43b50ea2", "params": { "moduleId": "23347241-80bb-4a7e-9c91-5d9727a9e483:heaterShakerModuleType" } }, { "commandType": "heaterShaker/openLabwareLatch", - "key": "d3a2cb1e-b4dd-4431-ae89-84d71ed5f900", + "key": "0ede6628-3007-453b-8dcc-088798893ac8", "params": { "moduleId": "23347241-80bb-4a7e-9c91-5d9727a9e483:heaterShakerModuleType" } }, { "commandType": "moveLabware", - "key": "0554f9d9-5de2-4faa-bde6-a291c503379c", + "key": "c9e44bb3-3354-4350-afcb-a0574afedbb3", "params": { "labwareId": "54370838-4fca-4a14-b88a-7840e4903649:opentrons/opentrons_96_wellplate_200ul_pcr_full_skirt/2", "strategy": "usingGripper", @@ -4340,7 +4351,7 @@ }, { "commandType": "moveLabware", - "key": "25d91423-5565-4063-ada0-87692ca2dbbd", + "key": "7a39f8b8-d95b-47ca-bc5d-8e01bc6a4c4d", "params": { "labwareId": "f2d371ea-5146-4c89-8200-9c056a7f321a:opentrons/opentrons_flex_96_tiprack_1000ul/1", "strategy": "usingGripper", diff --git a/protocol-designer/fixtures/protocol/8/example_1_1_0MigratedToV8.json b/protocol-designer/fixtures/protocol/8/example_1_1_0MigratedToV8.json index 5aaf3a768f6..7e0b8eeabff 100644 --- a/protocol-designer/fixtures/protocol/8/example_1_1_0MigratedToV8.json +++ b/protocol-designer/fixtures/protocol/8/example_1_1_0MigratedToV8.json @@ -6,7 +6,7 @@ "author": "Author name", "description": "Description here", "created": 1560957631666, - "lastModified": 1738256741877, + "lastModified": 1738682213024, "category": null, "subcategory": null, "tags": [] @@ -15,7 +15,7 @@ "name": "opentrons/protocol-designer", "version": "8.5.0", "data": { - "_internalAppBuildDate": "Thu, 30 Jan 2025 17:05:24 GMT", + "_internalAppBuildDate": "Tue, 04 Feb 2025 15:16:30 GMT", "defaultValues": { "aspirate_mmFromBottom": 1, "dispense_mmFromBottom": 1, @@ -106,6 +106,12 @@ "c6f45030-92a5-11e9-ac62-1b173f839d9e": "left", "c6f47740-92a5-11e9-ac62-1b173f839d9e": "right" }, + "trashBinLocationUpdate": { + "2e4b0821-520d-46f5-af61-bf4e2db2e378:trashBin": "cutout12" + }, + "wasteChuteLocationUpdate": {}, + "stagingAreaLocationUpdate": {}, + "gripperLocationUpdate": {}, "stepType": "manualIntervention", "id": "__INITIAL_DECK_SETUP_STEP__" }, @@ -133,7 +139,7 @@ "aspirate_y_position": 0, "blowout_checkbox": true, "blowout_flowRate": 1000, - "blowout_location": "099f7422-f81c-4188-8fb7-d70f32c574cc:trashBin", + "blowout_location": "2e4b0821-520d-46f5-af61-bf4e2db2e378:trashBin", "blowout_z_offset": 0, "changeTip": "always", "dispense_airGap_checkbox": false, @@ -168,7 +174,7 @@ "dispense_y_position": 0, "disposalVolume_checkbox": true, "disposalVolume_volume": "1", - "dropTip_location": "099f7422-f81c-4188-8fb7-d70f32c574cc:trashBin", + "dropTip_location": "2e4b0821-520d-46f5-af61-bf4e2db2e378:trashBin", "nozzles": null, "path": "single", "pipette": "c6f45030-92a5-11e9-ac62-1b173f839d9e", @@ -193,7 +199,7 @@ "dispense_delay_checkbox": false, "dispense_delay_seconds": "1", "dispense_flowRate": 7, - "dropTip_location": "099f7422-f81c-4188-8fb7-d70f32c574cc:trashBin", + "dropTip_location": "2e4b0821-520d-46f5-af61-bf4e2db2e378:trashBin", "labware": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well:opentrons/usascientific_96_wellplate_2.4ml_deep/1", "mix_mmFromBottom": 0.5, "mix_touchTip_checkbox": true, @@ -3407,7 +3413,7 @@ "commandSchemaId": "opentronsCommandSchemaV8", "commands": [ { - "key": "653466a2-8020-453e-ab02-c005028a2f85", + "key": "b6c156db-64b4-424d-99e8-916d3323abfd", "commandType": "loadPipette", "params": { "pipetteName": "p10_single", @@ -3416,7 +3422,7 @@ } }, { - "key": "e7c4cb6c-5fb9-4657-ac3e-d88fc0d22504", + "key": "5b46cbfe-9158-4339-9373-ab5919dd45eb", "commandType": "loadPipette", "params": { "pipetteName": "p50_single", @@ -3425,7 +3431,7 @@ } }, { - "key": "88a0549f-4dc9-4ff2-8224-0840707768de", + "key": "8fff61b7-564d-4264-9ac2-287c0c61aba8", "commandType": "loadLabware", "params": { "displayName": "tiprack 10ul (1)", @@ -3439,7 +3445,7 @@ } }, { - "key": "f8177762-b4d6-4c64-829c-86c43c890013", + "key": "b77b662d-6eab-4d73-b2bf-60ea5027f84a", "commandType": "loadLabware", "params": { "displayName": "tiprack 200ul (1)", @@ -3453,7 +3459,7 @@ } }, { - "key": "dc5b0ab1-d6d8-422e-b329-6d450ed47606", + "key": "7bcef684-8950-4ce0-b7f7-9a22807014e3", "commandType": "loadLabware", "params": { "displayName": "96 deep well (1)", @@ -3468,7 +3474,7 @@ }, { "commandType": "loadLiquid", - "key": "029fb680-4e9c-4751-9f46-63bb351213b9", + "key": "76b01918-6f03-45e7-b0d3-5a50adae4475", "params": { "liquidId": "1", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well:opentrons/usascientific_96_wellplate_2.4ml_deep/1", @@ -3481,7 +3487,7 @@ }, { "commandType": "loadLiquid", - "key": "c528eb17-0030-4047-a762-160ca37128e9", + "key": "4e0754ed-f87f-4840-8bd7-f2f48fa252a0", "params": { "liquidId": "0", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well:opentrons/usascientific_96_wellplate_2.4ml_deep/1", @@ -3496,7 +3502,7 @@ }, { "commandType": "pickUpTip", - "key": "df727ce4-87e9-4ec5-bea2-6b95b046c939", + "key": "a20d621e-08b0-4536-8525-74c54dca7aa3", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "c6f4ec70-92a5-11e9-ac62-1b173f839d9e:tiprack-10ul:opentrons/opentrons_96_tiprack_10ul/1", @@ -3505,7 +3511,7 @@ }, { "commandType": "aspirate", - "key": "11775a09-4adc-41aa-a8e9-7c9ce4be9e27", + "key": "57aeb7aa-75b4-46f0-868c-8fbf420ce168", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -3524,7 +3530,7 @@ }, { "commandType": "dispense", - "key": "28f64155-ed7b-4b7d-b28b-15a225f67256", + "key": "b3ed2e58-c3a8-4a16-a403-dcae2807c233", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -3543,7 +3549,7 @@ }, { "commandType": "aspirate", - "key": "85694006-ab52-4adb-8442-ddb909a00859", + "key": "73496d06-8799-4a22-a151-f0186c1ce848", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -3562,7 +3568,7 @@ }, { "commandType": "dispense", - "key": "7bf0394c-1b42-477a-b342-9c692340e3c9", + "key": "172b940a-2997-4560-8f83-6b0b1555e21f", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -3581,7 +3587,7 @@ }, { "commandType": "aspirate", - "key": "e4fae21c-fb4d-4d37-a95d-eae6122058b8", + "key": "47ec6a53-51c5-44ee-b493-01860b9a8b28", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -3600,7 +3606,7 @@ }, { "commandType": "dispense", - "key": "bba3e2c7-abae-4c26-905a-c5bdc377563d", + "key": "28c9e028-4b32-48e2-9d1d-6ee3b7ba6631", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -3619,7 +3625,7 @@ }, { "commandType": "aspirate", - "key": "44baadee-dbe5-42ba-91dc-789a37f095ec", + "key": "cfc6b018-0f01-4b7d-9a8b-e99ab361e261", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, @@ -3638,7 +3644,7 @@ }, { "commandType": "touchTip", - "key": "e5f76399-cd91-4e7b-90e2-9f67b51835ff", + "key": "d4ce9260-49a8-47af-a6d9-6531a02480d8", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well:opentrons/usascientific_96_wellplate_2.4ml_deep/1", @@ -3653,7 +3659,7 @@ }, { "commandType": "dispense", - "key": "191ca16f-1556-4c99-97c4-44a1a6ffcf69", + "key": "4ba7ff37-f2fe-47fc-bdb1-af1a374c2086", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, @@ -3672,7 +3678,7 @@ }, { "commandType": "aspirate", - "key": "424d1f8d-2372-484a-bf34-51a49b4f8c1a", + "key": "777b079c-95fb-41e5-a41a-e5317979d5c9", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -3691,7 +3697,7 @@ }, { "commandType": "dispense", - "key": "940b80b5-eda9-4fbb-a3f2-dd89ad874b0f", + "key": "7a24e96c-16bd-41b0-88f4-87cb03a1b945", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -3710,7 +3716,7 @@ }, { "commandType": "aspirate", - "key": "586dffd7-11a0-49cc-a768-842e80f7a083", + "key": "7a5c9a41-240a-4784-a4dd-a5eb3088ba0a", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -3729,7 +3735,7 @@ }, { "commandType": "dispense", - "key": "babc33bb-2642-4c1d-9142-5ba7e58f3219", + "key": "0dcde7d8-27aa-4dde-836f-646fea39f55a", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -3748,7 +3754,7 @@ }, { "commandType": "moveToAddressableArea", - "key": "417d2cad-ae9d-44ef-8ceb-ad2d68e379cd", + "key": "ce280842-b3a4-42fa-92b2-3a5340b649c8", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -3761,7 +3767,7 @@ }, { "commandType": "blowOutInPlace", - "key": "8bc64b78-501e-416a-91d1-4ee65a3744d8", + "key": "7cf2f5dc-186e-49bb-a537-d136428af488", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "flowRate": 1000 @@ -3769,7 +3775,7 @@ }, { "commandType": "touchTip", - "key": "b84bf61c-2878-48da-8910-de9cd9b64fde", + "key": "5e939a37-aff7-44ff-ab2c-440c713ef9d5", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well:opentrons/usascientific_96_wellplate_2.4ml_deep/1", @@ -3784,7 +3790,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "20d90f09-623d-4c7b-b19a-d4afea3437ab", + "key": "bde57f47-6a7e-460a-8d6d-8d0c888b6b5e", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -3798,14 +3804,14 @@ }, { "commandType": "dropTipInPlace", - "key": "6bdd2267-a54f-4f0b-b3a9-a29fc6facd48", + "key": "8cb86963-8158-47b5-a0ce-a6c656776be1", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e" } }, { "commandType": "pickUpTip", - "key": "778e0f97-7810-4392-8816-3390e773c402", + "key": "fb168973-b02a-4fb0-9d65-9a3d5b994966", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "c6f4ec70-92a5-11e9-ac62-1b173f839d9e:tiprack-10ul:opentrons/opentrons_96_tiprack_10ul/1", @@ -3814,7 +3820,7 @@ }, { "commandType": "aspirate", - "key": "488ed1c9-5e31-4abf-ac13-7739170f7055", + "key": "e7074256-07bc-4a56-970c-11aab79dd2f2", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -3833,7 +3839,7 @@ }, { "commandType": "dispense", - "key": "8fffd70f-f145-4550-8a8b-75ef67c62713", + "key": "90e02d3e-7ec4-4f0b-b490-058fe0145f0a", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -3852,7 +3858,7 @@ }, { "commandType": "aspirate", - "key": "53a14ffd-8bcd-4478-a175-c6ccbbc99138", + "key": "28d9526c-26f6-48df-be3c-37f8a4d87911", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -3871,7 +3877,7 @@ }, { "commandType": "dispense", - "key": "d6f5bfc6-b873-4d72-8b23-ff761a428189", + "key": "0075638c-85cb-4f75-a762-6e2d3e242388", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -3890,7 +3896,7 @@ }, { "commandType": "aspirate", - "key": "8c27405f-c328-419a-889d-9045d58e4e33", + "key": "488fc2f2-8408-417e-aa19-074945e961e7", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -3909,7 +3915,7 @@ }, { "commandType": "dispense", - "key": "1bb1272d-ce76-41f2-9d53-c1273303880e", + "key": "0052650f-0ddd-4af5-bfbc-8385560bb42e", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -3928,7 +3934,7 @@ }, { "commandType": "aspirate", - "key": "b941dbde-54a4-445e-a29d-543e159bedbf", + "key": "9e201efb-f4b2-4445-9e76-85eed025788b", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, @@ -3947,7 +3953,7 @@ }, { "commandType": "touchTip", - "key": "ff5bb79b-e077-4d94-9475-d1ca50852284", + "key": "347111ba-db00-4cb8-89c2-a615757e60a7", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well:opentrons/usascientific_96_wellplate_2.4ml_deep/1", @@ -3962,7 +3968,7 @@ }, { "commandType": "dispense", - "key": "14bf5fb9-d05b-4e51-b74a-ef627109d257", + "key": "58d5e6d2-522f-45f7-a4a2-e8fbfc098acb", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, @@ -3981,7 +3987,7 @@ }, { "commandType": "aspirate", - "key": "dfba6f40-6a41-4a3e-bf7e-49f63414e6ef", + "key": "45ad8b88-b830-4ec8-9c87-d06a54312cad", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -4000,7 +4006,7 @@ }, { "commandType": "dispense", - "key": "73686f51-4623-488c-ae1d-cf954e67ac2a", + "key": "8e07b1e1-c481-4708-8360-35b19960b0c2", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -4019,7 +4025,7 @@ }, { "commandType": "aspirate", - "key": "87b23803-be29-44ff-b464-53bc9e7ec9d4", + "key": "88e873c5-db3f-4434-b526-abd2d34ce72d", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -4038,7 +4044,7 @@ }, { "commandType": "dispense", - "key": "01d936c2-c68f-4da4-9e58-47c505a479c7", + "key": "840c2cce-dab2-4d73-96b6-e268a9fa88d9", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -4057,7 +4063,7 @@ }, { "commandType": "moveToAddressableArea", - "key": "e575881c-12c0-4291-aee7-a9838ae46669", + "key": "9f6f8ae6-94cc-4abd-9df0-6467e82e97f6", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -4070,7 +4076,7 @@ }, { "commandType": "blowOutInPlace", - "key": "3208e8c0-5a0f-457c-9344-7f2966b44d47", + "key": "21869e3d-fe14-4ee1-843b-b7f791d74e3d", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "flowRate": 1000 @@ -4078,7 +4084,7 @@ }, { "commandType": "touchTip", - "key": "c356873a-300c-4e28-855a-b265ced0e7f2", + "key": "11428031-e985-4122-82aa-594da85fa23b", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well:opentrons/usascientific_96_wellplate_2.4ml_deep/1", @@ -4093,7 +4099,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "0377b295-3529-4f46-8e16-c368ab6ebe49", + "key": "2a6c179f-997d-49de-af12-1cdc546c849e", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -4107,14 +4113,14 @@ }, { "commandType": "dropTipInPlace", - "key": "07e93710-93cc-4dde-9e14-9ae43d132da3", + "key": "c4d14c1c-0d84-45a7-aea7-464720456231", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e" } }, { "commandType": "pickUpTip", - "key": "12083522-572b-42ae-8e29-cc269f844dda", + "key": "6202eb05-3a13-409c-a2be-f2a8611f13dd", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "c6f4ec70-92a5-11e9-ac62-1b173f839d9e:tiprack-10ul:opentrons/opentrons_96_tiprack_10ul/1", @@ -4123,7 +4129,7 @@ }, { "commandType": "aspirate", - "key": "b44b017d-8793-4916-ba75-a0fcf17941a6", + "key": "c4baf2d7-4d99-494f-abc9-45c837b984f3", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4142,7 +4148,7 @@ }, { "commandType": "dispense", - "key": "71ee0966-e142-4748-b9ed-c222e9240495", + "key": "0532430f-294c-4e0f-9836-2537bd9d334b", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4161,7 +4167,7 @@ }, { "commandType": "aspirate", - "key": "52b3c2fd-fb1f-4ed8-8a55-cef464e285c8", + "key": "4c0ea920-56dd-4b5c-aaa7-064d9da947c1", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4180,7 +4186,7 @@ }, { "commandType": "dispense", - "key": "09e89c72-abf8-4763-a17e-f0b68451e4bb", + "key": "faa87389-c3e3-4550-863d-129175764d55", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4199,7 +4205,7 @@ }, { "commandType": "aspirate", - "key": "b5a4c0be-90a7-44de-9471-81e0057718bb", + "key": "f413ce0a-41e8-4b34-a191-d679e5d23387", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4218,7 +4224,7 @@ }, { "commandType": "dispense", - "key": "a1ee83f2-5933-4d3e-98b6-84aa33b24e5b", + "key": "d4c158a0-80a1-4d3b-9c57-426c514068d8", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4237,7 +4243,7 @@ }, { "commandType": "aspirate", - "key": "8ba0eb8b-3090-41b4-a1b3-aad2f50187ff", + "key": "dba81a82-52e8-4341-a883-d63e43b5b9aa", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, @@ -4256,7 +4262,7 @@ }, { "commandType": "touchTip", - "key": "86d7ea41-8ecf-402a-8b4d-25809005e4ba", + "key": "c9c708f9-aad2-47fe-ac4a-83d37fc2f0ee", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well:opentrons/usascientific_96_wellplate_2.4ml_deep/1", @@ -4271,7 +4277,7 @@ }, { "commandType": "dispense", - "key": "577ce715-206f-4a51-b121-cacdb1160ec3", + "key": "dd91b34e-0d1e-4a25-812b-51974152257f", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, @@ -4290,7 +4296,7 @@ }, { "commandType": "aspirate", - "key": "4e900e98-c62e-49b7-b617-298684c919f0", + "key": "0526d9c4-c94e-4f76-b9b9-3f7f00b389fd", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -4309,7 +4315,7 @@ }, { "commandType": "dispense", - "key": "7e39af6a-1a82-435a-98d8-c652bb734836", + "key": "40e0f8b6-5270-4a61-8b85-4474a30e9662", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -4328,7 +4334,7 @@ }, { "commandType": "aspirate", - "key": "6a4d013b-e5ae-4c00-ab32-d255cbe3199c", + "key": "0fce3b34-b179-462d-808c-e3fd6ff34148", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -4347,7 +4353,7 @@ }, { "commandType": "dispense", - "key": "50bc592a-7d11-44db-87d1-c1fac3f33aca", + "key": "6c39cac0-874b-49a5-8a56-fd5f73440a54", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -4366,7 +4372,7 @@ }, { "commandType": "moveToAddressableArea", - "key": "b07dc9b0-ae2b-4e6d-a2f2-7689c53c3865", + "key": "c7f399ce-e23a-4bd9-b593-4fae8bfb51a5", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -4379,7 +4385,7 @@ }, { "commandType": "blowOutInPlace", - "key": "99375975-5737-4632-acf3-a1e4ea1034ca", + "key": "e30b2754-065e-4656-91ab-aef8f3fd8cb2", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "flowRate": 1000 @@ -4387,7 +4393,7 @@ }, { "commandType": "touchTip", - "key": "e643590b-d941-4660-972f-e73f013cf923", + "key": "620fa759-c780-4ec4-9778-0f758bbdf816", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well:opentrons/usascientific_96_wellplate_2.4ml_deep/1", @@ -4402,7 +4408,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "33f25151-526c-400e-9c36-02257a6b02b9", + "key": "d88909c0-fde0-4ae7-9072-d361a400bbb3", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -4416,14 +4422,14 @@ }, { "commandType": "dropTipInPlace", - "key": "0f621a52-7ac3-49b1-a732-4a4547737217", + "key": "ead98234-1143-4f73-80b7-e00eb5176abf", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e" } }, { "commandType": "pickUpTip", - "key": "25ecc88a-bb2d-40aa-b03d-8c070b64bcfc", + "key": "b70c8c23-bc75-4943-8199-75aeeb0e98b4", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "c6f4ec70-92a5-11e9-ac62-1b173f839d9e:tiprack-10ul:opentrons/opentrons_96_tiprack_10ul/1", @@ -4432,7 +4438,7 @@ }, { "commandType": "aspirate", - "key": "1bec23d2-cf63-4e75-a758-c8035f509adc", + "key": "77ffe4f4-96f7-484a-8df8-abdc081a005a", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4451,7 +4457,7 @@ }, { "commandType": "dispense", - "key": "84b0d168-b6e6-4bdd-a1b2-714bc49a92b6", + "key": "a1766c9a-08b0-4636-afcc-566618839c42", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4470,7 +4476,7 @@ }, { "commandType": "aspirate", - "key": "75c1c612-a887-4f27-87da-0f43823d416a", + "key": "95a0f7eb-4c13-4e66-9f47-2b3f56c9566c", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4489,7 +4495,7 @@ }, { "commandType": "dispense", - "key": "d168f003-f78d-46fd-9e5a-4f9eda0b3118", + "key": "9601d22b-9cba-4187-94cd-cc5e5e52cf3b", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4508,7 +4514,7 @@ }, { "commandType": "aspirate", - "key": "b78fd127-21c8-49b0-aed2-0805c8be3e86", + "key": "ed294942-e998-4f02-a945-85d2a6bf8ff7", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4527,7 +4533,7 @@ }, { "commandType": "dispense", - "key": "344402c1-a8fd-43e1-ac66-9432edb241f5", + "key": "1fbffe57-ecd7-4244-ba04-1a0621cbf311", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4546,7 +4552,7 @@ }, { "commandType": "aspirate", - "key": "02347dbb-2094-4e01-b8b6-d01581dde145", + "key": "d6711159-63a5-470d-a88a-e80a75d656d2", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, @@ -4565,7 +4571,7 @@ }, { "commandType": "touchTip", - "key": "975cd29b-7803-4784-afb4-803f0f0d423e", + "key": "12adcc53-2ece-4e50-8e81-bd27349b6053", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well:opentrons/usascientific_96_wellplate_2.4ml_deep/1", @@ -4580,7 +4586,7 @@ }, { "commandType": "dispense", - "key": "b7f1a73a-8831-4a44-9ba7-b5cb519bb215", + "key": "0f7a13fb-99c7-4cd7-bb4b-6f615dbcf0b3", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, @@ -4599,7 +4605,7 @@ }, { "commandType": "aspirate", - "key": "4cc4dd8d-096e-46c1-b679-5350affd8b8a", + "key": "0ca8c2f1-3f53-4309-ab08-5fc2232bcc44", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -4618,7 +4624,7 @@ }, { "commandType": "dispense", - "key": "53c53d98-c333-4071-8b9c-7ddd30af9156", + "key": "bcbf6cf0-0387-4f32-ac2f-09f5cf0b4f61", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -4637,7 +4643,7 @@ }, { "commandType": "aspirate", - "key": "99bf4d65-85f8-4759-9ba9-97e2aa2e7c0d", + "key": "79c82d3c-0f3c-40ab-acde-0ddec69fb452", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -4656,7 +4662,7 @@ }, { "commandType": "dispense", - "key": "aca6fcb1-3f17-444c-9ec8-f15a8abfcfc0", + "key": "0a6b23c1-510f-4e14-9703-f547c95229aa", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -4675,7 +4681,7 @@ }, { "commandType": "moveToAddressableArea", - "key": "03e1fe26-33b6-44b6-be58-0287e71c28f3", + "key": "d1a4a476-c7a6-43f5-ae9c-b535eaa75085", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -4688,7 +4694,7 @@ }, { "commandType": "blowOutInPlace", - "key": "5a2c56e4-bc46-4855-8c5e-9bfce14ae3b9", + "key": "e1d91545-60cb-424f-b312-e2ab186ed231", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "flowRate": 1000 @@ -4696,7 +4702,7 @@ }, { "commandType": "touchTip", - "key": "6d85e783-0eca-4bb3-a3a2-166d2071ebe8", + "key": "464f544c-bbdd-4356-af91-609b34a051a0", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well:opentrons/usascientific_96_wellplate_2.4ml_deep/1", @@ -4711,7 +4717,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "41c7dd1d-0e8a-4586-8ba1-f1daf5e749e6", + "key": "7173b1e3-ba16-4e2f-bc37-5e6f3a8fcf05", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -4725,14 +4731,14 @@ }, { "commandType": "dropTipInPlace", - "key": "eb5b780c-0a3e-411e-b596-0e32558910a0", + "key": "adb1abc6-ae8a-40b5-91b2-86e58b2a8e86", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e" } }, { "commandType": "pickUpTip", - "key": "d797963b-39f7-4720-a4c1-8d81f4f9c472", + "key": "d87cf05c-e6f8-4c28-b9e4-84c15a7e9888", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "c6f4ec70-92a5-11e9-ac62-1b173f839d9e:tiprack-10ul:opentrons/opentrons_96_tiprack_10ul/1", @@ -4741,7 +4747,7 @@ }, { "commandType": "aspirate", - "key": "5c224719-928e-4af8-b7aa-f10b65946c11", + "key": "0842af17-ba02-4040-b97b-f9f6d9e384f9", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4760,7 +4766,7 @@ }, { "commandType": "dispense", - "key": "1aba110d-735e-46ad-a5e6-020663d29ebc", + "key": "f38338b8-f3c8-4d47-b449-e39eb5699e80", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4779,7 +4785,7 @@ }, { "commandType": "aspirate", - "key": "7254a835-c333-43a6-b9e1-25ef28edbad5", + "key": "5eab1add-4039-4253-b96b-10a0c62fffa4", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4798,7 +4804,7 @@ }, { "commandType": "dispense", - "key": "0450994c-9de9-4f5e-9c26-710421e396d6", + "key": "46346f68-fca5-4cff-906b-ca50596f2ad3", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4817,7 +4823,7 @@ }, { "commandType": "aspirate", - "key": "d1b342f4-62d8-49a8-be58-2dd480edd145", + "key": "6a4aef6d-88f1-416a-b49f-95f2980e65bc", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4836,7 +4842,7 @@ }, { "commandType": "dispense", - "key": "032db156-a716-4fa2-8683-99cd424483c6", + "key": "4c21f952-f8a3-4174-b49d-8211605c8623", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4855,7 +4861,7 @@ }, { "commandType": "aspirate", - "key": "0c4b6581-62ce-49f2-8916-1086071c579b", + "key": "97710ca5-fee5-41e6-8e5f-dd2dbcaef1a0", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, @@ -4874,7 +4880,7 @@ }, { "commandType": "touchTip", - "key": "b4a66d40-394a-4350-ad29-0a3b7bbde31b", + "key": "e0203037-a9f1-4438-89d3-43568ff0a69c", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well:opentrons/usascientific_96_wellplate_2.4ml_deep/1", @@ -4889,7 +4895,7 @@ }, { "commandType": "dispense", - "key": "8409f328-898c-48d5-b2f0-14334072d2a2", + "key": "052412a5-94a2-4179-9a81-57f06ac6143c", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, @@ -4908,7 +4914,7 @@ }, { "commandType": "aspirate", - "key": "3f6459ee-02d6-499e-ba89-f0ebffb48d88", + "key": "df97f1f7-65c1-4bd7-ba7e-1dbc63f432f3", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -4927,7 +4933,7 @@ }, { "commandType": "dispense", - "key": "1bf54eb3-f3ba-43f7-9ccc-43c83b1fcf13", + "key": "0d0a7e80-8576-46dc-be69-ca24544b02f2", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -4946,7 +4952,7 @@ }, { "commandType": "aspirate", - "key": "8166d4a6-0a41-4a2c-bccb-043859a9f1d8", + "key": "aba04cf1-2028-492b-a28a-f629eeab5f65", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -4965,7 +4971,7 @@ }, { "commandType": "dispense", - "key": "47d7fd68-05b0-41f6-9c4c-7a37aa7bcb13", + "key": "de937cbb-c4aa-45fb-9548-d0f84e4dda28", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -4984,7 +4990,7 @@ }, { "commandType": "moveToAddressableArea", - "key": "3809644f-92fa-4da0-9db5-542c0a181e8c", + "key": "235df24b-9d44-4d15-96ca-42c5e632251f", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -4997,7 +5003,7 @@ }, { "commandType": "blowOutInPlace", - "key": "929ce1cb-82cb-4c39-92a3-39c628b019c9", + "key": "2e49a1a0-3885-45ed-a8a1-1e5cd3ff9846", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "flowRate": 1000 @@ -5005,7 +5011,7 @@ }, { "commandType": "touchTip", - "key": "6d135454-0d51-49df-bf4c-4e2bb813f1d2", + "key": "587f7545-ddaa-41fa-abdd-0fbce07e1fc6", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well:opentrons/usascientific_96_wellplate_2.4ml_deep/1", @@ -5020,7 +5026,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "349625a9-aa2b-4d35-b40b-8ef14e586a51", + "key": "5319b473-6b31-4be2-af1e-01e14fff25ba", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -5034,14 +5040,14 @@ }, { "commandType": "dropTipInPlace", - "key": "444440c9-00d5-4348-99a9-1a3cb1f742fd", + "key": "8ac985b6-3686-4bec-9491-303aa2d4e5a0", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e" } }, { "commandType": "pickUpTip", - "key": "4c52ae1d-70b1-4dc9-83e7-02b3af2c200e", + "key": "b092ef81-4360-4ad7-a444-c6d9307446ab", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "c6f4ec70-92a5-11e9-ac62-1b173f839d9e:tiprack-10ul:opentrons/opentrons_96_tiprack_10ul/1", @@ -5050,7 +5056,7 @@ }, { "commandType": "aspirate", - "key": "5640b654-9339-4845-9b40-a6beba046904", + "key": "2c6a096e-59de-4662-8cc2-dab696f55064", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -5069,7 +5075,7 @@ }, { "commandType": "dispense", - "key": "592654fb-22db-4ace-b2a7-f68f56a9967b", + "key": "f18e7e75-783b-407e-a84a-3e1ecfa9cb01", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -5088,7 +5094,7 @@ }, { "commandType": "aspirate", - "key": "3d039399-6e83-4a41-a3d1-2ab1c5482824", + "key": "9f68dfdd-f18f-4d29-823c-3554ca017e0c", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -5107,7 +5113,7 @@ }, { "commandType": "dispense", - "key": "d0fe6ba1-5037-4b30-a5c5-22efa87fa431", + "key": "46f31d39-b423-48c5-ab1f-29555f2e1957", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -5126,7 +5132,7 @@ }, { "commandType": "aspirate", - "key": "df2ba6f0-4d77-430b-97fc-5ce88b1f3947", + "key": "61713144-9c70-493d-8207-118892ae1afb", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -5145,7 +5151,7 @@ }, { "commandType": "dispense", - "key": "85078a16-bdf9-471d-9b07-4938634c49c9", + "key": "d6e61857-d24c-49c5-b590-17e7e16ce460", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -5164,7 +5170,7 @@ }, { "commandType": "aspirate", - "key": "bc04ada5-ca7f-4bc5-bf00-d85e82360ab8", + "key": "64ff64a6-62a9-4612-8e4d-adc40254a760", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, @@ -5183,7 +5189,7 @@ }, { "commandType": "touchTip", - "key": "2cc0af02-6209-4482-9436-4a3cbf4e52d6", + "key": "9525512e-10c3-46bc-bd51-e82af933a363", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well:opentrons/usascientific_96_wellplate_2.4ml_deep/1", @@ -5198,7 +5204,7 @@ }, { "commandType": "dispense", - "key": "6d084361-fbed-49c1-af3e-28e58e8e60b7", + "key": "f600f10b-b5e6-44aa-92f1-ddefb91eefc1", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, @@ -5217,7 +5223,7 @@ }, { "commandType": "aspirate", - "key": "dd665ee5-3242-4c63-afe0-e2083810ee37", + "key": "8a6d29a0-8555-4f87-b859-adf93b9ec598", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -5236,7 +5242,7 @@ }, { "commandType": "dispense", - "key": "7ef70d87-4be3-4260-8098-39599f8a1fb0", + "key": "0fb0c6c9-d7fe-46cf-959d-84e23d164236", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -5255,7 +5261,7 @@ }, { "commandType": "aspirate", - "key": "588334ee-930e-4a6d-a1ab-69c145197023", + "key": "f35ecbf2-32c7-478d-a273-3c924f3ca7ee", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -5274,7 +5280,7 @@ }, { "commandType": "dispense", - "key": "857d9f81-2181-4ca2-9389-cad3fa9aee70", + "key": "a1043e5a-83ae-47a1-ad43-a1dae2089850", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -5293,7 +5299,7 @@ }, { "commandType": "moveToAddressableArea", - "key": "ad2d67a4-625c-437b-96c8-e48fd7918577", + "key": "687ea83a-9c5f-45ad-acb0-356d80b8ac5a", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -5306,7 +5312,7 @@ }, { "commandType": "blowOutInPlace", - "key": "2d154de5-d3e3-4641-a1e3-5c006d810006", + "key": "06d1f4d9-c932-4c58-9182-aea2232cae42", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "flowRate": 1000 @@ -5314,7 +5320,7 @@ }, { "commandType": "touchTip", - "key": "6b0659e9-1856-4550-8279-fb82fc2e94a7", + "key": "30da32b8-1d0f-449a-8ad6-c8d2ab8f21d6", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well:opentrons/usascientific_96_wellplate_2.4ml_deep/1", @@ -5329,7 +5335,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "cec99b96-c228-4e2a-a143-fbbbfb50901e", + "key": "9e5c1bee-e858-4c05-bd23-d76bf3e9905b", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -5343,14 +5349,14 @@ }, { "commandType": "dropTipInPlace", - "key": "15825029-3fab-4e68-9469-560e148e7ced", + "key": "cf676e27-7b50-4441-9503-54799055c61c", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e" } }, { "commandType": "pickUpTip", - "key": "161b384c-5c92-4056-8015-2719ee427475", + "key": "31187b3d-8c42-469b-af23-7cdce6d06b44", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "c6f4ec70-92a5-11e9-ac62-1b173f839d9e:tiprack-10ul:opentrons/opentrons_96_tiprack_10ul/1", @@ -5359,7 +5365,7 @@ }, { "commandType": "aspirate", - "key": "08f3fb64-eaf8-4416-aa23-baba231efed0", + "key": "f9e1a43e-8959-4640-8f08-3fa850c84f0c", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -5378,7 +5384,7 @@ }, { "commandType": "dispense", - "key": "651d97ff-dc34-41cd-8dd4-c0b94f21c674", + "key": "c7913d86-ff26-453a-9032-88d3674b4439", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -5397,7 +5403,7 @@ }, { "commandType": "aspirate", - "key": "ca22a85d-6732-4c43-a8ea-4a857065ddd2", + "key": "34831446-bce1-440f-a765-9c53571e9c65", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -5416,7 +5422,7 @@ }, { "commandType": "dispense", - "key": "f16da0ca-bba1-4ee1-a2ed-f68fdbeee204", + "key": "caa88df0-25b6-40de-a25b-aa147369c086", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -5435,7 +5441,7 @@ }, { "commandType": "aspirate", - "key": "c91c5044-4c23-420e-9892-a4067215d78d", + "key": "b9900e0a-2149-4ebb-9182-5446ddcf999b", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -5454,7 +5460,7 @@ }, { "commandType": "dispense", - "key": "47346096-1081-4817-96c9-77d799327011", + "key": "6affd104-4b47-4419-a1d4-8afcc93b88e6", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -5473,7 +5479,7 @@ }, { "commandType": "aspirate", - "key": "35813192-b966-4cbd-95a9-9d87cae07adc", + "key": "eec6bd80-d9c6-4001-ac19-c521246f008a", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, @@ -5492,7 +5498,7 @@ }, { "commandType": "touchTip", - "key": "eac2a4b2-65cc-4c8d-b8d8-01b2c9bf2a20", + "key": "7c9a3c45-e6ee-42db-8c31-1f75c89042c4", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well:opentrons/usascientific_96_wellplate_2.4ml_deep/1", @@ -5507,7 +5513,7 @@ }, { "commandType": "dispense", - "key": "194be867-02d5-48d1-a19f-9c01fb832068", + "key": "0fd7e858-2609-4a4b-aa94-04c8b7663452", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, @@ -5526,7 +5532,7 @@ }, { "commandType": "aspirate", - "key": "99ffbb3c-e5a2-48f4-a4a4-811b6839aeea", + "key": "8a310593-cab4-4874-aa09-f5fc3b5d1aca", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -5545,7 +5551,7 @@ }, { "commandType": "dispense", - "key": "78a477c6-5414-480e-8953-0ba4bb94f220", + "key": "9baf1ed3-b439-41cf-ad6b-c501b155dbda", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -5564,7 +5570,7 @@ }, { "commandType": "aspirate", - "key": "1f7e8e1b-8f71-4782-b731-266da9db63ff", + "key": "d463c700-dac1-463b-8dd2-8667f3eb037e", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -5583,7 +5589,7 @@ }, { "commandType": "dispense", - "key": "7e06c384-46d3-40af-b820-96c86d8a5da5", + "key": "61fba73d-bf33-46c6-b569-637c01ef1395", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -5602,7 +5608,7 @@ }, { "commandType": "moveToAddressableArea", - "key": "fca397e0-65a0-48d6-83fe-05132b2ddc24", + "key": "62e22ade-d8fd-4877-ae72-a3316e2e0608", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -5615,7 +5621,7 @@ }, { "commandType": "blowOutInPlace", - "key": "8f53ee29-11fb-441b-9719-97c132f275b5", + "key": "0dc6e24a-18ca-4793-9059-084b040e3c7e", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "flowRate": 1000 @@ -5623,7 +5629,7 @@ }, { "commandType": "touchTip", - "key": "0699658d-fb6c-4b56-b803-00dd96940cc4", + "key": "6c4dca23-1208-4e35-9dce-17b90f9da4db", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well:opentrons/usascientific_96_wellplate_2.4ml_deep/1", @@ -5638,7 +5644,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "9b306194-770b-49ef-bcd3-95c64244679e", + "key": "63591b00-dc8d-413b-afb4-925431ba0fef", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -5652,14 +5658,14 @@ }, { "commandType": "dropTipInPlace", - "key": "0c9714a3-0018-44fa-a531-8dcf9c168d1a", + "key": "65010ce3-901b-4608-968b-ae7b1726512d", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e" } }, { "commandType": "pickUpTip", - "key": "e13d0327-a840-4de7-b7ce-fbde43257c34", + "key": "670b61af-2f95-4e23-a5c1-ad6155244add", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "c6f4ec70-92a5-11e9-ac62-1b173f839d9e:tiprack-10ul:opentrons/opentrons_96_tiprack_10ul/1", @@ -5668,7 +5674,7 @@ }, { "commandType": "aspirate", - "key": "2a19acac-8b2f-4f28-8eee-826a8d6bff15", + "key": "47bca455-b34f-4333-ac30-47768fa98ff0", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -5687,7 +5693,7 @@ }, { "commandType": "dispense", - "key": "88afadcf-1256-437e-856c-4f615ccb4a72", + "key": "5c1930a8-cf8a-49b8-b7ee-51205d0afb1b", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -5706,7 +5712,7 @@ }, { "commandType": "aspirate", - "key": "d8319c46-7fd0-4f68-82d1-6a761556ec85", + "key": "384a6802-77fe-4b0e-ad14-709c2fdbe1cb", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -5725,7 +5731,7 @@ }, { "commandType": "dispense", - "key": "5e18da13-4b92-4733-9e9c-26f57a5eb5b4", + "key": "77a0e5bf-9892-4998-b775-b45ea8032e51", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -5744,7 +5750,7 @@ }, { "commandType": "aspirate", - "key": "18fb939f-0390-4741-9fee-50b1911936c0", + "key": "71c0d2ab-505f-4e7d-9681-76c98fc7670a", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -5763,7 +5769,7 @@ }, { "commandType": "dispense", - "key": "40da27db-1412-440d-bbd0-5148b6f64ed7", + "key": "1992b40f-0ded-4cbb-8feb-3345771cc685", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -5782,7 +5788,7 @@ }, { "commandType": "aspirate", - "key": "9f504ffd-465d-495b-a656-109d35cfe9b1", + "key": "7cc44132-fc06-4808-91fa-977efa07b01c", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, @@ -5801,7 +5807,7 @@ }, { "commandType": "touchTip", - "key": "394d2f74-5e28-4e6f-b815-c97087c89691", + "key": "a7d6848f-621b-4e5a-a1cf-f11fca3f448c", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well:opentrons/usascientific_96_wellplate_2.4ml_deep/1", @@ -5816,7 +5822,7 @@ }, { "commandType": "dispense", - "key": "8cb558bd-2ea6-497c-b070-af6e41664a26", + "key": "9096cb20-4e87-4249-9da3-327a7f746d5c", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, @@ -5835,7 +5841,7 @@ }, { "commandType": "aspirate", - "key": "3274dd59-0600-4c2a-890a-fecfac8b5862", + "key": "91c83d69-771c-48c1-920b-951664d66df1", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -5854,7 +5860,7 @@ }, { "commandType": "dispense", - "key": "21d4fc28-b92e-4e45-a1ef-cccee395e3ec", + "key": "45e2a957-49b1-4f9e-9c97-f6ff470457c8", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -5873,7 +5879,7 @@ }, { "commandType": "aspirate", - "key": "7d9b7d52-8963-41bd-869a-afb3273ad34e", + "key": "78cd4847-b928-43df-b2df-ec89a3211243", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -5892,7 +5898,7 @@ }, { "commandType": "dispense", - "key": "35a3b1ab-efa8-4f6b-b074-b5bedb66f827", + "key": "1de06143-7e09-4030-bb53-d2b769690b95", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -5911,7 +5917,7 @@ }, { "commandType": "moveToAddressableArea", - "key": "9acfc10b-c99c-4f11-a270-0f5eec661be5", + "key": "ae8c36f1-2af0-43c3-892f-af8f7a057e99", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -5924,7 +5930,7 @@ }, { "commandType": "blowOutInPlace", - "key": "e3135725-cb6f-45a1-9fe0-d19f04f27656", + "key": "a2dc3be0-b847-4fc0-a2c7-529794908f2b", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "flowRate": 1000 @@ -5932,7 +5938,7 @@ }, { "commandType": "touchTip", - "key": "96673cd7-fd03-4c0a-bb2a-b14a0ffb0ccb", + "key": "0017585f-5ff6-49c7-84c5-dccfae364cbd", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well:opentrons/usascientific_96_wellplate_2.4ml_deep/1", @@ -5947,7 +5953,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "2132f0ae-ea2e-443b-a971-5c79ee30f789", + "key": "b287747c-81fc-4c6a-a422-705377142116", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -5961,14 +5967,14 @@ }, { "commandType": "dropTipInPlace", - "key": "9c328923-a752-40b1-9270-ed97a3a0c553", + "key": "0551b764-b82f-4ae2-beb2-c7adf2dc6b54", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e" } }, { "commandType": "pickUpTip", - "key": "988563f5-56c4-4e21-a92b-b6e2dfb8bde5", + "key": "1e0289a4-61cf-4990-ba90-2f385a213079", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "c6f4ec70-92a5-11e9-ac62-1b173f839d9e:tiprack-10ul:opentrons/opentrons_96_tiprack_10ul/1", @@ -5977,7 +5983,7 @@ }, { "commandType": "aspirate", - "key": "c98f3b96-fd38-40f2-9794-828ff525969c", + "key": "8709c899-db94-42fa-b1dc-f3c97733abdc", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -5996,7 +6002,7 @@ }, { "commandType": "dispense", - "key": "576cd475-ef5a-4016-a705-efd349d2e442", + "key": "d826a43b-5440-4ba1-bc27-048c59c48821", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -6015,7 +6021,7 @@ }, { "commandType": "aspirate", - "key": "e7ee52ac-8fcf-44ba-82a2-1db637e376be", + "key": "60f35226-94d0-4bc1-b529-144945af67bc", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -6034,7 +6040,7 @@ }, { "commandType": "dispense", - "key": "77016b31-a245-40fc-a52e-c83b3004b81f", + "key": "dd214b0c-cc5b-403d-8ae1-e41d946521e4", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -6053,7 +6059,7 @@ }, { "commandType": "aspirate", - "key": "7db3ab8a-5903-4960-bbdc-26497da191ad", + "key": "cc898a43-afd4-4a11-96ae-0fba6c8e3e3f", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -6072,7 +6078,7 @@ }, { "commandType": "dispense", - "key": "910d7439-52d6-4a16-a6a5-0b71e3c32696", + "key": "e99ba431-0662-427f-ae20-fbbcb1ecc454", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -6091,7 +6097,7 @@ }, { "commandType": "aspirate", - "key": "39bfaad3-fdc2-42d1-8f12-d2684d0a9bbf", + "key": "e3a612d0-1a8a-4b89-bd2e-8c94b646e5a0", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, @@ -6110,7 +6116,7 @@ }, { "commandType": "touchTip", - "key": "44f4d1a4-26c3-435e-810c-ecaad59a55ab", + "key": "b196c957-003b-4d2b-b0e0-9fabbb467015", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well:opentrons/usascientific_96_wellplate_2.4ml_deep/1", @@ -6125,7 +6131,7 @@ }, { "commandType": "dispense", - "key": "ddc2756d-38e4-4d42-81a1-ad531797ec79", + "key": "186ff8c9-57c9-43a2-9dd3-12c886d85c6e", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, @@ -6144,7 +6150,7 @@ }, { "commandType": "aspirate", - "key": "23ecb712-813c-4221-92b5-b7ad0df7c91e", + "key": "92958a8f-18cf-4770-a5c7-520578a9e1ac", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -6163,7 +6169,7 @@ }, { "commandType": "dispense", - "key": "020d2f92-da37-4230-9041-0d746dbc81c8", + "key": "81269d20-c06b-4e6d-ac0b-28beaa42e84d", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -6182,7 +6188,7 @@ }, { "commandType": "aspirate", - "key": "9493caea-f0ee-459a-b286-b656c540fa19", + "key": "944816f0-75fa-427a-91e6-241a17d335ef", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -6201,7 +6207,7 @@ }, { "commandType": "dispense", - "key": "2fd36c9a-4387-4e0d-b96b-c095c325450c", + "key": "50baa2c8-09cb-4457-a88f-d4bf2025ab62", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -6220,7 +6226,7 @@ }, { "commandType": "moveToAddressableArea", - "key": "c5c15d57-b094-4344-8a9d-ef55442e587c", + "key": "f6860db4-02f6-42de-9c5e-952861986160", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -6233,7 +6239,7 @@ }, { "commandType": "blowOutInPlace", - "key": "9f3a5bc5-d27e-47f3-996c-873edee7e793", + "key": "b3a42537-456b-4d2e-9909-aa6050280bdf", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "flowRate": 1000 @@ -6241,7 +6247,7 @@ }, { "commandType": "touchTip", - "key": "817158fe-bf57-4d1e-a6a4-020cfd8d79ab", + "key": "6eb19d13-f030-4b84-a68d-4be98fa8d1c4", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well:opentrons/usascientific_96_wellplate_2.4ml_deep/1", @@ -6256,7 +6262,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "30538d0c-d451-46fe-a19d-56f564b351e5", + "key": "83acf0f8-37fc-4b46-8788-0125b35d79c7", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -6270,14 +6276,14 @@ }, { "commandType": "dropTipInPlace", - "key": "08f1c64b-09d5-4ac2-a5c3-3d152da7cad2", + "key": "33cdfe7e-00c2-4deb-a276-57e41a25c689", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e" } }, { "commandType": "pickUpTip", - "key": "45323d95-f2a6-47a2-8854-62e54e92585b", + "key": "40946613-5d56-490f-892f-4570ce6dc494", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "c6f4ec70-92a5-11e9-ac62-1b173f839d9e:tiprack-10ul:opentrons/opentrons_96_tiprack_10ul/1", @@ -6286,7 +6292,7 @@ }, { "commandType": "aspirate", - "key": "befaaff7-d4e1-4b3c-9c0c-d40c2b956962", + "key": "7a975917-cb11-4947-82d4-ec0fb6ff48e4", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 5.5, @@ -6305,7 +6311,7 @@ }, { "commandType": "dispense", - "key": "bac1ea10-10c5-41ca-96ce-781304f8675e", + "key": "a82ee50c-437b-4861-bfa7-1a390fc3e19b", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 5.5, @@ -6324,7 +6330,7 @@ }, { "commandType": "aspirate", - "key": "f37e217e-4939-44e2-9671-9b05ad14786d", + "key": "8a93c248-0c06-49fe-a39e-7b0111d52112", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 5.5, @@ -6343,7 +6349,7 @@ }, { "commandType": "dispense", - "key": "c159f36c-e926-4875-b99b-4add3525c4e3", + "key": "6a94836c-c4d7-422e-b79f-e42accd7ce7d", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 5.5, @@ -6362,7 +6368,7 @@ }, { "commandType": "aspirate", - "key": "25ae2b7c-b305-4e87-840d-42de7ded3b4b", + "key": "871678da-eed3-42d1-bff6-ec89a3ce578d", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 5.5, @@ -6381,7 +6387,7 @@ }, { "commandType": "dispense", - "key": "23397b4a-4383-42ed-b8f4-e44f3a010a71", + "key": "79880e8a-41d3-4b67-ac46-b133f6c06877", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 5.5, @@ -6400,7 +6406,7 @@ }, { "commandType": "moveToAddressableArea", - "key": "890a6535-a85d-466f-8505-64405697b5a0", + "key": "ec7ec1b4-d6e9-437d-802a-9b9df4fe39f5", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -6413,7 +6419,7 @@ }, { "commandType": "blowOutInPlace", - "key": "c8253121-dac9-4f54-93f9-f5db77f7c879", + "key": "4aa188ff-d2c1-4484-a43f-91164ab987b2", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "flowRate": 1000 @@ -6421,7 +6427,7 @@ }, { "commandType": "touchTip", - "key": "57b65cb0-810c-44f2-b3bb-9a4c9d7e829d", + "key": "e62327c7-e230-410a-8304-a1c37ff4708e", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well:opentrons/usascientific_96_wellplate_2.4ml_deep/1", @@ -6436,7 +6442,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "0d13cd12-8ca0-4ead-bfbd-debe41d9a00e", + "key": "3bcc74cd-956f-428d-8978-dd359c7ed802", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -6450,14 +6456,14 @@ }, { "commandType": "dropTipInPlace", - "key": "087b6b54-6e37-48c3-aeda-91ee0b43febc", + "key": "59c39c03-fd02-4e7a-b26e-c99ec30d0aaa", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e" } }, { "commandType": "waitForDuration", - "key": "f1e0270b-15e2-4ba6-adaa-4369bd92c271", + "key": "74d10946-d37d-456f-bf79-afaada065939", "params": { "seconds": 3723, "message": "Delay plz" diff --git a/protocol-designer/fixtures/protocol/8/mix_8_0_0.json b/protocol-designer/fixtures/protocol/8/mix_8_0_0.json index 0676e730b1c..b3f37e7e9b5 100644 --- a/protocol-designer/fixtures/protocol/8/mix_8_0_0.json +++ b/protocol-designer/fixtures/protocol/8/mix_8_0_0.json @@ -36,6 +36,9 @@ }, "pipetteLocationUpdate": { "pipetteId": "left" }, "moduleLocationUpdate": {}, + "wasteChuteLocationUpdate": {}, + "stagingAreaLocationUpdate": {}, + "gripperLocationUpdate": {}, "stepType": "manualIntervention", "id": "__INITIAL_DECK_SETUP_STEP__" }, diff --git a/protocol-designer/fixtures/protocol/8/newAdvancedSettingsAndMultiTemp.json b/protocol-designer/fixtures/protocol/8/newAdvancedSettingsAndMultiTemp.json index 90e2e0a5f52..eeb2cd9765c 100644 --- a/protocol-designer/fixtures/protocol/8/newAdvancedSettingsAndMultiTemp.json +++ b/protocol-designer/fixtures/protocol/8/newAdvancedSettingsAndMultiTemp.json @@ -6,7 +6,7 @@ "author": "", "description": "", "created": 1714565695341, - "lastModified": 1738157367073, + "lastModified": 1738682506391, "category": null, "subcategory": null, "tags": [] @@ -15,7 +15,7 @@ "name": "opentrons/protocol-designer", "version": "8.5.0", "data": { - "_internalAppBuildDate": "Wed, 29 Jan 2025 13:23:47 GMT", + "_internalAppBuildDate": "Tue, 04 Feb 2025 15:16:30 GMT", "defaultValues": { "aspirate_mmFromBottom": 1, "dispense_mmFromBottom": 1, @@ -48,6 +48,12 @@ "pipetteLocationUpdate": { "21087f15-4c03-4587-8a2b-1ba0b5a501a0": "left" }, + "trashBinLocationUpdate": { + "20ab923c-1290-402e-8476-bba30991f24e:trashBin": "cutoutA3" + }, + "wasteChuteLocationUpdate": {}, + "stagingAreaLocationUpdate": {}, + "gripperLocationUpdate": {}, "stepType": "manualIntervention", "id": "__INITIAL_DECK_SETUP_STEP__" }, @@ -110,8 +116,8 @@ "stepType": "moveLiquid", "stepName": "transfer", "stepDetails": "", - "id": "292e8b18-f59e-4c63-b0f3-e242bf50094b", - "dispense_touchTip_mmfromTop": null + "dispense_touchTip_mmfromTop": null, + "id": "292e8b18-f59e-4c63-b0f3-e242bf50094b" }, "960c2d3b-9cf9-49b0-ab4c-af4113f6671a": { "moduleId": "d6966555-6c0e-45e0-8056-428d7c486401:temperatureModuleType", @@ -3591,7 +3597,7 @@ "commandSchemaId": "opentronsCommandSchemaV8", "commands": [ { - "key": "bc9f6354-a7a7-407a-86fa-d764fed37892", + "key": "4e81978e-27c9-4d5c-b3af-0548d0356a69", "commandType": "loadPipette", "params": { "pipetteName": "p50_single_flex", @@ -3600,7 +3606,7 @@ } }, { - "key": "5653381b-77ed-49c5-b13a-a897108e25b2", + "key": "edcdab68-334b-4b49-ac81-af0741538f44", "commandType": "loadModule", "params": { "model": "temperatureModuleV2", @@ -3611,7 +3617,7 @@ } }, { - "key": "9b05da10-4b23-4e6b-82f0-03d078c0aafc", + "key": "d408749c-8240-491e-9397-05cb9d0e117f", "commandType": "loadModule", "params": { "model": "temperatureModuleV2", @@ -3622,7 +3628,7 @@ } }, { - "key": "c195d07a-ca33-4a3c-a33d-1f5df2f3b906", + "key": "9a607dd5-2a6c-4f65-befb-1927ab1d96c3", "commandType": "loadLabware", "params": { "displayName": "Opentrons 96 Well Aluminum Block", @@ -3636,7 +3642,7 @@ } }, { - "key": "cad83091-9a60-4df4-aaa8-86316b44e6b4", + "key": "c461976c-2b67-405b-a5b4-30d8e843aa59", "commandType": "loadLabware", "params": { "displayName": "Opentrons Flex 96 Tip Rack 50 µL", @@ -3650,7 +3656,7 @@ } }, { - "key": "3128ec57-5aed-4824-8b91-f9a3f7a9ea1f", + "key": "69314eb3-f57f-4a63-b1db-bf3e874d7de7", "commandType": "loadLabware", "params": { "displayName": "Opentrons 24 Well Aluminum Block with NEST 1.5 mL Screwcap", @@ -3664,7 +3670,7 @@ } }, { - "key": "d70bb67b-f388-4eda-84a5-51accd89c534", + "key": "9b6120d9-1d75-4bbb-b165-03c22541c92f", "commandType": "loadLabware", "params": { "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", @@ -3679,7 +3685,7 @@ }, { "commandType": "pickUpTip", - "key": "5535c00b-3931-43b4-bd39-6f7498ac3739", + "key": "5ad19fa0-44d6-46f9-9d7c-834a8c1daa2a", "params": { "pipetteId": "21087f15-4c03-4587-8a2b-1ba0b5a501a0", "labwareId": "0d39213c-49c2-4170-bf19-4c09e1b72aca:opentrons/opentrons_flex_96_tiprack_50ul/1", @@ -3688,7 +3694,7 @@ }, { "commandType": "configureForVolume", - "key": "a35a7664-c44a-41fb-9e67-08b01f2339f7", + "key": "214ad986-39fd-4fd8-a3d1-11e7a3fee49f", "params": { "pipetteId": "21087f15-4c03-4587-8a2b-1ba0b5a501a0", "volume": 10 @@ -3696,7 +3702,7 @@ }, { "commandType": "aspirate", - "key": "d7a2bb3f-4158-41c2-83fa-95c33f02c076", + "key": "1677354b-365b-478f-902a-2356d7caffdb", "params": { "pipetteId": "21087f15-4c03-4587-8a2b-1ba0b5a501a0", "volume": 10, @@ -3715,7 +3721,7 @@ }, { "commandType": "dispense", - "key": "5c6fc843-d3e9-46ba-88a7-34f88771010a", + "key": "eb29cc00-3d96-484f-9c5c-36b3f6d3b2f6", "params": { "pipetteId": "21087f15-4c03-4587-8a2b-1ba0b5a501a0", "volume": 10, @@ -3734,7 +3740,7 @@ }, { "commandType": "blowout", - "key": "e53ccf8f-b3e3-4a63-a84e-b000457162e6", + "key": "dd09a42d-78d0-451f-9ad8-00a2573fe98a", "params": { "pipetteId": "21087f15-4c03-4587-8a2b-1ba0b5a501a0", "labwareId": "c0093e5f-3f7d-4cbf-aa17-d88394108501:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", @@ -3750,7 +3756,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "287251ef-d8dc-4ae5-ad72-ac84cd81e5b6", + "key": "442a0535-ed1d-42b0-a98c-5234fd4a8570", "params": { "pipetteId": "21087f15-4c03-4587-8a2b-1ba0b5a501a0", "addressableAreaName": "movableTrashA3", @@ -3764,14 +3770,14 @@ }, { "commandType": "dropTipInPlace", - "key": "ea735ed4-a2c6-41af-ae6e-7eb223db25bf", + "key": "8e3e6a32-3a2c-4b8e-a2d3-d028e952fd9e", "params": { "pipetteId": "21087f15-4c03-4587-8a2b-1ba0b5a501a0" } }, { "commandType": "temperatureModule/setTargetTemperature", - "key": "c45ee0b8-08fa-4854-8a0d-e65f513c2f08", + "key": "97e3e319-2254-4842-8280-551a35f40f30", "params": { "moduleId": "d6966555-6c0e-45e0-8056-428d7c486401:temperatureModuleType", "celsius": 40 @@ -3779,7 +3785,7 @@ }, { "commandType": "temperatureModule/waitForTemperature", - "key": "f994033a-27cf-4ce1-999b-242edae5538e", + "key": "3bb0e089-4a38-4bcc-b92c-19957bef78a2", "params": { "moduleId": "d6966555-6c0e-45e0-8056-428d7c486401:temperatureModuleType", "celsius": 40 @@ -3787,7 +3793,7 @@ }, { "commandType": "temperatureModule/setTargetTemperature", - "key": "6ceb2f9e-7ac4-4807-ada9-5d1d3cd316ce", + "key": "b758e33e-4c6d-46d6-be6f-807e9da90dfb", "params": { "moduleId": "b9c56153-9026-42d1-8113-949e15254571:temperatureModuleType", "celsius": 4 @@ -3795,7 +3801,7 @@ }, { "commandType": "temperatureModule/waitForTemperature", - "key": "e090a25b-48ec-4a2e-8744-23df852efee2", + "key": "76613ed5-1871-465b-aaf8-8b0de51e9265", "params": { "moduleId": "b9c56153-9026-42d1-8113-949e15254571:temperatureModuleType", "celsius": 4 diff --git a/protocol-designer/fixtures/protocol/8/ninetySixChannelFullAndColumn.json b/protocol-designer/fixtures/protocol/8/ninetySixChannelFullAndColumn.json index 52a16c9b234..f38b1eb287b 100644 --- a/protocol-designer/fixtures/protocol/8/ninetySixChannelFullAndColumn.json +++ b/protocol-designer/fixtures/protocol/8/ninetySixChannelFullAndColumn.json @@ -6,7 +6,7 @@ "author": "", "description": "", "created": 1701805621086, - "lastModified": 1738157515738, + "lastModified": 1738682533383, "category": null, "subcategory": null, "tags": [] @@ -15,7 +15,7 @@ "name": "opentrons/protocol-designer", "version": "8.5.0", "data": { - "_internalAppBuildDate": "Wed, 29 Jan 2025 13:23:47 GMT", + "_internalAppBuildDate": "Tue, 04 Feb 2025 15:16:30 GMT", "defaultValues": { "aspirate_mmFromBottom": 1, "dispense_mmFromBottom": 1, @@ -47,6 +47,12 @@ "pipetteLocationUpdate": { "de7da440-95ec-43e8-8723-851321fbd6f9": "left" }, + "trashBinLocationUpdate": { + "1e553651-9e4d-44b1-a31b-92459642bfd7:trashBin": "cutoutA3" + }, + "wasteChuteLocationUpdate": {}, + "stagingAreaLocationUpdate": {}, + "gripperLocationUpdate": {}, "stepType": "manualIntervention", "id": "__INITIAL_DECK_SETUP_STEP__" }, @@ -109,8 +115,8 @@ "stepType": "moveLiquid", "stepName": "transfer", "stepDetails": "", - "id": "83a095fa-b649-4105-99d4-177f1a3f363a", - "dispense_touchTip_mmfromTop": null + "dispense_touchTip_mmfromTop": null, + "id": "83a095fa-b649-4105-99d4-177f1a3f363a" }, "f5ea3139-1585-4848-9d5f-832eb88c99ca": { "aspirate_airGap_checkbox": false, @@ -171,8 +177,8 @@ "stepType": "moveLiquid", "stepName": "transfer", "stepDetails": "", - "id": "f5ea3139-1585-4848-9d5f-832eb88c99ca", - "dispense_touchTip_mmfromTop": null + "dispense_touchTip_mmfromTop": null, + "id": "f5ea3139-1585-4848-9d5f-832eb88c99ca" } }, "orderedStepIds": [ @@ -2306,7 +2312,7 @@ "commandSchemaId": "opentronsCommandSchemaV8", "commands": [ { - "key": "261b6dcd-ec1c-405c-bc13-bdca44557a4c", + "key": "8b0499d8-e1c0-4f8d-8e1f-fb8f5ca968f0", "commandType": "loadPipette", "params": { "pipetteName": "p1000_96", @@ -2315,7 +2321,7 @@ } }, { - "key": "4889f04d-e1fb-49ba-9f10-a0030c68ac7f", + "key": "6d18b281-8a99-427f-8e7f-6a5f1d75c691", "commandType": "loadLabware", "params": { "displayName": "Opentrons Flex 96 Tip Rack Adapter", @@ -2329,7 +2335,7 @@ } }, { - "key": "60a8ced3-f7bb-44db-a492-aa2d102cc465", + "key": "25bf1936-d9af-4554-9ac9-f3d125c71505", "commandType": "loadLabware", "params": { "displayName": "Opentrons Flex 96 Tip Rack 50 µL", @@ -2343,7 +2349,7 @@ } }, { - "key": "608c4a16-9751-44c8-96f8-eec999611c79", + "key": "31a2baad-d37a-4502-8ca8-7217746b5eec", "commandType": "loadLabware", "params": { "displayName": "Bio-Rad 96 Well Plate 200 µL PCR", @@ -2357,7 +2363,7 @@ } }, { - "key": "9905fa02-358f-4d23-b936-8711b2bf5600", + "key": "b1030040-9a1d-409c-824d-fb3c1c5e74fe", "commandType": "loadLabware", "params": { "displayName": "Opentrons Flex 96 Tip Rack 50 µL", @@ -2372,7 +2378,7 @@ }, { "commandType": "configureNozzleLayout", - "key": "e8d646ad-3046-4186-803f-a01e329cef97", + "key": "92de0faf-c381-4f9a-a3e5-bdd8dfbdc9a7", "params": { "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9", "configurationParams": { @@ -2382,7 +2388,7 @@ }, { "commandType": "pickUpTip", - "key": "ecf30773-7a3c-47c3-8c79-6b1f91bf20b2", + "key": "17719786-baf8-404b-8de3-05bcc1e86259", "params": { "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9", "labwareId": "75aa666f-98d8-4af9-908e-963ced428580:opentrons/opentrons_flex_96_tiprack_50ul/1", @@ -2391,7 +2397,7 @@ }, { "commandType": "aspirate", - "key": "bb5f9927-b5a2-4e5e-8015-a93d808aa3ea", + "key": "7ac552fa-97ce-4144-b18d-86624511f04d", "params": { "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9", "volume": 10, @@ -2410,7 +2416,7 @@ }, { "commandType": "moveToAddressableArea", - "key": "efd35098-e1b1-4353-b5e9-9cc8c87e66df", + "key": "0d5de06e-b28f-41c6-8087-3eef54823651", "params": { "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9", "addressableAreaName": "movableTrashA3", @@ -2423,7 +2429,7 @@ }, { "commandType": "dispenseInPlace", - "key": "b2da7fa8-1359-40fb-ab30-92e21fb879de", + "key": "061e56ac-b3b1-4632-85bc-bf98f5b3e440", "params": { "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9", "volume": 10, @@ -2432,7 +2438,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "9cdf6b7f-3fe4-455d-82db-2b0f3a8179bc", + "key": "bfbec11e-831f-48cd-8766-c40bcd77c33a", "params": { "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9", "addressableAreaName": "movableTrashA3", @@ -2446,14 +2452,14 @@ }, { "commandType": "dropTipInPlace", - "key": "335acc42-668d-4159-9943-df822419adae", + "key": "151289b6-cccd-47e7-b519-c0b327c69b63", "params": { "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9" } }, { "commandType": "configureNozzleLayout", - "key": "1950c1e6-1eb6-46c8-ba4b-c7c38c825094", + "key": "26a8d10e-40dc-4915-88fb-7131a4e0191a", "params": { "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9", "configurationParams": { @@ -2464,7 +2470,7 @@ }, { "commandType": "pickUpTip", - "key": "34b5dc55-8096-445d-b77c-40918b657c9f", + "key": "472ff857-edd5-4225-b555-2aa07ff4d6d9", "params": { "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9", "labwareId": "9bd16b50-4ae9-4cfd-8583-3378087e6a6c:opentrons/opentrons_flex_96_tiprack_50ul/1", @@ -2473,7 +2479,7 @@ }, { "commandType": "aspirate", - "key": "42132ae0-4321-4251-9b12-5aec2a398617", + "key": "02833246-8dd6-408f-9481-9408551727a7", "params": { "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9", "volume": 10, @@ -2492,7 +2498,7 @@ }, { "commandType": "moveToAddressableArea", - "key": "e6468d3a-d076-40be-bc49-da13f38c7e4e", + "key": "992c6b3c-ccef-409a-ab4b-a55b0cfcd549", "params": { "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9", "addressableAreaName": "movableTrashA3", @@ -2505,7 +2511,7 @@ }, { "commandType": "dispenseInPlace", - "key": "acbf26f8-2025-48df-85a8-8696815906f6", + "key": "f0e4d408-47ae-45f3-a7fc-d88dd2b42a35", "params": { "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9", "volume": 10, @@ -2514,7 +2520,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "0e00ce33-ab8f-4600-9a4c-72677d2d4408", + "key": "dce3b716-77e3-4b80-82dd-2a6a61a57a17", "params": { "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9", "addressableAreaName": "movableTrashA3", @@ -2528,7 +2534,7 @@ }, { "commandType": "dropTipInPlace", - "key": "bfba211e-b4a7-475d-88ce-134c134dc7a1", + "key": "93d69b14-2d41-4272-bcac-78d5810db8f0", "params": { "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9" } diff --git a/protocol-designer/fixtures/protocol/8/thermocyclerOnOt2V7MigratedToV8.json b/protocol-designer/fixtures/protocol/8/thermocyclerOnOt2V7MigratedToV8.json index 8a5e9916bb7..d08d93857e8 100644 --- a/protocol-designer/fixtures/protocol/8/thermocyclerOnOt2V7MigratedToV8.json +++ b/protocol-designer/fixtures/protocol/8/thermocyclerOnOt2V7MigratedToV8.json @@ -6,7 +6,7 @@ "author": "Hopia", "description": "testing a thermocycler on OT-2", "created": 1731356664582, - "lastModified": 1738157325544, + "lastModified": 1738683623686, "category": null, "subcategory": null, "tags": [] @@ -15,7 +15,7 @@ "name": "opentrons/protocol-designer", "version": "8.5.0", "data": { - "_internalAppBuildDate": "Wed, 29 Jan 2025 13:23:47 GMT", + "_internalAppBuildDate": "Tue, 04 Feb 2025 15:40:12 GMT", "defaultValues": { "aspirate_mmFromBottom": 1, "dispense_mmFromBottom": 1, @@ -95,6 +95,12 @@ "pipetteLocationUpdate": { "733ba018-3550-476c-9fa3-0b5259d1a1d6": "left" }, + "trashBinLocationUpdate": { + "dc2c4599-29b3-4ec8-adff-56677ac0821e:trashBin": "cutout12" + }, + "wasteChuteLocationUpdate": {}, + "stagingAreaLocationUpdate": {}, + "gripperLocationUpdate": {}, "stepType": "manualIntervention", "id": "__INITIAL_DECK_SETUP_STEP__" }, @@ -2260,7 +2266,7 @@ "commandSchemaId": "opentronsCommandSchemaV8", "commands": [ { - "key": "01d12a6f-a134-41ad-8a96-0f1db1caa648", + "key": "06942533-7498-4507-9a3e-a80640e0b11b", "commandType": "loadPipette", "params": { "pipetteName": "p20_single_gen2", @@ -2269,7 +2275,7 @@ } }, { - "key": "984a7baa-bf2d-4b9b-8d22-7fa864d443d5", + "key": "2d40fefe-7a97-4885-9813-745e87b558d3", "commandType": "loadModule", "params": { "model": "thermocyclerModuleV1", @@ -2280,7 +2286,7 @@ } }, { - "key": "70bd414e-8191-4c73-a79d-ec514a775cdd", + "key": "b6313d6a-b046-4c83-bd79-171ab2267d4a", "commandType": "loadLabware", "params": { "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", @@ -2295,7 +2301,7 @@ }, { "commandType": "loadLiquid", - "key": "6eeecce1-bf14-4ba9-ac27-99d4a45c1352", + "key": "2ae9cd8f-caaf-4236-8fa5-f389fdc11c61", "params": { "liquidId": "0", "labwareId": "ac928a51-a248-4304-be43-e9cb19c34fa9:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", @@ -2313,14 +2319,14 @@ }, { "commandType": "thermocycler/closeLid", - "key": "b3f3d0ef-d186-451b-b019-92170d4c54b0", + "key": "689eb7ee-b3ef-4fd0-ace8-6a095dc8079e", "params": { "moduleId": "82858229-5c25-46cc-87d4-35ab318c18ce:thermocyclerModuleType" } }, { "commandType": "thermocycler/setTargetLidTemperature", - "key": "a61991d4-e5ca-4828-88e1-16121263e580", + "key": "460e9a31-986e-491f-bf71-a3f93bfbd8f5", "params": { "moduleId": "82858229-5c25-46cc-87d4-35ab318c18ce:thermocyclerModuleType", "celsius": 50 @@ -2328,14 +2334,14 @@ }, { "commandType": "thermocycler/waitForLidTemperature", - "key": "5433a727-f2fc-49ef-a7b2-f88e426fa310", + "key": "0ecc6124-c69d-4627-b5db-4955291473fe", "params": { "moduleId": "82858229-5c25-46cc-87d4-35ab318c18ce:thermocyclerModuleType" } }, { "commandType": "thermocycler/setTargetLidTemperature", - "key": "cd2d7b9e-c308-4efd-9cbd-cca366abbe2d", + "key": "ac9e312f-077c-40b8-8962-3cc2f48c9e90", "params": { "moduleId": "82858229-5c25-46cc-87d4-35ab318c18ce:thermocyclerModuleType", "celsius": 40 @@ -2343,14 +2349,14 @@ }, { "commandType": "thermocycler/waitForLidTemperature", - "key": "ea9d18cd-d9a3-461e-96c1-ac41436474d6", + "key": "175ed209-4a23-4a8a-ae23-c896c1b45acc", "params": { "moduleId": "82858229-5c25-46cc-87d4-35ab318c18ce:thermocyclerModuleType" } }, { "commandType": "thermocycler/runProfile", - "key": "5d773732-71d8-45af-83f7-be31f4f89689", + "key": "541e8c3a-a19e-48e9-8f67-56898f309a95", "params": { "moduleId": "82858229-5c25-46cc-87d4-35ab318c18ce:thermocyclerModuleType", "profile": [ @@ -2388,14 +2394,14 @@ }, { "commandType": "thermocycler/deactivateBlock", - "key": "49c7e428-7a42-4bc0-93a8-8c30c375fe58", + "key": "55aad3e0-0854-408a-a46d-c8834cc5a601", "params": { "moduleId": "82858229-5c25-46cc-87d4-35ab318c18ce:thermocyclerModuleType" } }, { "commandType": "thermocycler/deactivateLid", - "key": "3358c263-9ce4-4a02-846f-26faf626ed50", + "key": "d878f02b-dda5-4bdd-8c8b-344493e498eb", "params": { "moduleId": "82858229-5c25-46cc-87d4-35ab318c18ce:thermocyclerModuleType" } diff --git a/protocol-designer/src/constants.ts b/protocol-designer/src/constants.ts index 7e782f6eee3..d7dbe1fb971 100644 --- a/protocol-designer/src/constants.ts +++ b/protocol-designer/src/constants.ts @@ -193,3 +193,5 @@ export const ABSORBANCE_READER_COLOR_BY_WAVELENGTH: Record = { 600: 'Orange', 650: 'Red', } + +export const GRIPPER_LOCATION: 'mounted' = 'mounted' diff --git a/protocol-designer/src/file-types.ts b/protocol-designer/src/file-types.ts index f8923d7a9e1..8a19aac0108 100644 --- a/protocol-designer/src/file-types.ts +++ b/protocol-designer/src/file-types.ts @@ -5,12 +5,13 @@ import type { ProtocolFile as ProtocolFileV3 } from '@opentrons/shared-data/prot import type { ProtocolFile as ProtocolFileV4 } from '@opentrons/shared-data/protocol/types/schemaV4' import type { ProtocolFile as ProtocolFileV5 } from '@opentrons/shared-data/protocol/types/schemaV5' import type { ProtocolFile as ProtocolFileV6 } from '@opentrons/shared-data/protocol/types/schemaV6' +import type { LiquidEntities } from '@opentrons/step-generation' export interface PDMetadata { // pipetteId to tiprackModel pipetteTiprackAssignments: Record dismissedWarnings: DismissRoot['dismissedWarnings'] - ingredients: IngredRoot['ingredients'] + ingredients: LiquidEntities ingredLocations: IngredRoot['ingredLocations'] savedStepForms: StepformRoot['savedStepForms'] orderedStepIds: StepformRoot['orderedStepIds'] diff --git a/protocol-designer/src/load-file/migration/8_5_0.ts b/protocol-designer/src/load-file/migration/8_5_0.ts index 55cd6e0baeb..6cf583da9ae 100644 --- a/protocol-designer/src/load-file/migration/8_5_0.ts +++ b/protocol-designer/src/load-file/migration/8_5_0.ts @@ -1,7 +1,8 @@ import floor from 'lodash/floor' import { swatchColors } from '../../organisms/DefineLiquidsModal/swatchColors' +import { getMigratedPositionFromTop } from './utils/getMigrationPositionFromTop' +import { getAdditionalEquipmentLocationUpdate } from './utils/getAdditionalEquipmentLocationUpdate' import type { - LabwareDefinition2, LoadLabwareCreateCommand, ProtocolFile, } from '@opentrons/shared-data' @@ -9,51 +10,16 @@ import type { LiquidEntities } from '@opentrons/step-generation' import type { DesignerApplicationDataV8_5 } from '../../file-data/selectors' import type { DesignerApplicationData } from './utils/getLoadLiquidCommands' -const getMigratedPositionFromTop = ( - labwareDefinitions: { - [definitionId: string]: LabwareDefinition2 - }, - loadLabwareCommands: LoadLabwareCreateCommand[], - labware: string, - type: 'aspirate' | 'dispense' | 'mix' -): number => { - const matchingLoadLabware = loadLabwareCommands.find( - command => - command.commandType === 'loadLabware' && - command.params.labwareId === labware - ) - if (matchingLoadLabware == null) { - console.error( - `expected to find matching ${type} labware load command but could not with ${type}_labware from form data as ${labware}` - ) - } - const labwareUri = - matchingLoadLabware != null - ? `${matchingLoadLabware.params.namespace}/${matchingLoadLabware.params.loadName}/${matchingLoadLabware.params.version}` - : '' - - // early exit for dispense_labware equaling trashBin or wasteChute - if (labwareDefinitions[labwareUri] == null) { - return 0 - } - - const matchingLabwareWellDepth = labwareUri - ? labwareDefinitions[labwareUri].wells.A1.depth - : 0 - - if (matchingLabwareWellDepth === 0) { - console.error( - `error in finding the ${type} labware well depth with labware uri ${labwareUri}` - ) - } - return matchingLabwareWellDepth -} - export const migrateFile = ( appData: ProtocolFile ): ProtocolFile => { - const { designerApplication, commands, labwareDefinitions, liquids } = appData - + const { + designerApplication, + commands, + labwareDefinitions, + liquids, + robot, + } = appData if (designerApplication == null || designerApplication?.data == null) { throw Error('The designerApplication key in your file is corrupt.') } @@ -170,6 +136,26 @@ export const migrateFile = ( {} ) + const updatedInitialStep = Object.values(savedStepForms).reduce( + (acc, form) => { + const { id } = form + if (id === '__INITIAL_DECK_SETUP_STEP__') { + return { + ...acc, + [id]: { + ...form, + ...getAdditionalEquipmentLocationUpdate( + commands, + robot.model, + savedStepForms + ), + }, + } + } + return acc + }, + {} + ) return { ...appData, designerApplication: { @@ -179,6 +165,7 @@ export const migrateFile = ( ingredients: migratedIngredients, savedStepForms: { ...designerApplication.data.savedStepForms, + ...updatedInitialStep, ...savedStepsWithUpdatedMoveLiquidFields, ...savedStepsWithUpdatedMixFields, }, diff --git a/protocol-designer/src/load-file/migration/utils/getAdditionalEquipmentLocationUpdate.ts b/protocol-designer/src/load-file/migration/utils/getAdditionalEquipmentLocationUpdate.ts new file mode 100644 index 00000000000..e6ea20e8c93 --- /dev/null +++ b/protocol-designer/src/load-file/migration/utils/getAdditionalEquipmentLocationUpdate.ts @@ -0,0 +1,270 @@ +import { + WASTE_CHUTE_ADDRESSABLE_AREAS, + FLEX_ROBOT_TYPE, + OT2_ROBOT_TYPE, + MOVABLE_TRASH_ADDRESSABLE_AREAS, + WASTE_CHUTE_CUTOUT, +} from '@opentrons/shared-data' +import { COLUMN_4_SLOTS, uuid } from '@opentrons/step-generation' +import { getUnoccupiedSlotForTrash } from '../../../step-forms' +import { getCutoutIdByAddressableArea } from '../../../utils' +import { GRIPPER_LOCATION } from '../../../constants' +import type { + AddressableAreaName, + CreateCommand, + LoadLabwareCreateCommand, + MoveLabwareCreateCommand, + MoveToAddressableAreaCreateCommand, + MoveToAddressableAreaForDropTipCreateCommand, + RobotType, +} from '@opentrons/shared-data' +import type { SavedStepFormState } from '../../../step-forms' + +export type LocationUpdate = Record + +export interface AdditionalEquipmentLocationUpdate { + trashBinLocationUpdate: LocationUpdate + wasteChuteLocationUpdate: LocationUpdate + stagingAreaLocationUpdate: LocationUpdate + gripperLocationUpdate: LocationUpdate +} + +const findTrashBinId = (savedStepForms: SavedStepFormState): string | null => { + if (!savedStepForms) { + return null + } + + for (const stepForm of Object.values(savedStepForms)) { + if (stepForm.stepType === 'moveLiquid') { + if (stepForm.dispense_labware.toLowerCase().includes('trash')) { + return stepForm.dispense_labware + } + if (stepForm.dropTip_location.toLowerCase().includes('trash')) { + return stepForm.dropTip_location + } + if (stepForm.blowout_location?.toLowerCase().includes('trash')) { + return stepForm.blowout_location + } + } + if (stepForm.stepType === 'mix') { + if (stepForm.dropTip_location.toLowerCase().includes('trash')) { + return stepForm.dropTip_location + } else if (stepForm.blowout_location?.toLowerCase().includes('trash')) { + return stepForm.blowout_location + } + } + } + + return null +} + +const getStagingAreaSlotNames = ( + commands: CreateCommand[], + commandType: 'moveLabware' | 'loadLabware', + locationKey: 'newLocation' | 'location' +): AddressableAreaName[] => { + return ( + Object.values(commands) + .filter( + ( + command + ): command is MoveLabwareCreateCommand | LoadLabwareCreateCommand => + command.commandType === commandType && + // @ts-expect-error: ts doesn't trust that locationkey is actually found in the command params + command.params[locationKey] !== 'offDeck' && + // @ts-expect-error + command.params[locationKey] !== 'systemLocation' && + // @ts-expect-error + 'addressableAreaName' in command.params[locationKey] && + COLUMN_4_SLOTS.includes( + // @ts-expect-error + command.params[locationKey] + .addressableAreaName as AddressableAreaName + ) + ) + // @ts-expect-error + .map(command => command.params[locationKey].addressableAreaName) + ) +} + +export const getAdditionalEquipmentLocationUpdate = ( + commands: CreateCommand[], + robotType: RobotType, + savedStepForms: SavedStepFormState +): AdditionalEquipmentLocationUpdate => { + const isFlex = robotType === FLEX_ROBOT_TYPE + + const hasGripperCommands = Object.values(commands).some( + (command): command is MoveLabwareCreateCommand => + (command.commandType === 'moveLabware' && + command.params.strategy === 'usingGripper') || + command.commandType === 'absorbanceReader/closeLid' || + command.commandType === 'absorbanceReader/openLid' + ) + const hasWasteChuteCommands = Object.values(commands).some( + command => + (command.commandType === 'moveToAddressableArea' && + WASTE_CHUTE_ADDRESSABLE_AREAS.includes( + command.params.addressableAreaName as AddressableAreaName + )) || + (command.commandType === 'moveLabware' && + command.params.newLocation !== 'offDeck' && + command.params.newLocation !== 'systemLocation' && + 'addressableAreaName' in command.params.newLocation && + WASTE_CHUTE_ADDRESSABLE_AREAS.includes( + command.params.newLocation.addressableAreaName as AddressableAreaName + )) + ) + + const stagingAreaSlotNames = [ + ...new Set([ + ...getStagingAreaSlotNames(commands, 'moveLabware', 'newLocation'), + ...getStagingAreaSlotNames(commands, 'loadLabware', 'location'), + ]), + ] + + const unoccupiedSlotForTrash = hasWasteChuteCommands + ? '' + : getUnoccupiedSlotForTrash( + commands, + hasWasteChuteCommands, + stagingAreaSlotNames + ) + + const trashBinCommand = Object.values(commands).find( + ( + command + ): command is + | MoveToAddressableAreaCreateCommand + | MoveToAddressableAreaForDropTipCreateCommand => + (command.commandType === 'moveToAddressableArea' && + (MOVABLE_TRASH_ADDRESSABLE_AREAS.includes( + command.params.addressableAreaName as AddressableAreaName + ) || + command.params.addressableAreaName === 'fixedTrash')) || + command.commandType === 'moveToAddressableAreaForDropTip' + ) + + const trashAddressableAreaName = trashBinCommand?.params.addressableAreaName + + const trashBinId = findTrashBinId(savedStepForms) + const trashCutoutId = + trashAddressableAreaName != null + ? getCutoutIdByAddressableArea( + trashAddressableAreaName as AddressableAreaName, + isFlex ? 'trashBinAdapter' : 'fixedTrashSlot', + isFlex ? FLEX_ROBOT_TYPE : OT2_ROBOT_TYPE + ) + : null + + const moveLiquidStepWasteChute = + savedStepForms != null + ? Object.values(savedStepForms).find( + stepForm => + stepForm.stepType === 'moveLiquid' && + (stepForm.aspirate_labware.includes('wasteChute') || + stepForm.dispense_labware.includes('wasteChute') || + stepForm.dropTip_location.includes('wasteChute') || + stepForm.blowout_location?.includes('wasteChute')) + ) + : null + + let wasteChuteId: string | null = null + if (hasWasteChuteCommands && moveLiquidStepWasteChute != null) { + if (moveLiquidStepWasteChute.aspirate_labware.includes('wasteChute')) { + wasteChuteId = moveLiquidStepWasteChute.aspirate_labware + } else if ( + moveLiquidStepWasteChute.dispense_labware.includes('wasteChute') + ) { + wasteChuteId = moveLiquidStepWasteChute.dispense_labware + } else if ( + moveLiquidStepWasteChute.dropTip_location.includes('wasteChute') + ) { + wasteChuteId = moveLiquidStepWasteChute.dropTip_location + } else if ( + moveLiquidStepWasteChute.blowOut_location?.includes('wasteChute') + ) { + wasteChuteId = moveLiquidStepWasteChute.blowOut_location + } + // new wasteChuteId generated for if there are only moveLabware commands + } else if (hasWasteChuteCommands && moveLiquidStepWasteChute == null) { + wasteChuteId = `${uuid()}:wasteChute` + } + + let wasteChuteLocationUpdate: LocationUpdate = + hasWasteChuteCommands && wasteChuteId != null + ? { + [wasteChuteId]: WASTE_CHUTE_CUTOUT, + } + : {} + + const gripperId = `${uuid()}:gripper` + const gripperLocationUpdate: LocationUpdate = hasGripperCommands + ? { + [gripperId]: GRIPPER_LOCATION, + } + : {} + + const hardcodedTrashBinIdOt2 = `${uuid()}:trashBin` + const hardcodedTrashBinOt2 = { + [hardcodedTrashBinIdOt2]: getCutoutIdByAddressableArea( + 'fixedTrash' as AddressableAreaName, + 'fixedTrashSlot', + OT2_ROBOT_TYPE + ), + } + + let trashBinLocationUpdate: LocationUpdate = hasWasteChuteCommands + ? {} + : hardcodedTrashBinOt2 + + if (trashAddressableAreaName != null && trashBinId != null) { + trashBinLocationUpdate = { + [trashBinId]: trashCutoutId as string, + } + // in case the user has no pipetting steps, auto-generate a trashBin or wasteChute entity for Flex + } else if (isFlex && !hasWasteChuteCommands) { + const hardCodedTrashIdFlex = `${uuid()}:movableTrash${unoccupiedSlotForTrash}` + const hardCodedWasteChuteId = `${uuid()}:wasteChute` + + trashBinLocationUpdate = + unoccupiedSlotForTrash === WASTE_CHUTE_CUTOUT + ? {} + : { + [hardCodedTrashIdFlex]: getCutoutIdByAddressableArea( + `movableTrash${unoccupiedSlotForTrash}` as AddressableAreaName, + 'trashBinAdapter', + FLEX_ROBOT_TYPE + ), + } + wasteChuteLocationUpdate = + unoccupiedSlotForTrash === WASTE_CHUTE_CUTOUT + ? { + [hardCodedWasteChuteId]: WASTE_CHUTE_CUTOUT, + } + : {} + } + + const stagingAreaLocationUpdate: LocationUpdate = stagingAreaSlotNames.reduce( + (acc, slot) => { + const stagingAreaId = `${uuid()}:stagingArea` + const cutoutId = getCutoutIdByAddressableArea( + slot, + 'stagingAreaRightSlot', + isFlex ? FLEX_ROBOT_TYPE : OT2_ROBOT_TYPE + ) + return { + ...acc, + [stagingAreaId]: cutoutId, + } + }, + {} + ) + + return { + stagingAreaLocationUpdate, + gripperLocationUpdate, + wasteChuteLocationUpdate, + trashBinLocationUpdate, + } +} diff --git a/protocol-designer/src/load-file/migration/utils/getMigrationPositionFromTop.ts b/protocol-designer/src/load-file/migration/utils/getMigrationPositionFromTop.ts new file mode 100644 index 00000000000..f7a5b7d3f15 --- /dev/null +++ b/protocol-designer/src/load-file/migration/utils/getMigrationPositionFromTop.ts @@ -0,0 +1,44 @@ +import type { + LabwareDefinition2, + LoadLabwareCreateCommand, +} from '@opentrons/shared-data' + +export const getMigratedPositionFromTop = ( + labwareDefinitions: { + [definitionId: string]: LabwareDefinition2 + }, + loadLabwareCommands: LoadLabwareCreateCommand[], + labware: string, + type: 'aspirate' | 'dispense' | 'mix' +): number => { + const matchingLoadLabware = loadLabwareCommands.find( + command => + command.commandType === 'loadLabware' && + command.params.labwareId === labware + ) + if (matchingLoadLabware == null) { + console.error( + `expected to find matching ${type} labware load command but could not with ${type}_labware from form data as ${labware}` + ) + } + const labwareUri = + matchingLoadLabware != null + ? `${matchingLoadLabware.params.namespace}/${matchingLoadLabware.params.loadName}/${matchingLoadLabware.params.version}` + : '' + + // early exit for dispense_labware equaling trashBin or wasteChute + if (labwareDefinitions[labwareUri] == null) { + return 0 + } + + const matchingLabwareWellDepth = labwareUri + ? labwareDefinitions[labwareUri].wells.A1.depth + : 0 + + if (matchingLabwareWellDepth === 0) { + console.error( + `error in finding the ${type} labware well depth with labware uri ${labwareUri}` + ) + } + return matchingLabwareWellDepth +} diff --git a/protocol-designer/src/organisms/EditInstrumentsModal/PipetteOverview.tsx b/protocol-designer/src/organisms/EditInstrumentsModal/PipetteOverview.tsx index b058901c07f..67fefb2d40c 100644 --- a/protocol-designer/src/organisms/EditInstrumentsModal/PipetteOverview.tsx +++ b/protocol-designer/src/organisms/EditInstrumentsModal/PipetteOverview.tsx @@ -1,5 +1,5 @@ import { useTranslation } from 'react-i18next' -import { useDispatch } from 'react-redux' +import { useDispatch, useSelector } from 'react-redux' import mapValues from 'lodash/mapValues' import { @@ -36,6 +36,7 @@ import type { } from '../../step-forms' import type { ThunkDispatch } from '../../types' import type { PipetteConfig } from './usePipetteConfig' +import { getAdditionalEquipmentEntities } from '../../step-forms/selectors' interface Gripper { name: AdditionalEquipmentName @@ -66,6 +67,12 @@ export function PipetteOverview({ }: PipetteOverviewProps): JSX.Element { const { t } = useTranslation(['create_new_protocol', 'protocol_overview']) const dispatch = useDispatch>() + const additionalEquipmentEntities = useSelector( + getAdditionalEquipmentEntities + ) + const gripperId = Object.values(additionalEquipmentEntities).find( + ae => ae.name === 'gripper' + )?.id const swapPipetteUpdate = mapValues(pipettes, pipette => { if (!pipette.mount) return pipette.mount @@ -228,7 +235,7 @@ export function PipetteOverview({ textDecoration={TYPOGRAPHY.textDecorationUnderline} padding={SPACING.spacing4} onClick={() => { - dispatch(toggleIsGripperRequired()) + dispatch(toggleIsGripperRequired(gripperId)) }} > diff --git a/protocol-designer/src/step-forms/actions/additionalItems.ts b/protocol-designer/src/step-forms/actions/additionalItems.ts index f9dbd78c45d..5458fad852f 100644 --- a/protocol-designer/src/step-forms/actions/additionalItems.ts +++ b/protocol-designer/src/step-forms/actions/additionalItems.ts @@ -2,10 +2,14 @@ import { uuid } from '../../utils' export interface ToggleIsGripperRequiredAction { type: 'TOGGLE_IS_GRIPPER_REQUIRED' + payload: { id: string } } -export const toggleIsGripperRequired = (): ToggleIsGripperRequiredAction => ({ +export const toggleIsGripperRequired = ( + id?: string +): ToggleIsGripperRequiredAction => ({ type: 'TOGGLE_IS_GRIPPER_REQUIRED', + payload: { id: id != null ? id : `${uuid()}:gripper` }, }) export type DeckFixture = 'wasteChute' | 'stagingArea' | 'trashBin' diff --git a/protocol-designer/src/step-forms/reducers/index.ts b/protocol-designer/src/step-forms/reducers/index.ts index 4be96492923..b1888f28970 100644 --- a/protocol-designer/src/step-forms/reducers/index.ts +++ b/protocol-designer/src/step-forms/reducers/index.ts @@ -5,21 +5,19 @@ import merge from 'lodash/merge' import omit from 'lodash/omit' import reduce from 'lodash/reduce' import { - FLEX_ROBOT_TYPE, - OT2_ROBOT_TYPE, getLabwareDefaultEngageHeight, getLabwareDefURI, getModuleType, MAGNETIC_MODULE_TYPE, MAGNETIC_MODULE_V1, THERMOCYCLER_MODULE_TYPE, - WASTE_CHUTE_ADDRESSABLE_AREAS, - MOVABLE_TRASH_ADDRESSABLE_AREAS, - WASTE_CHUTE_CUTOUT, } from '@opentrons/shared-data' import { rootReducer as labwareDefsRootReducer } from '../../labware-defs' -import { getCutoutIdByAddressableArea, uuid } from '../../utils' -import { INITIAL_DECK_SETUP_STEP_ID, SPAN7_8_10_11_SLOT } from '../../constants' +import { + GRIPPER_LOCATION, + INITIAL_DECK_SETUP_STEP_ID, + SPAN7_8_10_11_SLOT, +} from '../../constants' import { getPDMetadata } from '../../file-types' import { getDefaultsForStepType, @@ -29,7 +27,6 @@ import { PRESAVED_STEP_ID } from '../../steplist/types' import { getLabwareIsCompatible } from '../../utils/labwareModuleCompatibility' import { getLabwareOnModule } from '../../ui/modules/utils' import { nestedCombineReducers } from './nestedCombineReducers' -import { COLUMN_4_SLOTS } from '@opentrons/step-generation' import { _getPipetteEntitiesRootState, _getLabwareEntitiesRootState, @@ -40,7 +37,6 @@ import { createPresavedStepForm, getDeckItemIdInSlot, getIdsInRange, - getUnoccupiedSlotForTrash, } from '../utils' import type { Reducer } from 'redux' @@ -53,11 +49,7 @@ import type { LoadLabwareCreateCommand, LoadModuleCreateCommand, LoadPipetteCreateCommand, - MoveLabwareCreateCommand, - MoveToAddressableAreaCreateCommand, - MoveToAddressableAreaForDropTipCreateCommand, PipetteName, - AddressableAreaName, } from '@opentrons/shared-data' import type { RootState as LabwareDefsRootState } from '../../labware-defs' import type { LoadFileAction } from '../../load-file' @@ -108,6 +100,10 @@ import type { SelectMultipleStepsAction, } from '../../ui/steps/actions/types' import type { Action } from '../../types' +import type { + AdditionalEquipmentLocationUpdate, + LocationUpdate, +} from '../../load-file/migration/utils/getAdditionalEquipmentLocationUpdate' import type { NormalizedLabware, NormalizedLabwareById, @@ -243,6 +239,10 @@ export const initialDeckSetupStepForm: FormData = { labwareLocationUpdate: {}, pipetteLocationUpdate: {}, moduleLocationUpdate: {}, + trashBinLocationUpdate: {}, + wasteChuteLocationUpdate: {}, + stagingAreaLocationUpdate: {}, + gripperLocationUpdate: {}, } export const initialSavedStepFormsState: SavedStepFormState = { [INITIAL_DECK_SETUP_STEP_ID]: initialDeckSetupStepForm, @@ -372,6 +372,71 @@ export const savedStepForms = ( ...stepForm, })) } + case 'CREATE_DECK_FIXTURE': { + const { id, location, name } = action.payload + const prevInitialDeckSetupStep = + savedStepForms[INITIAL_DECK_SETUP_STEP_ID] + const locationUpdate = `${name}LocationUpdate` + return { + ...savedStepForms, + [INITIAL_DECK_SETUP_STEP_ID]: { + ...prevInitialDeckSetupStep, + [locationUpdate]: { + ...prevInitialDeckSetupStep[locationUpdate], + [id]: location, + }, + }, + } + } + case 'DELETE_DECK_FIXTURE': { + const { id } = action.payload + const name = id.split(':')[1] + const locationUpdate = `${name}LocationUpdate` + + return mapValues( + savedStepForms, + (form: FormData): FormData => { + const updatedLocation = omit(form[locationUpdate] || {}, id) + + return { + ...form, + [locationUpdate]: + Object.keys(updatedLocation).length > 0 ? updatedLocation : {}, + } + } + ) + } + case 'TOGGLE_IS_GRIPPER_REQUIRED': { + const { id } = action.payload + const prevInitialDeckSetupStep = + savedStepForms[INITIAL_DECK_SETUP_STEP_ID] + const gripperLocationUpdate: LocationUpdate = + prevInitialDeckSetupStep.gripperLocationUpdate + const gripperKey = Object.entries(gripperLocationUpdate).find( + ([_, value]) => value === GRIPPER_LOCATION + )?.[0] + + if (gripperKey == null) { + return { + ...savedStepForms, + [INITIAL_DECK_SETUP_STEP_ID]: { + ...prevInitialDeckSetupStep, + gripperLocationUpdate: { + ...gripperLocationUpdate, + [id]: GRIPPER_LOCATION, + }, + }, + } + } else { + return { + ...savedStepForms, + [INITIAL_DECK_SETUP_STEP_ID]: { + ...prevInitialDeckSetupStep, + gripperLocationUpdate: {}, + }, + } + } + } case 'DUPLICATE_LABWARE': case 'CREATE_CONTAINER': { // auto-update initial deck setup state. @@ -663,6 +728,8 @@ export const savedStepForms = ( (form.stepType === 'magnet' || form.stepType === 'temperature' || form.stepType === 'heaterShaker' || + form.stepType === 'absorbanceReader' || + form.stepType === 'thermocycler' || form.stepType === 'pause') && form.moduleId === moduleId ) { @@ -1109,293 +1176,80 @@ export const additionalEquipmentInvariantProperties = handleActions { const { file } = action.payload - const isFlex = file.robot.model === FLEX_ROBOT_TYPE - - const hasGripperCommands = Object.values(file.commands).some( - (command): command is MoveLabwareCreateCommand => - (command.commandType === 'moveLabware' && - command.params.strategy === 'usingGripper') || - command.commandType === 'absorbanceReader/closeLid' || - command.commandType === 'absorbanceReader/openLid' - ) - const hasWasteChuteCommands = Object.values(file.commands).some( - command => - (command.commandType === 'moveToAddressableArea' && - WASTE_CHUTE_ADDRESSABLE_AREAS.includes( - command.params.addressableAreaName as AddressableAreaName - )) || - (command.commandType === 'moveLabware' && - command.params.newLocation !== 'offDeck' && - 'addressableAreaName' in command.params.newLocation && - WASTE_CHUTE_ADDRESSABLE_AREAS.includes( - command.params.newLocation - .addressableAreaName as AddressableAreaName - )) - ) - const getStagingAreaSlotNames = ( - commandType: 'moveLabware' | 'loadLabware', - locationKey: 'newLocation' | 'location' - ): AddressableAreaName[] => { - return Object.values(file.commands) - .filter( - command => - command.commandType === commandType && - command.params[locationKey] !== 'offDeck' && - 'addressableAreaName' in command.params[locationKey] && - COLUMN_4_SLOTS.includes( - command.params[locationKey] - .addressableAreaName as AddressableAreaName - ) - ) - .map(command => command.params[locationKey].addressableAreaName) - } - - const stagingAreaSlotNames = [ - ...new Set([ - ...getStagingAreaSlotNames('moveLabware', 'newLocation'), - ...getStagingAreaSlotNames('loadLabware', 'location'), - ]), - ] - - const unoccupiedSlotForTrash = hasWasteChuteCommands - ? '' - : getUnoccupiedSlotForTrash( - file, - hasWasteChuteCommands, - stagingAreaSlotNames - ) - - const stagingAreas = stagingAreaSlotNames.reduce((acc, slot) => { - const stagingAreaId = `${uuid()}:stagingArea` - const cutoutId = getCutoutIdByAddressableArea( - slot, - 'stagingAreaRightSlot', - isFlex ? FLEX_ROBOT_TYPE : OT2_ROBOT_TYPE - ) - return { - ...acc, - [stagingAreaId]: { - name: 'stagingArea' as const, - id: stagingAreaId, - location: cutoutId, - }, - } - }, {}) - - const trashBinCommand = Object.values(file.commands).find( - ( - command - ): command is - | MoveToAddressableAreaCreateCommand - | MoveToAddressableAreaForDropTipCreateCommand => - (command.commandType === 'moveToAddressableArea' && - (MOVABLE_TRASH_ADDRESSABLE_AREAS.includes( - command.params.addressableAreaName as AddressableAreaName - ) || - command.params.addressableAreaName === 'fixedTrash')) || - command.commandType === 'moveToAddressableAreaForDropTip' - ) - - const trashAddressableAreaName = - trashBinCommand?.params.addressableAreaName const savedStepForms = file.designerApplication?.data?.savedStepForms - - const findTrashBinId = (): string | null => { - if (!savedStepForms) { - return null - } - - for (const stepForm of Object.values(savedStepForms)) { - if (stepForm.stepType === 'moveLiquid') { - if (stepForm.dispense_labware.toLowerCase().includes('trash')) { - return stepForm.dispense_labware - } - if (stepForm.dropTip_location.toLowerCase().includes('trash')) { - return stepForm.dropTip_location - } - if (stepForm.blowout_location?.toLowerCase().includes('trash')) { - return stepForm.blowout_location - } - } - if (stepForm.stepType === 'mix') { - if (stepForm.dropTip_location.toLowerCase().includes('trash')) { - return stepForm.dropTip_location - } else if ( - stepForm.blowout_location?.toLowerCase().includes('trash') - ) { - return stepForm.blowout_location - } - } + const initialDeckSetup: AdditionalEquipmentLocationUpdate = savedStepForms?.[ + INITIAL_DECK_SETUP_STEP_ID + ] as any + const { + gripperLocationUpdate, + trashBinLocationUpdate, + wasteChuteLocationUpdate, + stagingAreaLocationUpdate, + } = initialDeckSetup + + let gripper + if (Object.keys(gripperLocationUpdate).length > 0) { + const id = Object.keys(gripperLocationUpdate)[0] + gripper = { + [id]: { + name: 'gripper' as const, + id, + location: GRIPPER_LOCATION, + }, } - - return null } - - const trashBinId = findTrashBinId() - const trashCutoutId = - trashAddressableAreaName != null - ? getCutoutIdByAddressableArea( - trashAddressableAreaName as AddressableAreaName, - isFlex ? 'trashBinAdapter' : 'fixedTrashSlot', - isFlex ? FLEX_ROBOT_TYPE : OT2_ROBOT_TYPE - ) - : null - - const trashBin = - trashAddressableAreaName != null && trashBinId != null - ? { - [trashBinId]: { - name: 'trashBin' as const, - id: trashBinId, - // TODO(should be type cutoutId when location is type cutoutId) - location: trashCutoutId as string, - }, - } - : null - - if (trashBinCommand == null && file.robot.model === OT2_ROBOT_TYPE) { - console.error( - 'expected to find a fixedTrash command for the OT-2 but could not' - ) + let trashBin + if (Object.keys(trashBinLocationUpdate).length > 0) { + const id = Object.keys(trashBinLocationUpdate)[0] + trashBin = { + [id]: { + name: 'trashBin' as const, + id, + location: Object.values(trashBinLocationUpdate)[0], + }, + } } - - const moveLiquidStepWasteChute = - savedStepForms != null - ? Object.values(savedStepForms).find( - stepForm => - stepForm.stepType === 'moveLiquid' && - (stepForm.aspirate_labware.includes('wasteChute') || - stepForm.dispense_labware.includes('wasteChute') || - stepForm.dropTip_location.includes('wasteChute') || - stepForm.blowout_location?.includes('wasteChute')) - ) - : null - - let wasteChuteId: string | null = null - if (hasWasteChuteCommands && moveLiquidStepWasteChute != null) { - if (moveLiquidStepWasteChute.aspirate_labware.includes('wasteChute')) { - wasteChuteId = moveLiquidStepWasteChute.aspirate_labware - } else if ( - moveLiquidStepWasteChute.dispense_labware.includes('wasteChute') - ) { - wasteChuteId = moveLiquidStepWasteChute.dispense_labware - } else if ( - moveLiquidStepWasteChute.dropTip_location.includes('wasteChute') - ) { - wasteChuteId = moveLiquidStepWasteChute.dropTip_location - } else if ( - moveLiquidStepWasteChute.blowOut_location?.includes('wasteChute') - ) { - wasteChuteId = moveLiquidStepWasteChute.blowOut_location + let wasteChute + if (Object.keys(wasteChuteLocationUpdate).length > 0) { + const id = Object.keys(wasteChuteLocationUpdate)[0] + wasteChute = { + [id]: { + name: 'wasteChute' as const, + id, + location: Object.values(wasteChuteLocationUpdate)[0], + }, } - // new wasteChuteId generated for if there are only moveLabware commands - } else if (hasWasteChuteCommands && moveLiquidStepWasteChute == null) { - wasteChuteId = `${uuid()}:wasteChute` } - - const wasteChute = - hasWasteChuteCommands && wasteChuteId != null - ? { - [wasteChuteId]: { - name: 'wasteChute' as const, - id: wasteChuteId, - location: 'cutoutD3', - }, - } - : {} - - const gripperId = `${uuid()}:gripper` - const gripper = hasGripperCommands - ? { - [gripperId]: { - name: 'gripper' as const, - id: gripperId, + let stagingArea + if (Object.keys(stagingAreaLocationUpdate).length > 0) { + stagingArea = Object.entries(stagingAreaLocationUpdate).reduce( + (acc, [id, location]) => ({ + ...acc, + [id]: { + name: 'stagingArea' as const, + id, + location, }, - } - : {} - const hardcodedTrashBinIdOt2 = `${uuid()}:fixedTrash` - const hardcodedTrashBinOt2 = { - [hardcodedTrashBinIdOt2]: { - name: 'trashBin' as const, - id: hardcodedTrashBinIdOt2, - location: getCutoutIdByAddressableArea( - 'fixedTrash' as AddressableAreaName, - 'fixedTrashSlot', - OT2_ROBOT_TYPE - ), - }, + }), + {} + ) } - const hardcodedTrashAddressableAreaName = - unoccupiedSlotForTrash === WASTE_CHUTE_CUTOUT - ? 'wasteChute' - : `movableTrash${unoccupiedSlotForTrash}` - - const hardcodedTrashIdFlex = `${uuid()}:${hardcodedTrashAddressableAreaName}` - - const hardCodedTrashLocation = - unoccupiedSlotForTrash === '' - ? '' - : unoccupiedSlotForTrash === WASTE_CHUTE_CUTOUT - ? WASTE_CHUTE_CUTOUT - : getCutoutIdByAddressableArea( - hardcodedTrashAddressableAreaName as AddressableAreaName, - 'trashBinAdapter', - FLEX_ROBOT_TYPE - ) - const hardcodedTrashFlex = { - [hardcodedTrashIdFlex]: { - name: - unoccupiedSlotForTrash === WASTE_CHUTE_CUTOUT - ? ('wasteChute' as const) - : ('trashBin' as const), - id: hardcodedTrashIdFlex, - location: hasWasteChuteCommands ? '' : hardCodedTrashLocation, - }, - } - if (isFlex) { - if (trashBin != null) { - return { - ...state, - ...gripper, - ...trashBin, - ...wasteChute, - ...stagingAreas, - } - } else if (trashBin == null && !hasWasteChuteCommands) { - // always hardcode a trash bin or waste chute when no pipetting command is provided since return tip - // is not supported - return { - ...state, - ...gripper, - ...hardcodedTrashFlex, - ...wasteChute, - ...stagingAreas, - } - } else { - return { - ...state, - ...gripper, - ...wasteChute, - ...stagingAreas, - } - } - } else { - if (trashBin != null) { - return { ...state, ...trashBin } - } else { - // always hardcode a trash bin when no pipetting command is provided since no trash for - // OT-2 is not supported - return { ...state, ...hardcodedTrashBinOt2 } - } + return { + ...state, + ...trashBin, + ...wasteChute, + ...gripper, + ...stagingArea, } }, - + // @ts-expect-error TOGGLE_IS_GRIPPER_REQUIRED: ( - state: NormalizedAdditionalEquipmentById + state: NormalizedAdditionalEquipmentById, + action: ToggleIsGripperRequiredAction ): NormalizedAdditionalEquipmentById => { let updatedEquipment = { ...state } - const gripperId = `${uuid()}:gripper` + const id = action.payload.id const gripperKey = Object.keys(updatedEquipment).find( key => updatedEquipment[key].name === 'gripper' ) @@ -1405,9 +1259,9 @@ export const additionalEquipmentInvariantProperties = handleActions { - if ( - ae.name === 'wasteChute' || - ae.name === 'stagingArea' || - ae.name === 'trashBin' - ) { + if (ae.name !== 'gripper') { aeEntities[ae.id] = ae } return aeEntities diff --git a/protocol-designer/src/step-forms/test/utils.test.ts b/protocol-designer/src/step-forms/test/utils.test.ts index f6cad4e12a3..8468f1428d8 100644 --- a/protocol-designer/src/step-forms/test/utils.test.ts +++ b/protocol-designer/src/step-forms/test/utils.test.ts @@ -34,347 +34,342 @@ describe('getIdsInRange', () => { }) describe('getUnoccupiedSlotForTrash', () => { it('returns slot C1 when all other slots are occupied by modules, labware, moveLabware, and staging areas', () => { - const mockPDFile: any = { - commands: [ - { - key: '7353ae60-c85e-45c4-8d69-59ff3a97debd', - commandType: 'loadModule', - params: { - model: 'thermocyclerModuleV2', - location: { slotName: 'B1' }, - moduleId: - '771f390f-01a9-4615-9c4e-4dbfc95844b5:thermocyclerModuleType', - }, + const mockCreateCommands: CreateCommand[] = [ + { + key: '7353ae60-c85e-45c4-8d69-59ff3a97debd', + commandType: 'loadModule', + params: { + model: 'thermocyclerModuleV2', + location: { slotName: 'B1' }, + moduleId: + '771f390f-01a9-4615-9c4e-4dbfc95844b5:thermocyclerModuleType', }, - { - key: '82e5d08f-ceae-4eb8-8600-b61a973d47d9', - commandType: 'loadModule', - params: { - model: 'heaterShakerModuleV1', - location: { slotName: 'D1' }, - moduleId: - 'b9df03af-3844-4ae8-a1cf-cae61a6b4992:heaterShakerModuleType', - }, + }, + { + key: '82e5d08f-ceae-4eb8-8600-b61a973d47d9', + commandType: 'loadModule', + params: { + model: 'heaterShakerModuleV1', + location: { slotName: 'D1' }, + moduleId: + 'b9df03af-3844-4ae8-a1cf-cae61a6b4992:heaterShakerModuleType', }, - { - key: '49bc2a29-a7d2-42a6-8610-e07a9ad166df', - commandType: 'loadModule', - params: { - model: 'temperatureModuleV2', - location: { slotName: 'D3' }, - moduleId: - '52bea856-eea6-473c-80df-b316f3559692:temperatureModuleType', - }, + }, + { + key: '49bc2a29-a7d2-42a6-8610-e07a9ad166df', + commandType: 'loadModule', + params: { + model: 'temperatureModuleV2', + location: { slotName: 'D3' }, + moduleId: + '52bea856-eea6-473c-80df-b316f3559692:temperatureModuleType', }, - { - key: '864fadd7-f2c1-400a-b2ef-24d0c887a3c8', - commandType: 'loadLabware', - params: { - displayName: 'Opentrons Flex 96 Tip Rack 50 µL', - labwareId: - '88881828-037c-4445-ba57-121164f4a53a:opentrons/opentrons_flex_96_tiprack_50ul/1', - loadName: 'opentrons_flex_96_tiprack_50ul', - namespace: 'opentrons', - version: 1, - location: { slotName: 'C2' }, - }, + }, + { + key: '864fadd7-f2c1-400a-b2ef-24d0c887a3c8', + commandType: 'loadLabware', + params: { + displayName: 'Opentrons Flex 96 Tip Rack 50 µL', + labwareId: + '88881828-037c-4445-ba57-121164f4a53a:opentrons/opentrons_flex_96_tiprack_50ul/1', + loadName: 'opentrons_flex_96_tiprack_50ul', + namespace: 'opentrons', + version: 1, + location: { slotName: 'C2' }, }, - { - key: '79994418-d664-4884-9441-4b0fa62bd143', - commandType: 'loadLabware', - params: { - displayName: 'Bio-Rad 96 Well Plate 200 µL PCR', - labwareId: - '733c04a8-ae8c-449f-a1f9-ca3783fdda58:opentrons/biorad_96_wellplate_200ul_pcr/2', - loadName: 'biorad_96_wellplate_200ul_pcr', - namespace: 'opentrons', - version: 2, - location: { addressableAreaName: 'A4' }, - }, + }, + { + key: '79994418-d664-4884-9441-4b0fa62bd143', + commandType: 'loadLabware', + params: { + displayName: 'Bio-Rad 96 Well Plate 200 µL PCR', + labwareId: + '733c04a8-ae8c-449f-a1f9-ca3783fdda58:opentrons/biorad_96_wellplate_200ul_pcr/2', + loadName: 'biorad_96_wellplate_200ul_pcr', + namespace: 'opentrons', + version: 2, + location: { addressableAreaName: 'A4' }, + }, + }, + { + key: 'b2170a2c-d202-4129-9cd7-ffa4e35d57bb', + commandType: 'loadLabware', + params: { + displayName: 'Corning 24 Well Plate 3.4 mL Flat', + labwareId: + '32e97c67-866e-4153-bcb7-2b86b1d3f1fe:opentrons/corning_24_wellplate_3.4ml_flat/2', + loadName: 'corning_24_wellplate_3.4ml_flat', + namespace: 'opentrons', + version: 2, + location: { slotName: 'B3' }, }, - { - key: 'b2170a2c-d202-4129-9cd7-ffa4e35d57bb', - commandType: 'loadLabware', - params: { - displayName: 'Corning 24 Well Plate 3.4 mL Flat', + }, + { + key: 'fb1807fe-ca16-4f75-b44d-803d704c7d98', + commandType: 'loadLabware', + params: { + displayName: 'Opentrons Flex 96 Tip Rack 50 µL', + labwareId: + '11fdsa8b1-bf4b-4a6c-80cb-b8e5bdfe309b:opentrons/opentrons_flex_96_tiprack_50ul/1', + loadName: 'opentrons_flex_96_tiprack_50ul', + namespace: 'opentrons', + version: 1, + location: { labwareId: '32e97c67-866e-4153-bcb7-2b86b1d3f1fe:opentrons/corning_24_wellplate_3.4ml_flat/2', - loadName: 'corning_24_wellplate_3.4ml_flat', - namespace: 'opentrons', - version: 2, - location: { slotName: 'B3' }, }, }, - { - key: 'fb1807fe-ca16-4f75-b44d-803d704c7d98', - commandType: 'loadLabware', - params: { - displayName: 'Opentrons Flex 96 Tip Rack 50 µL', - labwareId: - '11fdsa8b1-bf4b-4a6c-80cb-b8e5bdfe309b:opentrons/opentrons_flex_96_tiprack_50ul/1', - loadName: 'opentrons_flex_96_tiprack_50ul', - namespace: 'opentrons', - version: 1, - location: { - labwareId: - '32e97c67-866e-4153-bcb7-2b86b1d3f1fe:opentrons/corning_24_wellplate_3.4ml_flat/2', - }, - }, + }, + { + commandType: 'moveLabware', + key: '1395243a-958f-4305-9687-52cdaf39f2b6', + params: { + labwareId: + '733c04a8-ae8c-449f-a1f9-ca3783fdda58:opentrons/biorad_96_wellplate_200ul_pcr/2', + strategy: 'usingGripper', + newLocation: { slotName: 'C1' }, }, - { - commandType: 'moveLabware', - key: '1395243a-958f-4305-9687-52cdaf39f2b6', - params: { - labwareId: - '733c04a8-ae8c-449f-a1f9-ca3783fdda58:opentrons/biorad_96_wellplate_200ul_pcr/2', - strategy: 'usingGripper', - newLocation: { slotName: 'C1' }, - }, + }, + { + commandType: 'moveLabware', + key: '4e39e7ec-4ada-4e3c-8369-1ff7421061a9', + params: { + labwareId: + '32e97c67-866e-4153-bcb7-2b86b1d3f1fe:opentrons/corning_24_wellplate_3.4ml_flat/2', + strategy: 'usingGripper', + newLocation: { addressableAreaName: 'A4' }, }, - { - commandType: 'moveLabware', - key: '4e39e7ec-4ada-4e3c-8369-1ff7421061a9', - params: { - labwareId: - '32e97c67-866e-4153-bcb7-2b86b1d3f1fe:opentrons/corning_24_wellplate_3.4ml_flat/2', - strategy: 'usingGripper', - newLocation: { addressableAreaName: 'A4' }, - }, - }, - ] as CreateCommand[], - } + }, + ] const mockStagingAreaSlotNames: AddressableAreaName[] = ['A4', 'B4'] const mockHasWasteChuteCommands = false expect( getUnoccupiedSlotForTrash( - mockPDFile, + mockCreateCommands, mockHasWasteChuteCommands, mockStagingAreaSlotNames ) ).toStrictEqual('C3') }) it('returns cutoutD3 for waste chute when every slot is occupied except for D3 on a staging area', () => { - const mockPDFile: any = { - commands: [ - { - key: '159e778d-0fc5-4d24-a662-b1e59a7babda', - commandType: 'loadModule', - params: { - model: 'thermocyclerModuleV2', - location: { slotName: 'B1' }, - moduleId: - '8932e104-7d57-42cf-88e4-ade334c84a76:thermocyclerModuleType', - }, + const mockCommands: CreateCommand[] = [ + { + key: '159e778d-0fc5-4d24-a662-b1e59a7babda', + commandType: 'loadModule', + params: { + model: 'thermocyclerModuleV2', + location: { slotName: 'B1' }, + moduleId: + '8932e104-7d57-42cf-88e4-ade334c84a76:thermocyclerModuleType', }, - { - key: '7d1fdcce-fa27-4520-8f97-a901751a4396', - commandType: 'loadModule', - params: { - model: 'temperatureModuleV2', - location: { slotName: 'C1' }, + }, + { + key: '7d1fdcce-fa27-4520-8f97-a901751a4396', + commandType: 'loadModule', + params: { + model: 'temperatureModuleV2', + location: { slotName: 'C1' }, + moduleId: + '2944a6a5-45f7-4d96-a4a2-d2853206a9f0:temperatureModuleType', + }, + }, + { + key: '1c223945-bfa3-4174-9923-5ed84afd1820', + commandType: 'loadModule', + params: { + model: 'heaterShakerModuleV1', + location: { slotName: 'D1' }, + moduleId: + '528620a6-6eb9-4000-bce3-a58809e16d4c:heaterShakerModuleType', + }, + }, + { + key: 'e06d0fd5-2ca8-4d0a-bcfd-4121849604da', + commandType: 'loadModule', + params: { + model: 'magneticBlockV1', + location: { slotName: 'D2' }, + moduleId: 'c8f8c89f-06df-468c-895d-33006db69beb:magneticBlockType', + }, + }, + { + key: 'f49ebdff-9780-4ca0-994c-2d2dd7c04b1d', + commandType: 'loadLabware', + params: { + displayName: 'Opentrons 96 Well Aluminum Block', + labwareId: + 'a69bcf2e-9461-4d43-be63-f3b8db66e5e7:opentrons/opentrons_96_well_aluminum_block/1', + loadName: 'opentrons_96_well_aluminum_block', + namespace: 'opentrons', + version: 1, + location: { moduleId: '2944a6a5-45f7-4d96-a4a2-d2853206a9f0:temperatureModuleType', }, }, - { - key: '1c223945-bfa3-4174-9923-5ed84afd1820', - commandType: 'loadModule', - params: { - model: 'heaterShakerModuleV1', - location: { slotName: 'D1' }, + }, + { + key: 'dda244f9-ff80-4ede-a585-1a546a88ee77', + commandType: 'loadLabware', + params: { + displayName: 'Opentrons 96 PCR Heater-Shaker Adapter', + labwareId: + '723a9551-ebba-4b4a-a92e-8d1fa0e813df:opentrons/opentrons_96_pcr_adapter/1', + loadName: 'opentrons_96_pcr_adapter', + namespace: 'opentrons', + version: 1, + location: { moduleId: '528620a6-6eb9-4000-bce3-a58809e16d4c:heaterShakerModuleType', }, }, - { - key: 'e06d0fd5-2ca8-4d0a-bcfd-4121849604da', - commandType: 'loadModule', - params: { - model: 'magneticBlockV1', - location: { slotName: 'D2' }, - moduleId: 'c8f8c89f-06df-468c-895d-33006db69beb:magneticBlockType', - }, + }, + { + key: '8c28ac95-c8d0-4481-8204-26b1babb54bf', + commandType: 'loadLabware', + params: { + displayName: 'Opentrons Flex 96 Tip Rack 50 µL', + labwareId: + 'c80cffe7-d89d-430e-ba96-3c12f879e993:opentrons/opentrons_flex_96_tiprack_50ul/1', + loadName: 'opentrons_flex_96_tiprack_50ul', + namespace: 'opentrons', + version: 1, + location: { slotName: 'C3' }, }, - { - key: 'f49ebdff-9780-4ca0-994c-2d2dd7c04b1d', - commandType: 'loadLabware', - params: { - displayName: 'Opentrons 96 Well Aluminum Block', - labwareId: - 'a69bcf2e-9461-4d43-be63-f3b8db66e5e7:opentrons/opentrons_96_well_aluminum_block/1', - loadName: 'opentrons_96_well_aluminum_block', - namespace: 'opentrons', - version: 1, - location: { - moduleId: - '2944a6a5-45f7-4d96-a4a2-d2853206a9f0:temperatureModuleType', - }, - }, + }, + { + key: 'f0357fde-125a-464c-98ed-b1b9492daab8', + commandType: 'loadLabware', + params: { + displayName: 'Opentrons Flex 96 Filter Tip Rack 200 µL (1)', + labwareId: + '0a2d4b6f-a43d-428a-98f2-284809596776:opentrons/opentrons_flex_96_filtertiprack_200ul/1', + loadName: 'opentrons_flex_96_filtertiprack_200ul', + namespace: 'opentrons', + version: 1, + location: { slotName: 'A3' }, }, - { - key: 'dda244f9-ff80-4ede-a585-1a546a88ee77', - commandType: 'loadLabware', - params: { - displayName: 'Opentrons 96 PCR Heater-Shaker Adapter', - labwareId: - '723a9551-ebba-4b4a-a92e-8d1fa0e813df:opentrons/opentrons_96_pcr_adapter/1', - loadName: 'opentrons_96_pcr_adapter', - namespace: 'opentrons', - version: 1, - location: { - moduleId: - '528620a6-6eb9-4000-bce3-a58809e16d4c:heaterShakerModuleType', - }, - }, - }, - { - key: '8c28ac95-c8d0-4481-8204-26b1babb54bf', - commandType: 'loadLabware', - params: { - displayName: 'Opentrons Flex 96 Tip Rack 50 µL', - labwareId: - 'c80cffe7-d89d-430e-ba96-3c12f879e993:opentrons/opentrons_flex_96_tiprack_50ul/1', - loadName: 'opentrons_flex_96_tiprack_50ul', - namespace: 'opentrons', - version: 1, - location: { slotName: 'C3' }, - }, - }, - { - key: 'f0357fde-125a-464c-98ed-b1b9492daab8', - commandType: 'loadLabware', - params: { - displayName: 'Opentrons Flex 96 Filter Tip Rack 200 µL (1)', - labwareId: - '0a2d4b6f-a43d-428a-98f2-284809596776:opentrons/opentrons_flex_96_filtertiprack_200ul/1', - loadName: 'opentrons_flex_96_filtertiprack_200ul', - namespace: 'opentrons', - version: 1, - location: { slotName: 'A3' }, - }, - }, - { - key: 'e27ba758-8d28-486f-a443-6e2276842ad0', - commandType: 'loadLabware', - params: { - displayName: 'Opentrons Flex 96 Filter Tip Rack 200 µL (2)', - labwareId: - '417a6bb2-8831-4b4d-840b-7d9329606865:opentrons/opentrons_flex_96_filtertiprack_200ul/1', - loadName: 'opentrons_flex_96_filtertiprack_200ul', - namespace: 'opentrons', - version: 1, - location: { slotName: 'B3' }, - }, + }, + { + key: 'e27ba758-8d28-486f-a443-6e2276842ad0', + commandType: 'loadLabware', + params: { + displayName: 'Opentrons Flex 96 Filter Tip Rack 200 µL (2)', + labwareId: + '417a6bb2-8831-4b4d-840b-7d9329606865:opentrons/opentrons_flex_96_filtertiprack_200ul/1', + loadName: 'opentrons_flex_96_filtertiprack_200ul', + namespace: 'opentrons', + version: 1, + location: { slotName: 'B3' }, }, - { - key: '37848c2a-4a1b-44f0-851a-d264368c47f8', - commandType: 'loadLabware', - params: { - displayName: 'Opentrons Flex 96 Filter Tip Rack 200 µL (3)', - labwareId: - 'ebb13651-0a60-4f42-ab85-f7084aeb0c08:opentrons/opentrons_flex_96_filtertiprack_200ul/1', - loadName: 'opentrons_flex_96_filtertiprack_200ul', - namespace: 'opentrons', - version: 1, - location: { slotName: 'A2' }, - }, + }, + { + key: '37848c2a-4a1b-44f0-851a-d264368c47f8', + commandType: 'loadLabware', + params: { + displayName: 'Opentrons Flex 96 Filter Tip Rack 200 µL (3)', + labwareId: + 'ebb13651-0a60-4f42-ab85-f7084aeb0c08:opentrons/opentrons_flex_96_filtertiprack_200ul/1', + loadName: 'opentrons_flex_96_filtertiprack_200ul', + namespace: 'opentrons', + version: 1, + location: { slotName: 'A2' }, }, - { - key: '768626df-b249-4d68-8f95-193b03113457', - commandType: 'loadLabware', - params: { - displayName: 'Opentrons Flex 96 Filter Tip Rack 200 µL (4)', - labwareId: - 'b17e8c1b-a308-4eaa-a852-10ad300ddea8:opentrons/opentrons_flex_96_filtertiprack_200ul/1', - loadName: 'opentrons_flex_96_filtertiprack_200ul', - namespace: 'opentrons', - version: 1, - location: { slotName: 'B2' }, - }, + }, + { + key: '768626df-b249-4d68-8f95-193b03113457', + commandType: 'loadLabware', + params: { + displayName: 'Opentrons Flex 96 Filter Tip Rack 200 µL (4)', + labwareId: + 'b17e8c1b-a308-4eaa-a852-10ad300ddea8:opentrons/opentrons_flex_96_filtertiprack_200ul/1', + loadName: 'opentrons_flex_96_filtertiprack_200ul', + namespace: 'opentrons', + version: 1, + location: { slotName: 'B2' }, }, - { - key: 'b12a4e6e-7ffc-421f-a2b6-44ae49d6f7bf', - commandType: 'loadLabware', - params: { - displayName: 'Reagent Plate', + }, + { + key: 'b12a4e6e-7ffc-421f-a2b6-44ae49d6f7bf', + commandType: 'loadLabware', + params: { + displayName: 'Reagent Plate', + labwareId: + 'aab3280f-6e7b-4e60-8326-c1d38999e08f:opentrons/opentrons_96_wellplate_200ul_pcr_full_skirt/2', + loadName: 'opentrons_96_wellplate_200ul_pcr_full_skirt', + namespace: 'opentrons', + version: 2, + location: { labwareId: - 'aab3280f-6e7b-4e60-8326-c1d38999e08f:opentrons/opentrons_96_wellplate_200ul_pcr_full_skirt/2', - loadName: 'opentrons_96_wellplate_200ul_pcr_full_skirt', - namespace: 'opentrons', - version: 2, - location: { - labwareId: - 'a69bcf2e-9461-4d43-be63-f3b8db66e5e7:opentrons/opentrons_96_well_aluminum_block/1', - }, + 'a69bcf2e-9461-4d43-be63-f3b8db66e5e7:opentrons/opentrons_96_well_aluminum_block/1', }, }, - { - key: 'e6863a1e-8aa0-4484-9aff-74ea9195a815', - commandType: 'loadLabware', - params: { - displayName: 'Sample Plate 1', + }, + { + key: 'e6863a1e-8aa0-4484-9aff-74ea9195a815', + commandType: 'loadLabware', + params: { + displayName: 'Sample Plate 1', + labwareId: + '8e755287-33cb-483f-b525-fff876893754:opentrons/opentrons_96_wellplate_200ul_pcr_full_skirt/2', + loadName: 'opentrons_96_wellplate_200ul_pcr_full_skirt', + namespace: 'opentrons', + version: 2, + location: { labwareId: - '8e755287-33cb-483f-b525-fff876893754:opentrons/opentrons_96_wellplate_200ul_pcr_full_skirt/2', - loadName: 'opentrons_96_wellplate_200ul_pcr_full_skirt', - namespace: 'opentrons', - version: 2, - location: { - labwareId: - '723a9551-ebba-4b4a-a92e-8d1fa0e813df:opentrons/opentrons_96_pcr_adapter/1', - }, + '723a9551-ebba-4b4a-a92e-8d1fa0e813df:opentrons/opentrons_96_pcr_adapter/1', }, }, - { - key: 'b29f48ef-3b20-457e-8499-df709818c47f', - commandType: 'loadLabware', - params: { - displayName: 'NEST 96 Deep Well Plate 2mL', - labwareId: - 'f0d30267-b0f6-493a-b0ea-70303428fa83:opentrons/nest_96_wellplate_2ml_deep/2', - loadName: 'nest_96_wellplate_2ml_deep', - namespace: 'opentrons', - version: 2, - location: { - moduleId: - 'c8f8c89f-06df-468c-895d-33006db69beb:magneticBlockType', - }, + }, + { + key: 'b29f48ef-3b20-457e-8499-df709818c47f', + commandType: 'loadLabware', + params: { + displayName: 'NEST 96 Deep Well Plate 2mL', + labwareId: + 'f0d30267-b0f6-493a-b0ea-70303428fa83:opentrons/nest_96_wellplate_2ml_deep/2', + loadName: 'nest_96_wellplate_2ml_deep', + namespace: 'opentrons', + version: 2, + location: { + moduleId: 'c8f8c89f-06df-468c-895d-33006db69beb:magneticBlockType', }, }, - { - key: '50be2f72-c7bc-4fd4-b10c-2054b90f922d', - commandType: 'loadLabware', - params: { - displayName: 'NEST 12 Well Reservoir 15 mL', - labwareId: - 'b60bbc39-cd82-4ede-b744-e88777a32b62:opentrons/nest_12_reservoir_15ml/1', - loadName: 'nest_12_reservoir_15ml', - namespace: 'opentrons', - version: 1, - location: { slotName: 'C2' }, - }, + }, + { + key: '50be2f72-c7bc-4fd4-b10c-2054b90f922d', + commandType: 'loadLabware', + params: { + displayName: 'NEST 12 Well Reservoir 15 mL', + labwareId: + 'b60bbc39-cd82-4ede-b744-e88777a32b62:opentrons/nest_12_reservoir_15ml/1', + loadName: 'nest_12_reservoir_15ml', + namespace: 'opentrons', + version: 1, + location: { slotName: 'C2' }, }, - { - key: 'a2f0c011-9983-46d9-a3ae-763a04856651', - commandType: 'loadLabware', - params: { - displayName: 'Opentrons Flex 96 Tip Rack 50 µL (1)', - labwareId: - '0d3d02a6-6501-4f28-81b9-12b2fe66998b:opentrons/opentrons_flex_96_tiprack_50ul/1', - loadName: 'opentrons_flex_96_tiprack_50ul', - namespace: 'opentrons', - version: 1, - location: { addressableAreaName: 'D4' }, - }, + }, + { + key: 'a2f0c011-9983-46d9-a3ae-763a04856651', + commandType: 'loadLabware', + params: { + displayName: 'Opentrons Flex 96 Tip Rack 50 µL (1)', + labwareId: + '0d3d02a6-6501-4f28-81b9-12b2fe66998b:opentrons/opentrons_flex_96_tiprack_50ul/1', + loadName: 'opentrons_flex_96_tiprack_50ul', + namespace: 'opentrons', + version: 1, + location: { addressableAreaName: 'D4' }, }, - ], - } + }, + ] const mockStagingAreaSlotNames: AddressableAreaName[] = ['D4'] const mockHasWasteChuteCommands = false expect( getUnoccupiedSlotForTrash( - mockPDFile, + mockCommands, mockHasWasteChuteCommands, mockStagingAreaSlotNames ) diff --git a/protocol-designer/src/step-forms/utils/index.ts b/protocol-designer/src/step-forms/utils/index.ts index 9529cc09245..4090598868b 100644 --- a/protocol-designer/src/step-forms/utils/index.ts +++ b/protocol-designer/src/step-forms/utils/index.ts @@ -17,6 +17,7 @@ import { getCutoutIdByAddressableArea } from '../../utils' import type { LabwareDefByDefURI } from '../../labware-defs' import type { AddressableAreaName, + CreateCommand, CutoutId, DeckSlotId, LoadLabwareCreateCommand, @@ -34,7 +35,6 @@ import type { } from '@opentrons/step-generation' import type { DeckSlot } from '../../types' import type { FormData, HydratedFormData } from '../../form-types' -import type { PDProtocolFile } from '../../file-types' import type { AdditionalEquipmentOnDeck, InitialDeckSetup, @@ -296,7 +296,7 @@ export function getHydratedForm( } export const getUnoccupiedSlotForTrash = ( - file: PDProtocolFile, + commands: CreateCommand[], hasWasteChuteCommands: boolean, stagingAreaSlotNames: AddressableAreaName[] ): string => { @@ -308,7 +308,7 @@ export const getUnoccupiedSlotForTrash = ( FLEX_ROBOT_TYPE ) ) - const allLoadLabwareSlotNames = Object.values(file.commands) + const allLoadLabwareSlotNames = Object.values(commands) .filter( (command): command is LoadLabwareCreateCommand => command.commandType === 'loadLabware' @@ -326,7 +326,7 @@ export const getUnoccupiedSlotForTrash = ( return acc }, []) - const allLoadModuleSlotNames = Object.values(file.commands) + const allLoadModuleSlotNames = Object.values(commands) .filter( (command): command is LoadModuleCreateCommand => command.commandType === 'loadModule' @@ -340,7 +340,7 @@ export const getUnoccupiedSlotForTrash = ( } }) - const allMoveLabwareLocations = Object.values(file.commands) + const allMoveLabwareLocations = Object.values(commands) .filter( (command): command is MoveLabwareCreateCommand => command.commandType === 'moveLabware' diff --git a/protocol-designer/src/steplist/formLevel/getDefaultsForStepType.ts b/protocol-designer/src/steplist/formLevel/getDefaultsForStepType.ts index 4344adc75ed..1d3b43d5a85 100644 --- a/protocol-designer/src/steplist/formLevel/getDefaultsForStepType.ts +++ b/protocol-designer/src/steplist/formLevel/getDefaultsForStepType.ts @@ -135,6 +135,10 @@ export function getDefaultsForStepType( labwareLocationUpdate: {}, moduleLocationUpdate: {}, pipetteLocationUpdate: {}, + trashBinLocationUpdate: {}, + wasteChuteLocationUpdate: {}, + stagingAreaLocationUpdate: {}, + gripperLocationUpdate: {}, } case 'magnet': diff --git a/protocol-designer/src/steplist/formLevel/test/getDefaultsForStepType.test.ts b/protocol-designer/src/steplist/formLevel/test/getDefaultsForStepType.test.ts index 6601817e2c7..f65c0d0ec1a 100644 --- a/protocol-designer/src/steplist/formLevel/test/getDefaultsForStepType.test.ts +++ b/protocol-designer/src/steplist/formLevel/test/getDefaultsForStepType.test.ts @@ -132,6 +132,10 @@ describe('getDefaultsForStepType', () => { labwareLocationUpdate: {}, pipetteLocationUpdate: {}, moduleLocationUpdate: {}, + trashBinLocationUpdate: {}, + wasteChuteLocationUpdate: {}, + stagingAreaLocationUpdate: {}, + gripperLocationUpdate: {}, }) }) }) From 476c0a33360ea592e607de01236f02b78528d9ba Mon Sep 17 00:00:00 2001 From: David Chau <46395074+ddcc4@users.noreply.github.com> Date: Wed, 5 Feb 2025 14:53:42 -0500 Subject: [PATCH 077/150] feat(protocol-designer): utility functions for Python generation (#17419) # Overview These are utility functions for rendering basic objects into Python, to be used for Python code generation from Protocol Designer. AUTH-1385 ## Test Plan and Hands on Testing Added unit tests for all the JavaScript -> Python types we support. I'm also using this code in my private branch. ## Review requests Is this the right directory for a utils file? I noticed that there's both: - `step-generation/src/utils` - `step-generation/lib/utils` What's the difference? I'm planning to use these functions from both `protocol-designer` and `step-generation`. ## Risk assessment Low: nothing calls this code right now. --------- Co-authored-by: Jethary Alcid <66035149+jerader@users.noreply.github.com> --- .../src/__tests__/pythonFormat.test.ts | 49 ++++++++++++++ step-generation/src/utils/index.ts | 1 + step-generation/src/utils/pythonFormat.ts | 65 +++++++++++++++++++ 3 files changed, 115 insertions(+) create mode 100644 step-generation/src/__tests__/pythonFormat.test.ts create mode 100644 step-generation/src/utils/pythonFormat.ts diff --git a/step-generation/src/__tests__/pythonFormat.test.ts b/step-generation/src/__tests__/pythonFormat.test.ts new file mode 100644 index 00000000000..ae0a6e828f7 --- /dev/null +++ b/step-generation/src/__tests__/pythonFormat.test.ts @@ -0,0 +1,49 @@ +import { describe, it, expect } from 'vitest' +import { formatPyStr, formatPyValue } from '../utils/pythonFormat' + +describe('pythonFormat utils', () => { + it('format string', () => { + expect( + formatPyStr(`Funky quotes " '\nNewline\tUnicode µ, Backslash\\`) + ).toEqual(`"Funky quotes \\" '\\nNewline\\tUnicode µ, Backslash\\\\"`) + }) + + it('format number', () => { + expect(formatPyValue(3.14)).toBe('3.14') + expect(formatPyValue(-1e-10)).toBe('-1e-10') + // this is the valid way to write these values in Python: + expect(formatPyValue(-1 / 0)).toBe('float("-Infinity")') + expect(formatPyValue(0 / 0)).toBe('float("NaN")') + }) + + it('format boolean', () => { + expect(formatPyValue(true)).toBe('True') + expect(formatPyValue(false)).toBe('False') + }) + + it('format list', () => { + expect( + formatPyValue(['hello', 'world', 2.71828, true, false, undefined]) + ).toBe('["hello", "world", 2.71828, True, False, None]') + }) + + it('format dict', () => { + // null: + expect(formatPyValue(null)).toBe('None') + // zero entries: + expect(formatPyValue({})).toBe('{}') + // one entry: + expect(formatPyValue({ one: 'two' })).toBe('{"one": "two"}') + expect(formatPyValue({ 3: 4 })).toBe('{"3": 4}') + // multiple entries: + expect(formatPyValue({ yes: true, no: false })).toBe( + '{\n "yes": True,\n "no": False,\n}' + ) + // nested entries: + expect( + formatPyValue({ hello: 'world', nested: { inner: 5, extra: 6 } }) + ).toBe( + '{\n "hello": "world",\n "nested": {\n "inner": 5,\n "extra": 6,\n },\n}' + ) + }) +}) diff --git a/step-generation/src/utils/index.ts b/step-generation/src/utils/index.ts index a4cee60e039..18d2ff703e4 100644 --- a/step-generation/src/utils/index.ts +++ b/step-generation/src/utils/index.ts @@ -27,4 +27,5 @@ export * from './safePipetteMovements' export * from './wasteChuteCommandsUtil' export * from './createTimelineFromRunCommands' export * from './constructInvariantContextFromRunCommands' +export * from './pythonFormat' export const uuid: () => string = uuidv4 diff --git a/step-generation/src/utils/pythonFormat.ts b/step-generation/src/utils/pythonFormat.ts new file mode 100644 index 00000000000..6efc6557542 --- /dev/null +++ b/step-generation/src/utils/pythonFormat.ts @@ -0,0 +1,65 @@ +/** Utility functions for Python code generation. */ + +const INDENT = ' ' + +/** Indent each of the lines in `text`. */ +export function indentPyLines(text: string): string { + return text + .split('\n') + .map(line => (line ? INDENT + line : line)) + .join('\n') +} + +/** Render an arbitrary JavaScript value to Python. */ +export function formatPyValue(value: any): string { + switch (typeof value) { + case 'undefined': + return 'None' + case 'boolean': + return value ? 'True' : 'False' + case 'number': + // `float("Infinity")` and `float("NaN")` is how you write those values in Python + return Number.isFinite(value) ? `${value}` : `float("${value}")` + case 'string': + return formatPyStr(value) + case 'object': + if (value === null) { + return 'None' + } else if (Array.isArray(value)) { + return formatPyList(value) + } else { + return formatPyDict(value as Record) + } + default: + throw Error('Cannot render value as Python', { cause: value }) + } +} + +/** Render the string value to Python. */ +export function formatPyStr(str: string): string { + // Later, we can do something more elegant like outputting 'single-quoted' if str contains + // double-quotes, but for now stringify() produces a valid and properly escaped Python string. + return JSON.stringify(str) +} + +/** Render an array value as a Python list. */ +export function formatPyList(list: any[]): string { + return `[${list.map(value => formatPyValue(value)).join(', ')}]` +} + +/** Render an object as a Python dict. */ +export function formatPyDict(dict: Record): string { + const dictEntries = Object.entries(dict) + // Render dict on single line if it has 1 entry, else render 1 entry per line. + if (dictEntries.length <= 1) { + return `{${dictEntries + .map(([key, value]) => `${formatPyStr(key)}: ${formatPyValue(value)}`) + .join(', ')}}` + } else { + return `{\n${indentPyLines( + dictEntries + .map(([key, value]) => `${formatPyStr(key)}: ${formatPyValue(value)}`) + .join(',\n') + )},\n}` + } +} From f16f6a0d2900be1511e3ff37ae7da698b375cb9b Mon Sep 17 00:00:00 2001 From: Jethary Alcid <66035149+jerader@users.noreply.github.com> Date: Wed, 5 Feb 2025 15:05:26 -0500 Subject: [PATCH 078/150] =?UTF-8?q?feat(protocol-designer):=20add=20design?= =?UTF-8?q?erApplication=20labware,=20pipettes,=20m=E2=80=A6=20(#17432)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit …odules keys closes AUTH-1407 This PR introduces `designerApplication` top level keys for `modules`, `labware`, and `pipettes`. Then when you import a protocol, the migration will grab that info from the load commands and the `load-file` reducer will use that info to populate the `labwareEntities`, `pipetteEntities`, and `moduleEntities`. Additionally, this pr deprecates the `defaultValues` key that was not in use at all --- .../protocol/8/doItAllV3MigratedToV8.json | 30 ++++-- .../protocol/8/doItAllV4MigratedToV8.json | 37 +++++-- .../protocol/8/doItAllV7MigratedToV8.json | 54 ++++++++-- .../fixtures/protocol/8/doItAllV8.json | 41 +++++-- .../protocol/8/example_1_1_0MigratedToV8.json | 33 ++++-- .../fixtures/protocol/8/mix_8_0_0.json | 26 +++-- .../8/newAdvancedSettingsAndMultiTemp.json | 41 +++++-- .../8/ninetySixChannelFullAndColumn.json | 34 ++++-- .../8/thermocyclerOnOt2V7MigratedToV8.json | 26 +++-- .../src/file-data/__tests__/utils.test.tsx | 82 ++++++++++++++ .../src/file-data/selectors/fileCreator.ts | 43 ++------ .../src/file-data/selectors/utils.ts | 47 +++++++- protocol-designer/src/file-types.ts | 41 ++++--- .../src/load-file/migration/8_5_0.ts | 11 +- .../getEquipmentLoadInfoFromCommands.test.tsx | 67 ++++++++++++ .../utils/getEquipmentLoadInfoFromCommands.ts | 101 ++++++++++++++++++ .../src/step-forms/reducers/index.ts | 98 +++++------------ 17 files changed, 613 insertions(+), 199 deletions(-) create mode 100644 protocol-designer/src/file-data/__tests__/utils.test.tsx create mode 100644 protocol-designer/src/load-file/migration/utils/__tests__/getEquipmentLoadInfoFromCommands.test.tsx create mode 100644 protocol-designer/src/load-file/migration/utils/getEquipmentLoadInfoFromCommands.ts diff --git a/protocol-designer/fixtures/protocol/8/doItAllV3MigratedToV8.json b/protocol-designer/fixtures/protocol/8/doItAllV3MigratedToV8.json index bfe4767cdff..48c933990a4 100644 --- a/protocol-designer/fixtures/protocol/8/doItAllV3MigratedToV8.json +++ b/protocol-designer/fixtures/protocol/8/doItAllV3MigratedToV8.json @@ -15,13 +15,7 @@ "name": "opentrons/protocol-designer", "version": "8.5.0", "data": { - "_internalAppBuildDate": "Tue, 04 Feb 2025 15:16:30 GMT", - "defaultValues": { - "aspirate_mmFromBottom": 1, - "dispense_mmFromBottom": 1, - "touchTip_mmFromTop": -1, - "blowout_mmFromTop": 0 - }, + "_internalAppBuildDate": "Wed, 29 Jan 2025 13:23:47 GMT", "pipetteTiprackAssignments": { "0b3f2210-75c7-11ea-b42f-4b64e50f43e5": [ "opentrons/opentrons_96_tiprack_300ul/1" @@ -266,7 +260,27 @@ "3961e4c0-75c7-11ea-b42f-4b64e50f43e5", "54dc3200-75c7-11ea-b42f-4b64e50f43e5", "a4cee9a0-75dc-11ea-b42f-4b64e50f43e5" - ] + ], + "pipettes": { + "0b3f2210-75c7-11ea-b42f-4b64e50f43e5": { + "pipetteName": "p300_single_gen2" + } + }, + "modules": {}, + "labware": { + "0b44c760-75c7-11ea-b42f-4b64e50f43e5:opentrons/opentrons_96_tiprack_300ul/1": { + "displayName": "Opentrons 96 Tip Rack 300 µL", + "labwareDefURI": "opentrons/opentrons_96_tiprack_300ul/1" + }, + "1e610d40-75c7-11ea-b42f-4b64e50f43e5:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1": { + "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", + "labwareDefURI": "opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1" + }, + "21ed8f60-75c7-11ea-b42f-4b64e50f43e5:opentrons/opentrons_24_aluminumblock_generic_2ml_screwcap/1": { + "displayName": "Opentrons 24 Well Aluminum Block with Generic 2 mL Screwcap", + "labwareDefURI": "opentrons/opentrons_24_aluminumblock_generic_2ml_screwcap/1" + } + } } }, "robot": { diff --git a/protocol-designer/fixtures/protocol/8/doItAllV4MigratedToV8.json b/protocol-designer/fixtures/protocol/8/doItAllV4MigratedToV8.json index 5ef201e8e50..ea1d1cb31f3 100644 --- a/protocol-designer/fixtures/protocol/8/doItAllV4MigratedToV8.json +++ b/protocol-designer/fixtures/protocol/8/doItAllV4MigratedToV8.json @@ -15,13 +15,7 @@ "name": "opentrons/protocol-designer", "version": "8.5.0", "data": { - "_internalAppBuildDate": "Tue, 04 Feb 2025 15:16:30 GMT", - "defaultValues": { - "aspirate_mmFromBottom": 1, - "dispense_mmFromBottom": 1, - "touchTip_mmFromTop": -1, - "blowout_mmFromTop": 0 - }, + "_internalAppBuildDate": "Wed, 29 Jan 2025 13:23:47 GMT", "pipetteTiprackAssignments": { "0b3f2210-75c7-11ea-b42f-4b64e50f43e5": [ "opentrons/opentrons_96_tiprack_300ul/1" @@ -288,7 +282,34 @@ "4f4057e0-75c7-11ea-b42f-4b64e50f43e5", "54dc3200-75c7-11ea-b42f-4b64e50f43e5", "80c00130-75c7-11ea-b42f-4b64e50f43e5" - ] + ], + "pipettes": { + "0b3f2210-75c7-11ea-b42f-4b64e50f43e5": { + "pipetteName": "p300_single_gen2" + } + }, + "modules": { + "0b419310-75c7-11ea-b42f-4b64e50f43e5:magneticModuleType": { + "model": "magneticModuleV2" + }, + "0b4319b0-75c7-11ea-b42f-4b64e50f43e5:temperatureModuleType": { + "model": "temperatureModuleV2" + } + }, + "labware": { + "0b44c760-75c7-11ea-b42f-4b64e50f43e5:opentrons/opentrons_96_tiprack_300ul/1": { + "displayName": "Opentrons 96 Tip Rack 300 µL", + "labwareDefURI": "opentrons/opentrons_96_tiprack_300ul/1" + }, + "1e610d40-75c7-11ea-b42f-4b64e50f43e5:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1": { + "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", + "labwareDefURI": "opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1" + }, + "21ed8f60-75c7-11ea-b42f-4b64e50f43e5:opentrons/opentrons_24_aluminumblock_generic_2ml_screwcap/1": { + "displayName": "Opentrons 24 Well Aluminum Block with Generic 2 mL Screwcap", + "labwareDefURI": "opentrons/opentrons_24_aluminumblock_generic_2ml_screwcap/1" + } + } } }, "robot": { diff --git a/protocol-designer/fixtures/protocol/8/doItAllV7MigratedToV8.json b/protocol-designer/fixtures/protocol/8/doItAllV7MigratedToV8.json index 17257c9b64d..5ceb1bedabb 100644 --- a/protocol-designer/fixtures/protocol/8/doItAllV7MigratedToV8.json +++ b/protocol-designer/fixtures/protocol/8/doItAllV7MigratedToV8.json @@ -15,13 +15,7 @@ "name": "opentrons/protocol-designer", "version": "8.5.0", "data": { - "_internalAppBuildDate": "Tue, 04 Feb 2025 15:16:30 GMT", - "defaultValues": { - "aspirate_mmFromBottom": 1, - "dispense_mmFromBottom": 1, - "touchTip_mmFromTop": -1, - "blowout_mmFromTop": 0 - }, + "_internalAppBuildDate": "Wed, 29 Jan 2025 13:23:47 GMT", "pipetteTiprackAssignments": { "2e7c6344-58ab-465c-b542-489883cb63fe": [ "opentrons/opentrons_flex_96_filtertiprack_50ul/1" @@ -409,7 +403,51 @@ "7747287c-abea-4855-843e-d61b272124b2", "dcc6a6c7-2db8-417b-a1aa-3927abccfadd", "2f862881-7ce3-4d20-b0ef-53c8244f6ef3" - ] + ], + "pipettes": { + "2e7c6344-58ab-465c-b542-489883cb63fe": { + "pipetteName": "p1000_single_flex" + }, + "6d1e53c3-2db3-451b-ad60-3fe13781a193": { + "pipetteName": "p50_multi_flex" + } + }, + "modules": { + "1be16305-74e7-4bdb-9737-61ec726d2b44:magneticBlockType": { + "model": "magneticBlockV1" + }, + "c19dffa3-cb34-4702-bcf6-dcea786257d1:heaterShakerModuleType": { + "model": "heaterShakerModuleV1" + }, + "ef44ad7f-0fd9-46d6-8bc0-c70785644cc8:temperatureModuleType": { + "model": "temperatureModuleV2" + }, + "627b7a27-5bb7-46de-a530-67af45652e3b:thermocyclerModuleType": { + "model": "thermocyclerModuleV2" + } + }, + "labware": { + "d95bb3be-b453-457c-a947-bd03dc8e56b9:opentrons/opentrons_96_flat_bottom_adapter/1": { + "displayName": "Opentrons 96 Flat Bottom Heater-Shaker Adapter", + "labwareDefURI": "opentrons/opentrons_96_flat_bottom_adapter/1" + }, + "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1": { + "displayName": "Opentrons Flex 96 Filter Tip Rack 50 µL", + "labwareDefURI": "opentrons/opentrons_flex_96_filtertiprack_50ul/1" + }, + "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2": { + "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", + "labwareDefURI": "opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2" + }, + "a793a135-06aa-4ed6-a1d3-c176c7810afa:opentrons/opentrons_24_aluminumblock_nest_1.5ml_snapcap/1": { + "displayName": "Opentrons 24 Well Aluminum Block with NEST 1.5 mL Snapcap", + "labwareDefURI": "opentrons/opentrons_24_aluminumblock_nest_1.5ml_snapcap/1" + }, + "239ceac8-23ec-4900-810a-70aeef880273:opentrons/nest_96_wellplate_200ul_flat/2": { + "displayName": "NEST 96 Well Plate 200 µL Flat", + "labwareDefURI": "opentrons/nest_96_wellplate_200ul_flat/2" + } + } } }, "robot": { diff --git a/protocol-designer/fixtures/protocol/8/doItAllV8.json b/protocol-designer/fixtures/protocol/8/doItAllV8.json index aaece68eb3a..7015a8a0c94 100644 --- a/protocol-designer/fixtures/protocol/8/doItAllV8.json +++ b/protocol-designer/fixtures/protocol/8/doItAllV8.json @@ -15,13 +15,7 @@ "name": "opentrons/protocol-designer", "version": "8.5.0", "data": { - "_internalAppBuildDate": "Wed, 05 Feb 2025 18:32:26 GMT", - "defaultValues": { - "aspirate_mmFromBottom": 1, - "dispense_mmFromBottom": 1, - "touchTip_mmFromTop": -1, - "blowout_mmFromTop": 0 - }, + "_internalAppBuildDate": "Wed, 29 Jan 2025 13:23:47 GMT", "pipetteTiprackAssignments": { "9fcd50d9-92b2-45ac-acf1-e2cf773feffc": [ "opentrons/opentrons_flex_96_tiprack_1000ul/1" @@ -358,7 +352,38 @@ "2b8f84e2-b079-41e8-a66e-ff8d9c5dfe1d", "07dd4472-3ea4-475c-8fd3-18819519b401", "ed84f11e-db82-4039-9e04-e619b03af42f" - ] + ], + "pipettes": { + "9fcd50d9-92b2-45ac-acf1-e2cf773feffc": { + "pipetteName": "p1000_single_flex" + } + }, + "modules": { + "23347241-80bb-4a7e-9c91-5d9727a9e483:heaterShakerModuleType": { + "model": "heaterShakerModuleV1" + }, + "fd6da9f1-d63b-414b-929e-c646b64790e9:thermocyclerModuleType": { + "model": "thermocyclerModuleV2" + } + }, + "labware": { + "7c4d59fa-0e50-442f-adce-9e4b0c7f0b88:opentrons/opentrons_96_pcr_adapter/1": { + "displayName": "Opentrons 96 PCR Heater-Shaker Adapter", + "labwareDefURI": "opentrons/opentrons_96_pcr_adapter/1" + }, + "f2d371ea-5146-4c89-8200-9c056a7f321a:opentrons/opentrons_flex_96_tiprack_1000ul/1": { + "displayName": "Opentrons Flex 96 Tip Rack 1000 µL", + "labwareDefURI": "opentrons/opentrons_flex_96_tiprack_1000ul/1" + }, + "54370838-4fca-4a14-b88a-7840e4903649:opentrons/opentrons_96_wellplate_200ul_pcr_full_skirt/2": { + "displayName": "Opentrons Tough 96 Well Plate 200 µL PCR Full Skirt", + "labwareDefURI": "opentrons/opentrons_96_wellplate_200ul_pcr_full_skirt/2" + }, + "8bacda22-9e05-45e8-bef4-cc04414a204f:opentrons/axygen_1_reservoir_90ml/1": { + "displayName": "Axygen 1 Well Reservoir 90 mL", + "labwareDefURI": "opentrons/axygen_1_reservoir_90ml/1" + } + } } }, "robot": { diff --git a/protocol-designer/fixtures/protocol/8/example_1_1_0MigratedToV8.json b/protocol-designer/fixtures/protocol/8/example_1_1_0MigratedToV8.json index 7e0b8eeabff..dde560281b0 100644 --- a/protocol-designer/fixtures/protocol/8/example_1_1_0MigratedToV8.json +++ b/protocol-designer/fixtures/protocol/8/example_1_1_0MigratedToV8.json @@ -15,13 +15,7 @@ "name": "opentrons/protocol-designer", "version": "8.5.0", "data": { - "_internalAppBuildDate": "Tue, 04 Feb 2025 15:16:30 GMT", - "defaultValues": { - "aspirate_mmFromBottom": 1, - "dispense_mmFromBottom": 1, - "touchTip_mmFromTop": -1, - "blowout_mmFromTop": 0 - }, + "_internalAppBuildDate": "Thu, 30 Jan 2025 17:05:24 GMT", "pipetteTiprackAssignments": { "c6f45030-92a5-11e9-ac62-1b173f839d9e": [ "opentrons/opentrons_96_tiprack_10ul/1" @@ -235,7 +229,30 @@ "e7d36200-92a5-11e9-ac62-1b173f839d9e", "18113c80-92a6-11e9-ac62-1b173f839d9e", "2e622080-92a6-11e9-ac62-1b173f839d9e" - ] + ], + "pipettes": { + "c6f45030-92a5-11e9-ac62-1b173f839d9e": { + "pipetteName": "p10_single" + }, + "c6f47740-92a5-11e9-ac62-1b173f839d9e": { + "pipetteName": "p50_single" + } + }, + "modules": {}, + "labware": { + "c6f4ec70-92a5-11e9-ac62-1b173f839d9e:tiprack-10ul:opentrons/opentrons_96_tiprack_10ul/1": { + "displayName": "tiprack 10ul (1)", + "labwareDefURI": "opentrons/opentrons_96_tiprack_10ul/1" + }, + "c6f51380-92a5-11e9-ac62-1b173f839d9e:tiprack-200ul:opentrons/tipone_96_tiprack_200ul/1": { + "displayName": "tiprack 200ul (1)", + "labwareDefURI": "opentrons/tipone_96_tiprack_200ul/1" + }, + "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well:opentrons/usascientific_96_wellplate_2.4ml_deep/1": { + "displayName": "96 deep well (1)", + "labwareDefURI": "opentrons/usascientific_96_wellplate_2.4ml_deep/1" + } + } } }, "robot": { diff --git a/protocol-designer/fixtures/protocol/8/mix_8_0_0.json b/protocol-designer/fixtures/protocol/8/mix_8_0_0.json index b3f37e7e9b5..b55b9b94478 100644 --- a/protocol-designer/fixtures/protocol/8/mix_8_0_0.json +++ b/protocol-designer/fixtures/protocol/8/mix_8_0_0.json @@ -13,15 +13,9 @@ }, "designerApplication": { "name": "opentrons/protocol-designer", - "version": "8.2.0", + "version": "8.5.0", "data": { "_internalAppBuildDate": "Wed, 01 May 2024 13:32:34 GMT", - "defaultValues": { - "aspirate_mmFromBottom": 1, - "dispense_mmFromBottom": 1, - "touchTip_mmFromTop": -1, - "blowout_mmFromTop": 0 - }, "pipetteTiprackAssignments": { "pipetteId": ["opentrons/opentrons_96_tiprack_10ul/1"] }, @@ -91,7 +85,23 @@ "orderedStepIds": [ "f59ea8e0-fc3a-11ea-8809-e959e7d61d96", "fc4dc7c0-fc3a-11ea-8809-e959e7d61d96" - ] + ], + "pipettes": { + "pipetteId": { + "pipetteName": "p20_single_gen2" + } + }, + "modules": {}, + "labware": { + "f1c677c0-fc3a-11ea-8809-e959e7d61d96:opentrons/opentrons_96_tiprack_10ul/1": { + "displayName": "Opentrons OT-2 96 Tip Rack 10 µL", + "labwareDefURI": "opentrons/opentrons_96_tiprack_10ul/1" + }, + "fe572c50-fc3a-11ea-8809-e959e7d61d96:opentrons/biorad_96_wellplate_200ul_pcr/1": { + "displayName": "Bio-Rad 96 Well Plate 200 µL PCR", + "labwareDefURI": "opentrons/biorad_96_wellplate_200ul_pcr/1" + } + } } }, "robot": { "model": "OT-2 Standard", "deckId": "ot2_standard" }, diff --git a/protocol-designer/fixtures/protocol/8/newAdvancedSettingsAndMultiTemp.json b/protocol-designer/fixtures/protocol/8/newAdvancedSettingsAndMultiTemp.json index eeb2cd9765c..e41bc40b181 100644 --- a/protocol-designer/fixtures/protocol/8/newAdvancedSettingsAndMultiTemp.json +++ b/protocol-designer/fixtures/protocol/8/newAdvancedSettingsAndMultiTemp.json @@ -15,13 +15,7 @@ "name": "opentrons/protocol-designer", "version": "8.5.0", "data": { - "_internalAppBuildDate": "Tue, 04 Feb 2025 15:16:30 GMT", - "defaultValues": { - "aspirate_mmFromBottom": 1, - "dispense_mmFromBottom": 1, - "touchTip_mmFromTop": -1, - "blowout_mmFromTop": 0 - }, + "_internalAppBuildDate": "Wed, 29 Jan 2025 13:23:47 GMT", "pipetteTiprackAssignments": { "21087f15-4c03-4587-8a2b-1ba0b5a501a0": [ "opentrons/opentrons_flex_96_tiprack_50ul/1" @@ -186,7 +180,38 @@ "c72b4af9-7488-4109-8221-15a5433f4fd8", "ffb0d1ff-8146-409c-9248-2065a3b27c4d", "eab2ec89-6d11-4246-ae91-d451cb3a5b1d" - ] + ], + "pipettes": { + "21087f15-4c03-4587-8a2b-1ba0b5a501a0": { + "pipetteName": "p50_single_flex" + } + }, + "modules": { + "d6966555-6c0e-45e0-8056-428d7c486401:temperatureModuleType": { + "model": "temperatureModuleV2" + }, + "b9c56153-9026-42d1-8113-949e15254571:temperatureModuleType": { + "model": "temperatureModuleV2" + } + }, + "labware": { + "32b596f6-79bb-4ad8-a34a-c44620fdb68f:opentrons/opentrons_96_well_aluminum_block/1": { + "displayName": "Opentrons 96 Well Aluminum Block", + "labwareDefURI": "opentrons/opentrons_96_well_aluminum_block/1" + }, + "0d39213c-49c2-4170-bf19-4c09e1b72aca:opentrons/opentrons_flex_96_tiprack_50ul/1": { + "displayName": "Opentrons Flex 96 Tip Rack 50 µL", + "labwareDefURI": "opentrons/opentrons_flex_96_tiprack_50ul/1" + }, + "c3c4e3fd-069f-4f3d-9b70-016a20f36de7:opentrons/opentrons_24_aluminumblock_nest_1.5ml_screwcap/1": { + "displayName": "Opentrons 24 Well Aluminum Block with NEST 1.5 mL Screwcap", + "labwareDefURI": "opentrons/opentrons_24_aluminumblock_nest_1.5ml_screwcap/1" + }, + "c0093e5f-3f7d-4cbf-aa17-d88394108501:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2": { + "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", + "labwareDefURI": "opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2" + } + } } }, "robot": { diff --git a/protocol-designer/fixtures/protocol/8/ninetySixChannelFullAndColumn.json b/protocol-designer/fixtures/protocol/8/ninetySixChannelFullAndColumn.json index f38b1eb287b..763f62e6c27 100644 --- a/protocol-designer/fixtures/protocol/8/ninetySixChannelFullAndColumn.json +++ b/protocol-designer/fixtures/protocol/8/ninetySixChannelFullAndColumn.json @@ -15,13 +15,7 @@ "name": "opentrons/protocol-designer", "version": "8.5.0", "data": { - "_internalAppBuildDate": "Tue, 04 Feb 2025 15:16:30 GMT", - "defaultValues": { - "aspirate_mmFromBottom": 1, - "dispense_mmFromBottom": 1, - "touchTip_mmFromTop": -1, - "blowout_mmFromTop": 0 - }, + "_internalAppBuildDate": "Wed, 29 Jan 2025 13:23:47 GMT", "pipetteTiprackAssignments": { "de7da440-95ec-43e8-8723-851321fbd6f9": [ "opentrons/opentrons_flex_96_tiprack_50ul/1" @@ -184,7 +178,31 @@ "orderedStepIds": [ "83a095fa-b649-4105-99d4-177f1a3f363a", "f5ea3139-1585-4848-9d5f-832eb88c99ca" - ] + ], + "pipettes": { + "de7da440-95ec-43e8-8723-851321fbd6f9": { + "pipetteName": "p1000_96" + } + }, + "modules": {}, + "labware": { + "ec850fd3-cf7c-44c5-b358-fba3a30315c9:opentrons/opentrons_flex_96_tiprack_adapter/1": { + "displayName": "Opentrons Flex 96 Tip Rack Adapter", + "labwareDefURI": "opentrons/opentrons_flex_96_tiprack_adapter/1" + }, + "75aa666f-98d8-4af9-908e-963ced428580:opentrons/opentrons_flex_96_tiprack_50ul/1": { + "displayName": "Opentrons Flex 96 Tip Rack 50 µL", + "labwareDefURI": "opentrons/opentrons_flex_96_tiprack_50ul/1" + }, + "fe1942b1-1b75-4d3a-9c12-d23004958a12:opentrons/biorad_96_wellplate_200ul_pcr/2": { + "displayName": "Bio-Rad 96 Well Plate 200 µL PCR", + "labwareDefURI": "opentrons/biorad_96_wellplate_200ul_pcr/2" + }, + "9bd16b50-4ae9-4cfd-8583-3378087e6a6c:opentrons/opentrons_flex_96_tiprack_50ul/1": { + "displayName": "Opentrons Flex 96 Tip Rack 50 µL", + "labwareDefURI": "opentrons/opentrons_flex_96_tiprack_50ul/1" + } + } } }, "robot": { diff --git a/protocol-designer/fixtures/protocol/8/thermocyclerOnOt2V7MigratedToV8.json b/protocol-designer/fixtures/protocol/8/thermocyclerOnOt2V7MigratedToV8.json index d08d93857e8..0fdb37a057e 100644 --- a/protocol-designer/fixtures/protocol/8/thermocyclerOnOt2V7MigratedToV8.json +++ b/protocol-designer/fixtures/protocol/8/thermocyclerOnOt2V7MigratedToV8.json @@ -15,13 +15,7 @@ "name": "opentrons/protocol-designer", "version": "8.5.0", "data": { - "_internalAppBuildDate": "Tue, 04 Feb 2025 15:40:12 GMT", - "defaultValues": { - "aspirate_mmFromBottom": 1, - "dispense_mmFromBottom": 1, - "touchTip_mmFromTop": -1, - "blowout_mmFromTop": 0 - }, + "_internalAppBuildDate": "Wed, 29 Jan 2025 13:23:47 GMT", "pipetteTiprackAssignments": { "733ba018-3550-476c-9fa3-0b5259d1a1d6": [ "opentrons/opentrons_96_tiprack_20ul/1" @@ -187,7 +181,23 @@ "orderedStepIds": [ "f07a86fc-8373-427b-b159-89ec8d20b9a6", "72b79c80-00e4-48ce-b42a-35b0ba17664c" - ] + ], + "pipettes": { + "733ba018-3550-476c-9fa3-0b5259d1a1d6": { + "pipetteName": "p20_single_gen2" + } + }, + "modules": { + "82858229-5c25-46cc-87d4-35ab318c18ce:thermocyclerModuleType": { + "model": "thermocyclerModuleV1" + } + }, + "labware": { + "ac928a51-a248-4304-be43-e9cb19c34fa9:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2": { + "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", + "labwareDefURI": "opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2" + } + } } }, "robot": { diff --git a/protocol-designer/src/file-data/__tests__/utils.test.tsx b/protocol-designer/src/file-data/__tests__/utils.test.tsx new file mode 100644 index 00000000000..34d08ca6f4b --- /dev/null +++ b/protocol-designer/src/file-data/__tests__/utils.test.tsx @@ -0,0 +1,82 @@ +import { describe, it, expect } from 'vitest' +import { + fixture96Plate, + fixtureP1000SingleV2Specs, +} from '@opentrons/shared-data' +import { + getLabwareLoadInfo, + getModulesLoadInfo, + getPipettesLoadInfo, +} from '../selectors/utils' +import type { LabwareDefinition2, PipetteName } from '@opentrons/shared-data' + +describe('getPipettesLoadInfo', () => { + it('returns pipettes from pipette entities', () => { + const pipId = '1' + const results = { + [pipId]: { + pipetteName: fixtureP1000SingleV2Specs.displayName, + }, + } + expect( + getPipettesLoadInfo({ + pipId: { + spec: fixtureP1000SingleV2Specs, + tiprackLabwareDef: [], + name: fixtureP1000SingleV2Specs.displayName as PipetteName, + id: pipId, + tiprackDefURI: [], + }, + }) + ).toEqual(results) + }) +}) + +describe('getModuleLoadInfo', () => { + it('returns modules from module entities', () => { + const moduleId = '1' + const results = { + [moduleId]: { + model: 'magneticModuleV2', + }, + } + expect( + getModulesLoadInfo({ + moduleId: { + id: moduleId, + model: 'magneticModuleV2', + type: 'magneticModuleType', + }, + }) + ).toEqual(results) + }) +}) + +describe('getLabwareLoadInfo', () => { + it('returns labwares from labware entities', () => { + const labwareId = '1' + const uri = 'mockUri' + const results = { + [labwareId]: { + displayName: 'nick name', + labwareDefURI: uri, + }, + } + const labwareNicknamesById: Record = { + [labwareId]: 'nick name', + } + + expect( + getLabwareLoadInfo( + { + labwareId: { + id: labwareId, + labwareDefURI: uri, + def: fixture96Plate as LabwareDefinition2, + }, + }, + labwareNicknamesById + ) + ).toEqual(results) + }) +}) diff --git a/protocol-designer/src/file-data/selectors/fileCreator.ts b/protocol-designer/src/file-data/selectors/fileCreator.ts index d63501dbc1e..23d78185b11 100644 --- a/protocol-designer/src/file-data/selectors/fileCreator.ts +++ b/protocol-designer/src/file-data/selectors/fileCreator.ts @@ -17,22 +17,21 @@ import { selectors as ingredSelectors } from '../../labware-ingred/selectors' import { selectors as stepFormSelectors } from '../../step-forms' import { selectors as uiLabwareSelectors } from '../../ui/labware' import { swatchColors } from '../../organisms/DefineLiquidsModal/swatchColors' -import { - DEFAULT_MM_TOUCH_TIP_OFFSET_FROM_TOP, - DEFAULT_MM_BLOWOUT_OFFSET_FROM_TOP, - DEFAULT_MM_OFFSET_FROM_BOTTOM, -} from '../../constants' import { getStepGroups } from '../../step-forms/selectors' import { getFileMetadata, getRobotType } from './fileFields' import { getInitialRobotState, getRobotStateTimeline } from './commands' -import { getLoadCommands } from './utils' +import { + getLabwareLoadInfo, + getLoadCommands, + getModulesLoadInfo, + getPipettesLoadInfo, +} from './utils' import type { SecondOrderCommandAnnotation } from '@opentrons/shared-data/commandAnnotation/types' import type { PipetteEntity, LabwareEntities, PipetteEntities, - LiquidEntities, } from '@opentrons/step-generation' import type { CommandAnnotationV1Mixin, @@ -45,23 +44,9 @@ import type { ProtocolBase, ProtocolFile, } from '@opentrons/shared-data' -import type { DismissedWarningState } from '../../dismiss/reducers' import type { LabwareDefByDefURI } from '../../labware-defs' import type { Selector } from '../../types' - -// DesignerApplication type for version 8_5 -export interface DesignerApplicationDataV8_5 { - ingredients: LiquidEntities - ingredLocations: { - [labwareId: string]: { - [wellName: string]: { [liquidId: string]: { volume: number } } - } - } - savedStepForms: Record - orderedStepIds: string[] - pipetteTiprackAssignments: Record - dismissedWarnings: DismissedWarningState -} +import type { PDMetadata } from '../../file-types' // TODO: BC: 2018-02-21 uncomment this assert, causes test failures // console.assert(!isEmpty(process.env.OT_PD_VERSION), 'Could not find application version!') @@ -159,15 +144,6 @@ export const createFile: Selector = createSelector( version: applicationVersion, data: { _internalAppBuildDate, - defaultValues: { - // TODO: Ian 2019-06-13 load these into redux and always get them from redux, not constants.js - // This `defaultValues` key is not yet read by anything, but is populated here for auditability - // and so that later we can do #3587 without a PD migration - aspirate_mmFromBottom: DEFAULT_MM_OFFSET_FROM_BOTTOM, - dispense_mmFromBottom: DEFAULT_MM_OFFSET_FROM_BOTTOM, - touchTip_mmFromTop: DEFAULT_MM_TOUCH_TIP_OFFSET_FROM_TOP, - blowout_mmFromTop: DEFAULT_MM_BLOWOUT_OFFSET_FROM_TOP, - }, pipetteTiprackAssignments: mapValues( pipetteEntities, (p: typeof pipetteEntities[keyof typeof pipetteEntities]): string[] => @@ -178,6 +154,9 @@ export const createFile: Selector = createSelector( ingredLocations, savedStepForms, orderedStepIds: savedOrderedStepIds, + pipettes: getPipettesLoadInfo(pipetteEntities), + modules: getModulesLoadInfo(moduleEntities), + labware: getLabwareLoadInfo(labwareEntities, labwareNicknamesById), }, } @@ -268,7 +247,7 @@ export const createFile: Selector = createSelector( commandAnnotations, } - const protocolBase: ProtocolBase = { + const protocolBase: ProtocolBase = { $otSharedSchema: '#/protocol/schemas/8', schemaVersion: 8, metadata: { diff --git a/protocol-designer/src/file-data/selectors/utils.ts b/protocol-designer/src/file-data/selectors/utils.ts index 8d852731fad..c8f6e3ff1f2 100644 --- a/protocol-designer/src/file-data/selectors/utils.ts +++ b/protocol-designer/src/file-data/selectors/utils.ts @@ -3,7 +3,6 @@ import map from 'lodash/map' import reduce from 'lodash/reduce' import { getLoadLiquidCommands } from '../../load-file/migration/utils/getLoadLiquidCommands' import { COLUMN_4_SLOTS, uuid } from '@opentrons/step-generation' - import type { AddressableAreaName, CreateCommand, @@ -21,9 +20,13 @@ import type { ModuleEntities, TimelineFrame, LiquidEntities, + PipetteEntity, + ModuleEntity, + LabwareEntity, } from '@opentrons/step-generation' +import type { Labware, Modules, Pipettes } from '../../file-types' -interface Pipettes { +interface MappedPipettes { [pipetteId: string]: { name: PipetteName } } @@ -36,7 +39,7 @@ export const getLoadCommands = ( liquidEntities: LiquidEntities, ingredLocations: LabwareLiquidState ): CreateCommand[] => { - const pipettes: Pipettes = mapValues( + const pipettes: MappedPipettes = mapValues( initialRobotState.pipettes, ( pipette: typeof initialRobotState.pipettes[keyof typeof initialRobotState.pipettes], @@ -196,3 +199,41 @@ export const getLoadCommands = ( ...loadLiquidCommands, ] } + +export const getPipettesLoadInfo = ( + pipetteEntities: PipetteEntities +): Pipettes => { + return Object.values(pipetteEntities).reduce( + (acc, pipetteEntity: PipetteEntity) => ({ + ...acc, + [pipetteEntity.id]: { pipetteName: pipetteEntity.name }, + }), + {} + ) +} + +export const getModulesLoadInfo = (moduleEntities: ModuleEntities): Modules => { + return Object.values(moduleEntities).reduce( + (acc, moduleEntity: ModuleEntity) => ({ + ...acc, + [moduleEntity.id]: { model: moduleEntity.model }, + }), + {} + ) +} + +export const getLabwareLoadInfo = ( + labwareEntities: LabwareEntities, + labwareNicknamesById: Record +): Labware => { + return Object.values(labwareEntities).reduce( + (acc, labwareEntity: LabwareEntity) => ({ + ...acc, + [labwareEntity.id]: { + displayName: labwareNicknamesById[labwareEntity.id], + labwareDefURI: labwareEntity.labwareDefURI, + }, + }), + {} + ) +} diff --git a/protocol-designer/src/file-types.ts b/protocol-designer/src/file-types.ts index 8a19aac0108..41d7a9fe076 100644 --- a/protocol-designer/src/file-types.ts +++ b/protocol-designer/src/file-types.ts @@ -1,12 +1,26 @@ +import type { + ModuleModel, + PipetteName, + ProtocolFile, +} from '@opentrons/shared-data' +import type { LiquidEntities } from '@opentrons/step-generation' import type { RootState as IngredRoot } from './labware-ingred/reducers' import type { RootState as StepformRoot } from './step-forms' import type { RootState as DismissRoot } from './dismiss' -import type { ProtocolFile as ProtocolFileV3 } from '@opentrons/shared-data/protocol/types/schemaV3' -import type { ProtocolFile as ProtocolFileV4 } from '@opentrons/shared-data/protocol/types/schemaV4' -import type { ProtocolFile as ProtocolFileV5 } from '@opentrons/shared-data/protocol/types/schemaV5' -import type { ProtocolFile as ProtocolFileV6 } from '@opentrons/shared-data/protocol/types/schemaV6' -import type { LiquidEntities } from '@opentrons/step-generation' +export interface PipetteLoadInfo { + pipetteName: PipetteName +} +export interface ModuleLoadInfo { + model: ModuleModel +} +export interface LabwareLoadInfo { + displayName: string // either labwareDef displayName or user defined nickName + labwareDefURI: string // the labware definition URI +} +export type Pipettes = Record +export type Modules = Record +export type Labware = Record export interface PDMetadata { // pipetteId to tiprackModel pipetteTiprackAssignments: Record @@ -15,19 +29,12 @@ export interface PDMetadata { ingredLocations: IngredRoot['ingredLocations'] savedStepForms: StepformRoot['savedStepForms'] orderedStepIds: StepformRoot['orderedStepIds'] - defaultValues: { - aspirate_mmFromBottom: number | null - dispense_mmFromBottom: number | null - touchTip_mmFromTop: number | null - blowout_mmFromTop: number | null - } + pipettes: Pipettes + modules: Modules + labware: Labware } -// NOTE: PD currently supports saving both v3 and v4, depending on whether it has modules -export type PDProtocolFile = - | ProtocolFileV3 - | ProtocolFileV4 - | ProtocolFileV5 - | ProtocolFileV6 + +export type PDProtocolFile = ProtocolFile export function getPDMetadata(file: PDProtocolFile): PDMetadata { const metadata = file.designerApplication?.data diff --git a/protocol-designer/src/load-file/migration/8_5_0.ts b/protocol-designer/src/load-file/migration/8_5_0.ts index 6cf583da9ae..bbf2fda4c62 100644 --- a/protocol-designer/src/load-file/migration/8_5_0.ts +++ b/protocol-designer/src/load-file/migration/8_5_0.ts @@ -2,17 +2,18 @@ import floor from 'lodash/floor' import { swatchColors } from '../../organisms/DefineLiquidsModal/swatchColors' import { getMigratedPositionFromTop } from './utils/getMigrationPositionFromTop' import { getAdditionalEquipmentLocationUpdate } from './utils/getAdditionalEquipmentLocationUpdate' +import { getEquipmentLoadInfoFromCommands } from './utils/getEquipmentLoadInfoFromCommands' import type { LoadLabwareCreateCommand, ProtocolFile, } from '@opentrons/shared-data' import type { LiquidEntities } from '@opentrons/step-generation' -import type { DesignerApplicationDataV8_5 } from '../../file-data/selectors' import type { DesignerApplicationData } from './utils/getLoadLiquidCommands' +import type { PDMetadata } from '../../file-types' export const migrateFile = ( appData: ProtocolFile -): ProtocolFile => { +): ProtocolFile => { const { designerApplication, commands, @@ -20,6 +21,7 @@ export const migrateFile = ( liquids, robot, } = appData + if (designerApplication == null || designerApplication?.data == null) { throw Error('The designerApplication key in your file is corrupt.') } @@ -156,6 +158,10 @@ export const migrateFile = ( }, {} ) + const equipmentLoadInfoFromCommands = getEquipmentLoadInfoFromCommands( + commands, + labwareDefinitions + ) return { ...appData, designerApplication: { @@ -163,6 +169,7 @@ export const migrateFile = ( data: { ...designerApplication.data, ingredients: migratedIngredients, + ...equipmentLoadInfoFromCommands, savedStepForms: { ...designerApplication.data.savedStepForms, ...updatedInitialStep, diff --git a/protocol-designer/src/load-file/migration/utils/__tests__/getEquipmentLoadInfoFromCommands.test.tsx b/protocol-designer/src/load-file/migration/utils/__tests__/getEquipmentLoadInfoFromCommands.test.tsx new file mode 100644 index 00000000000..66e265b1cbf --- /dev/null +++ b/protocol-designer/src/load-file/migration/utils/__tests__/getEquipmentLoadInfoFromCommands.test.tsx @@ -0,0 +1,67 @@ +import { describe, it, expect } from 'vitest' +import doItAllV7 from '../../../../../fixtures/protocol/7/doItAllV7.json' +import { getEquipmentLoadInfoFromCommands } from '../getEquipmentLoadInfoFromCommands' +import type { CreateCommand, LabwareDefinition2 } from '@opentrons/shared-data' +import type { EquipmentLoadInfoFromCommands } from '../getEquipmentLoadInfoFromCommands' + +describe('getEquipmentLoadInfoFromCommands', () => { + it('properly returns the pipettes, modules, and labware info for doItAllV7 fixture', () => { + const results: EquipmentLoadInfoFromCommands = { + labware: { + '239ceac8-23ec-4900-810a-70aeef880273:opentrons/nest_96_wellplate_200ul_flat/2': { + displayName: 'NEST 96 Well Plate 200 µL Flat', + labwareDefURI: 'opentrons/nest_96_wellplate_200ul_flat/2', + }, + '23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1': { + displayName: 'Opentrons Flex 96 Filter Tip Rack 50 µL', + labwareDefURI: 'opentrons/opentrons_flex_96_filtertiprack_50ul/1', + }, + 'a793a135-06aa-4ed6-a1d3-c176c7810afa:opentrons/opentrons_24_aluminumblock_nest_1.5ml_snapcap/1': { + displayName: + 'Opentrons 24 Well Aluminum Block with NEST 1.5 mL Snapcap', + labwareDefURI: + 'opentrons/opentrons_24_aluminumblock_nest_1.5ml_snapcap/1', + }, + 'd95bb3be-b453-457c-a947-bd03dc8e56b9:opentrons/opentrons_96_flat_bottom_adapter/1': { + displayName: 'Opentrons 96 Flat Bottom Heater-Shaker Adapter', + labwareDefURI: 'opentrons/opentrons_96_flat_bottom_adapter/1', + }, + 'fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2': { + displayName: 'NEST 96 Well Plate 100 µL PCR Full Skirt', + labwareDefURI: 'opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2', + }, + }, + modules: { + '1be16305-74e7-4bdb-9737-61ec726d2b44:magneticBlockType': { + model: 'magneticBlockV1', + }, + '627b7a27-5bb7-46de-a530-67af45652e3b:thermocyclerModuleType': { + model: 'thermocyclerModuleV2', + }, + 'c19dffa3-cb34-4702-bcf6-dcea786257d1:heaterShakerModuleType': { + model: 'heaterShakerModuleV1', + }, + 'ef44ad7f-0fd9-46d6-8bc0-c70785644cc8:temperatureModuleType': { + model: 'temperatureModuleV2', + }, + }, + pipettes: { + '2e7c6344-58ab-465c-b542-489883cb63fe': { + pipetteName: 'p1000_single_flex', + }, + '6d1e53c3-2db3-451b-ad60-3fe13781a193': { + pipetteName: 'p50_multi_flex', + }, + }, + } + + expect( + getEquipmentLoadInfoFromCommands( + doItAllV7.commands as CreateCommand[], + doItAllV7.labwareDefinitions as { + [definitionId: string]: LabwareDefinition2 + } + ) + ).toEqual(results) + }) +}) diff --git a/protocol-designer/src/load-file/migration/utils/getEquipmentLoadInfoFromCommands.ts b/protocol-designer/src/load-file/migration/utils/getEquipmentLoadInfoFromCommands.ts new file mode 100644 index 00000000000..864479c3801 --- /dev/null +++ b/protocol-designer/src/load-file/migration/utils/getEquipmentLoadInfoFromCommands.ts @@ -0,0 +1,101 @@ +import type { + CreateCommand, + LabwareDefinition2, + LoadLabwareCreateCommand, + LoadModuleCreateCommand, + LoadPipetteCreateCommand, + PipetteName, +} from '@opentrons/shared-data' +import type { Labware, Modules, Pipettes } from '../../../file-types' + +export interface EquipmentLoadInfoFromCommands { + pipettes: Pipettes + modules: Modules + labware: Labware +} +export const getEquipmentLoadInfoFromCommands = ( + commands: CreateCommand[], + labwareDefinitions: { + [definitionId: string]: LabwareDefinition2 + } +): EquipmentLoadInfoFromCommands => { + const loadPipetteCommands = commands.filter( + (command): command is LoadPipetteCreateCommand => + command.commandType === 'loadPipette' + ) + const loadLabwareCommands = commands.filter( + (command): command is LoadLabwareCreateCommand => + command.commandType === 'loadLabware' + ) + const loadModuleCommands = commands.filter( + (command): command is LoadModuleCreateCommand => + command.commandType === 'loadModule' + ) + + const pipettes = loadPipetteCommands.reduce( + (acc, loadPipette: LoadPipetteCreateCommand) => ({ + ...acc, + [loadPipette.params.pipetteId]: { + pipetteName: loadPipette.params.pipetteName as PipetteName, + }, + }), + {} + ) + + const labware = loadLabwareCommands.reduce( + (acc, loadLabware: LoadLabwareCreateCommand) => { + const { params } = loadLabware + const { + displayName: nickName, + loadName, + version, + namespace, + labwareId, + } = params + const labwareDefURI = `${namespace}/${loadName}/${version}` + + if (labwareId == null) { + console.error( + `expected to find a labwareId from loadLabware command but could not with labwareDefURI ${labwareDefURI}` + ) + } + if (labwareDefinitions[labwareDefURI] == null) { + console.error( + `expected to find matching labware definition with loadname ${loadName} but could not` + ) + } + const id = labwareId ?? 'unknown id' + const displayName = labwareDefinitions[labwareDefURI].metadata.displayName + + return { + ...acc, + [id]: { + displayName: nickName ?? displayName, + labwareDefURI, + }, + } + }, + {} + ) + + const modules = loadModuleCommands.reduce( + (acc, loadModule: LoadModuleCreateCommand) => { + const { params } = loadModule + const { moduleId, model } = params + if (moduleId == null) { + console.error( + `expected to find moduleId from loadModule command wth model ${model} but could not` + ) + } + const id = moduleId ?? 'unknown id' + return { + ...acc, + [id]: { + model, + }, + } + }, + {} + ) + return { pipettes, modules, labware } +} diff --git a/protocol-designer/src/step-forms/reducers/index.ts b/protocol-designer/src/step-forms/reducers/index.ts index b1888f28970..ef2b30ed303 100644 --- a/protocol-designer/src/step-forms/reducers/index.ts +++ b/protocol-designer/src/step-forms/reducers/index.ts @@ -45,12 +45,7 @@ import type { NormalizedAdditionalEquipmentById, NormalizedPipetteById, } from '@opentrons/step-generation' -import type { - LoadLabwareCreateCommand, - LoadModuleCreateCommand, - LoadPipetteCreateCommand, - PipetteName, -} from '@opentrons/shared-data' +import type { PipetteName } from '@opentrons/shared-data' import type { RootState as LabwareDefsRootState } from '../../labware-defs' import type { LoadFileAction } from '../../load-file' import type { SaveStepFormAction } from '../../ui/steps/actions/thunks' @@ -100,6 +95,7 @@ import type { SelectMultipleStepsAction, } from '../../ui/steps/actions/types' import type { Action } from '../../types' +import type { ModuleLoadInfo, PipetteLoadInfo } from '../../file-types' import type { AdditionalEquipmentLocationUpdate, LocationUpdate, @@ -995,41 +991,8 @@ export const labwareInvariantProperties: Reducer< action: LoadFileAction ): NormalizedLabwareById => { const { file } = action.payload - const loadLabwareCommands = Object.values(file.commands).filter( - (command): command is LoadLabwareCreateCommand => - command.commandType === 'loadLabware' - ) - const labware = { - ...loadLabwareCommands.reduce( - (acc: NormalizedLabwareById, command: LoadLabwareCreateCommand) => { - const { labwareId, loadName, namespace, version } = command.params - const labwareDefinitionMatch = Object.entries( - file.labwareDefinitions - ).find( - ([definitionUri, labwareDef]) => - labwareDef.parameters.loadName === loadName && - labwareDef.namespace === namespace && - labwareDef.version === version - ) - if (labwareDefinitionMatch == null) { - console.error( - `expected to find labware definition match with loadname ${loadName} but could not` - ) - } - const labwareDefURI = - labwareDefinitionMatch != null ? labwareDefinitionMatch[0] : '' - const id = labwareId ?? '' - return { - ...acc, - [id]: { - labwareDefURI, - }, - } - }, - {} - ), - } - return { ...labware, ...state } + const metadata = getPDMetadata(file) + return { ...metadata.labware, ...state } }, REPLACE_CUSTOM_LABWARE_DEF: ( state: NormalizedLabwareById, @@ -1085,30 +1048,22 @@ export const moduleInvariantProperties: Reducer< action: LoadFileAction ): ModuleEntities => { const { file } = action.payload - const loadModuleCommands = Object.values(file.commands).filter( - (command): command is LoadModuleCreateCommand => - command.commandType === 'loadModule' - ) - const modules = loadModuleCommands.reduce( - (acc: ModuleEntities, command: LoadModuleCreateCommand) => { - const { moduleId, model, location } = command.params - if (moduleId == null) { - console.error( - `expected module ${model} in location ${location.slotName} to have an id, but id does not` - ) - return acc - } - return { - ...acc, - [moduleId]: { - id: moduleId, - type: getModuleType(model), - model, - }, + const metadata = getPDMetadata(file) + const modules: ModuleEntities = Object.entries(metadata.modules).reduce( + ( + acc: ModuleEntities, + [id, moduleLoadInfo]: [string, ModuleLoadInfo] + ) => { + acc[id] = { + id: id, + type: getModuleType(moduleLoadInfo.model), + model: moduleLoadInfo.model, } + return acc }, {} ) + return Object.keys(modules).length > 0 ? modules : state }, }, @@ -1119,7 +1074,6 @@ export const pipetteInvariantProperties: Reducer< NormalizedPipetteById, any // @ts-expect-error(sa, 2021-6-10): cannot use string literals as action type - // TODO IMMEDIATELY: refactor this to the old fashioned way if we cannot have type safety: https://github.com/redux-utilities/redux-actions/issues/282#issuecomment-595163081 > = handleActions( { LOAD_FILE: ( @@ -1128,20 +1082,18 @@ export const pipetteInvariantProperties: Reducer< ): NormalizedPipetteById => { const { file } = action.payload const metadata = getPDMetadata(file) - const loadPipetteCommands = Object.values(file.commands).filter( - (command): command is LoadPipetteCreateCommand => - command.commandType === 'loadPipette' - ) - const pipettes = loadPipetteCommands.reduce( - (acc: NormalizedPipetteById, command) => { - const { pipetteName, pipetteId } = command.params - const tiprackDefURI = metadata.pipetteTiprackAssignments[pipetteId] + const pipettes = Object.entries(metadata.pipettes).reduce( + ( + acc: NormalizedPipetteById, + [id, pipetteLoadInfo]: [string, PipetteLoadInfo] + ) => { + const tiprackDefURI = metadata.pipetteTiprackAssignments[id] return { ...acc, - [pipetteId]: { - id: pipetteId, - name: pipetteName as PipetteName, + [id]: { + id, + name: pipetteLoadInfo.pipetteName as PipetteName, tiprackDefURI, }, } From 0ceaefdcc1f05033c5021885ccd7b22e4adedd8b Mon Sep 17 00:00:00 2001 From: TamarZanzouri Date: Wed, 5 Feb 2025 16:52:45 -0500 Subject: [PATCH 079/150] chore(app): change default labware view to map (#17422) --- .../__tests__/ProtocolSetupLabware.test.tsx | 10 ++++++++-- .../ODD/ProtocolSetup/ProtocolSetupLabware/index.tsx | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupLabware/__tests__/ProtocolSetupLabware.test.tsx b/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupLabware/__tests__/ProtocolSetupLabware.test.tsx index 0f34b8ebd9e..13ae9f8b04c 100644 --- a/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupLabware/__tests__/ProtocolSetupLabware.test.tsx +++ b/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupLabware/__tests__/ProtocolSetupLabware.test.tsx @@ -101,6 +101,7 @@ describe('ProtocolSetupLabware', () => { it('renders the Labware Setup page', () => { render() + fireEvent.click(screen.getByRole('button', { name: 'List View' })) screen.getByText('Labware') screen.getByText('Labware name') screen.getByText('Location') @@ -115,9 +116,10 @@ describe('ProtocolSetupLabware', () => { it('should toggle between map view and list view', () => { render() + expect(screen.queryByText('Map View')).toBeNull() + fireEvent.click(screen.getByRole('button', { name: 'List View' })) expect(screen.queryByText('List View')).toBeNull() fireEvent.click(screen.getByRole('button', { name: 'Map View' })) - expect(screen.queryByText('Map View')).toBeNull() fireEvent.click(screen.getByRole('button', { name: 'List View' })) screen.getByText('Labware') screen.getByText('Labware name') @@ -126,6 +128,7 @@ describe('ProtocolSetupLabware', () => { it('sends a latch-close command when the labware latch is open and the button is clicked', () => { render() + fireEvent.click(screen.getByRole('button', { name: 'List View' })) fireEvent.click(screen.getByText('Labware Latch')) expect(mockCreateLiveCommand).toHaveBeenCalledWith({ command: { @@ -144,6 +147,7 @@ describe('ProtocolSetupLabware', () => { refetch: mockRefetch, } as any) render() + fireEvent.click(screen.getByRole('button', { name: 'List View' })) fireEvent.click(screen.getByText('Labware Latch')) expect(mockCreateLiveCommand).toHaveBeenCalledWith({ command: { @@ -162,6 +166,7 @@ describe('ProtocolSetupLabware', () => { ) render() + fireEvent.click(screen.getByRole('button', { name: 'List View' })) screen.getByText('Opening...') }) @@ -169,8 +174,8 @@ describe('ProtocolSetupLabware', () => { vi.mocked(useModulesQuery).mockReturnValue( mockUseModulesQueryClosing as any ) - render() + fireEvent.click(screen.getByRole('button', { name: 'List View' })) screen.getByText('Closing...') }) @@ -180,6 +185,7 @@ describe('ProtocolSetupLabware', () => { ) render() + fireEvent.click(screen.getByRole('button', { name: 'List View' })) screen.getByText('Open') }) }) diff --git a/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupLabware/index.tsx b/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupLabware/index.tsx index e98a48924e7..804db6be9dc 100644 --- a/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupLabware/index.tsx +++ b/app/src/organisms/ODD/ProtocolSetup/ProtocolSetupLabware/index.tsx @@ -83,7 +83,7 @@ export function ProtocolSetupLabware({ setIsConfirmed, }: ProtocolSetupLabwareProps): JSX.Element { const { t } = useTranslation('protocol_setup') - const [showMapView, setShowMapView] = useState(false) + const [showMapView, setShowMapView] = useState(true) const [ showLabwareDetailsModal, setShowLabwareDetailsModal, From 926b5cd676f79fa57e1256f3ae4af7af1c7fda80 Mon Sep 17 00:00:00 2001 From: koji Date: Thu, 6 Feb 2025 10:28:35 -0500 Subject: [PATCH 080/150] chore: update ubuntu version in workflows of frontend (#17445) * chore: update ubuntu version in workflows of frontend --- .github/workflows/app-test-build-deploy.yaml | 4 ++-- .github/workflows/components-test-build-deploy.yaml | 6 +++--- .github/workflows/js-check.yaml | 2 +- .github/workflows/ll-test-build-deploy.yaml | 8 ++++---- .github/workflows/opentrons-ai-client-test.yaml | 2 +- .github/workflows/react-api-client-test.yaml | 2 +- .github/workflows/step-generation-test.yaml | 2 +- .github/workflows/usb-bridge-lint-test.yaml | 4 ++-- 8 files changed, 15 insertions(+), 15 deletions(-) diff --git a/.github/workflows/app-test-build-deploy.yaml b/.github/workflows/app-test-build-deploy.yaml index 873bfe65c07..13a2051c767 100644 --- a/.github/workflows/app-test-build-deploy.yaml +++ b/.github/workflows/app-test-build-deploy.yaml @@ -52,7 +52,7 @@ env: jobs: js-unit-test: # unit tests for the app's view layer (not the node layer) - runs-on: 'ubuntu-22.04' + runs-on: 'ubuntu-24.04' name: 'opentrons app frontend unit tests' timeout-minutes: 60 steps: @@ -386,7 +386,7 @@ jobs: deploy-release-app: name: 'Deploy built app artifacts to S3' - runs-on: 'ubuntu-22.04' + runs-on: 'ubuntu-24.04' needs: ['js-unit-test', 'backend-unit-test', 'build-app', 'determine-build-type'] if: contains(fromJSON(needs.determine-build-type.outputs.variants), 'release') || contains(fromJSON(needs.determine-build-type.outputs.variants), 'internal-release') diff --git a/.github/workflows/components-test-build-deploy.yaml b/.github/workflows/components-test-build-deploy.yaml index 2b10617c283..aa9bfb7d342 100644 --- a/.github/workflows/components-test-build-deploy.yaml +++ b/.github/workflows/components-test-build-deploy.yaml @@ -41,7 +41,7 @@ jobs: js-unit-test: name: 'components unit tests' timeout-minutes: 30 - runs-on: 'ubuntu-22.04' + runs-on: 'ubuntu-24.04' steps: - uses: 'actions/checkout@v4' - uses: 'actions/setup-node@v4' @@ -75,7 +75,7 @@ jobs: build-components-storybook: name: 'build components artifact' - runs-on: 'ubuntu-22.04' + runs-on: 'ubuntu-24.04' if: github.event_name != 'pull_request' needs: ['js-unit-test'] steps: @@ -135,7 +135,7 @@ jobs: deploy-components: name: 'deploy components storybook artifact to S3' - runs-on: 'ubuntu-22.04' + runs-on: 'ubuntu-24.04' needs: ['js-unit-test', 'build-components-storybook', 'determine-build-type'] if: needs.determine-build-type.outputs.type != 'none' diff --git a/.github/workflows/js-check.yaml b/.github/workflows/js-check.yaml index 807d4a2570c..fa117227fdc 100644 --- a/.github/workflows/js-check.yaml +++ b/.github/workflows/js-check.yaml @@ -39,7 +39,7 @@ env: jobs: checks: name: 'js checks' - runs-on: 'ubuntu-22.04' + runs-on: 'ubuntu-24.04' timeout-minutes: 20 steps: - uses: 'actions/checkout@v4' diff --git a/.github/workflows/ll-test-build-deploy.yaml b/.github/workflows/ll-test-build-deploy.yaml index 35cbc96eced..8027399ffbd 100644 --- a/.github/workflows/ll-test-build-deploy.yaml +++ b/.github/workflows/ll-test-build-deploy.yaml @@ -40,7 +40,7 @@ jobs: js-unit-test: name: 'labware library unit tests' timeout-minutes: 20 - runs-on: 'ubuntu-22.04' + runs-on: 'ubuntu-24.04' steps: - uses: 'actions/checkout@v4' - uses: 'actions/setup-node@v4' @@ -83,7 +83,7 @@ jobs: name: 'labware library e2e tests' needs: ['js-unit-test'] timeout-minutes: 30 - runs-on: 'ubuntu-22.04' + runs-on: 'ubuntu-24.04' steps: - uses: 'actions/checkout@v4' # https://github.com/actions/checkout/issues/290 @@ -123,7 +123,7 @@ jobs: name: 'build labware library artifact' needs: ['js-unit-test'] timeout-minutes: 30 - runs-on: 'ubuntu-22.04' + runs-on: 'ubuntu-24.04' if: github.event_name != 'pull_request' steps: - uses: 'actions/checkout@v4' @@ -170,7 +170,7 @@ jobs: path: labware-library/dist deploy-ll: name: 'deploy LL artifact to S3' - runs-on: 'ubuntu-22.04' + runs-on: 'ubuntu-24.04' needs: ['js-unit-test', 'e2e-test', 'build-ll'] if: github.event_name != 'pull_request' steps: diff --git a/.github/workflows/opentrons-ai-client-test.yaml b/.github/workflows/opentrons-ai-client-test.yaml index 0a78cf73da3..9187667d504 100644 --- a/.github/workflows/opentrons-ai-client-test.yaml +++ b/.github/workflows/opentrons-ai-client-test.yaml @@ -35,7 +35,7 @@ env: jobs: js-unit-test: - runs-on: 'ubuntu-22.04' + runs-on: 'ubuntu-24.04' name: 'opentrons ai frontend unit tests' timeout-minutes: 60 steps: diff --git a/.github/workflows/react-api-client-test.yaml b/.github/workflows/react-api-client-test.yaml index 8a8759f12e1..c9bb0fcc6dd 100644 --- a/.github/workflows/react-api-client-test.yaml +++ b/.github/workflows/react-api-client-test.yaml @@ -34,7 +34,7 @@ jobs: js-unit-test: name: 'api-client and react-api-client unit tests' timeout-minutes: 30 - runs-on: 'ubuntu-22.04' + runs-on: 'ubuntu-24.04' steps: - uses: 'actions/checkout@v4' - uses: 'actions/setup-node@v4' diff --git a/.github/workflows/step-generation-test.yaml b/.github/workflows/step-generation-test.yaml index ac435cf999d..4dd540eccb8 100644 --- a/.github/workflows/step-generation-test.yaml +++ b/.github/workflows/step-generation-test.yaml @@ -32,7 +32,7 @@ env: jobs: js-unit-test: name: 'step generation unit tests' - runs-on: 'ubuntu-22.04' + runs-on: 'ubuntu-24.04' timeout-minutes: 30 steps: - uses: 'actions/checkout@v4' diff --git a/.github/workflows/usb-bridge-lint-test.yaml b/.github/workflows/usb-bridge-lint-test.yaml index bfe11aed61b..7957e898d3c 100644 --- a/.github/workflows/usb-bridge-lint-test.yaml +++ b/.github/workflows/usb-bridge-lint-test.yaml @@ -39,7 +39,7 @@ jobs: lint: name: 'usb-bridge linting' timeout-minutes: 10 - runs-on: 'ubuntu-22.04' + runs-on: 'ubuntu-24.04' steps: - uses: 'actions/checkout@v4' with: @@ -60,7 +60,7 @@ jobs: name: 'usb-bridge package tests' timeout-minutes: 10 needs: [lint] - runs-on: 'ubuntu-22.04' + runs-on: 'ubuntu-24.04' steps: - uses: 'actions/checkout@v4' with: From a693b6c4ad127be2f8bd0158923ed6400782e8dc Mon Sep 17 00:00:00 2001 From: Andy Sigler Date: Thu, 6 Feb 2025 10:30:08 -0500 Subject: [PATCH 081/150] fix(api): correctionVolume can be negative (#17413) --- .../protocol_engine/commands/pipetting_common.py | 2 -- shared-data/command/schemas/12.json | 8 -------- 2 files changed, 10 deletions(-) diff --git a/api/src/opentrons/protocol_engine/commands/pipetting_common.py b/api/src/opentrons/protocol_engine/commands/pipetting_common.py index c0bca3c428a..d240b1fafea 100644 --- a/api/src/opentrons/protocol_engine/commands/pipetting_common.py +++ b/api/src/opentrons/protocol_engine/commands/pipetting_common.py @@ -48,7 +48,6 @@ class AspirateVolumeMixin(BaseModel): correctionVolume: Optional[float] = Field( None, description="The correction volume in uL.", - ge=0, ) @@ -65,7 +64,6 @@ class DispenseVolumeMixin(BaseModel): correctionVolume: Optional[float] = Field( None, description="The correction volume in uL.", - ge=0, ) diff --git a/shared-data/command/schemas/12.json b/shared-data/command/schemas/12.json index 2e40c357c7d..08c86764882 100644 --- a/shared-data/command/schemas/12.json +++ b/shared-data/command/schemas/12.json @@ -67,7 +67,6 @@ "correctionVolume": { "anyOf": [ { - "minimum": 0.0, "type": "number" }, { @@ -176,7 +175,6 @@ "correctionVolume": { "anyOf": [ { - "minimum": 0.0, "type": "number" }, { @@ -215,7 +213,6 @@ "correctionVolume": { "anyOf": [ { - "minimum": 0.0, "type": "number" }, { @@ -413,7 +410,6 @@ "correctionVolume": { "anyOf": [ { - "minimum": 0.0, "type": "number" }, { @@ -1521,7 +1517,6 @@ "correctionVolume": { "anyOf": [ { - "minimum": 0.0, "type": "number" }, { @@ -1565,7 +1560,6 @@ "correctionVolume": { "anyOf": [ { - "minimum": 0.0, "type": "number" }, { @@ -1651,7 +1645,6 @@ "correctionVolume": { "anyOf": [ { - "minimum": 0.0, "type": "number" }, { @@ -1914,7 +1907,6 @@ "correctionVolume": { "anyOf": [ { - "minimum": 0.0, "type": "number" }, { From aae2bfab3b783e34f7ae717d1e189b3de94c6720 Mon Sep 17 00:00:00 2001 From: Nick Diehl <47604184+ncdiehl11@users.noreply.github.com> Date: Thu, 6 Feb 2025 10:56:08 -0500 Subject: [PATCH 082/150] fix(protocol-designer, step-generation): update prewet behavior in PD (#17433) This PR adds prewet to distribute, and updates the logic for when to use prewet for all compound liquid handling command creators. The prewet volume should always be set to the volume of the aspiration that is about to be called (including disposal volume for `distribute`). Prewet commands should be emmitted anytime a new tip is used for an aspiration. Also, I update the UI for the prewet form field in MoveLiquidTools Closes AUTH-908 --- .../src/assets/localization/en/tooltip.json | 2 +- .../molecules/ToggleStepFormField/index.tsx | 36 ++-- .../StepForm/PipetteFields/LabwareField.tsx | 1 + .../StepForm/StepFormToolbox.tsx | 1 + .../StepTools/MoveLiquidTools/index.tsx | 12 +- .../src/__tests__/distribute.test.ts | 198 ++++++++++++++++++ .../commandCreators/compound/distribute.ts | 27 +++ .../src/commandCreators/compound/transfer.ts | 2 +- .../src/fixtures/commandFixtures.ts | 23 +- 9 files changed, 277 insertions(+), 25 deletions(-) diff --git a/protocol-designer/src/assets/localization/en/tooltip.json b/protocol-designer/src/assets/localization/en/tooltip.json index 849844a0c34..1445cedf0bd 100644 --- a/protocol-designer/src/assets/localization/en/tooltip.json +++ b/protocol-designer/src/assets/localization/en/tooltip.json @@ -65,7 +65,7 @@ "newLocation": "New location to move the selected labware", "nozzles": "Partial pickup requires a tip rack directly on the deck. Full rack pickup requires the Flex 96 Tip Rack Adapter.", "pipette": "Select the pipette you want to use", - "preWetTip": "Pre-wet by aspirating and dispensing 2/3 of the tip’s max volume", + "preWetTip": "Pre-wet by aspirating and dispensing the total aspiration volume", "setTemperature": "Select the temperature to set your module to", "wells": "Select wells", "volume": "Volume to dispense in each well" diff --git a/protocol-designer/src/molecules/ToggleStepFormField/index.tsx b/protocol-designer/src/molecules/ToggleStepFormField/index.tsx index ad609acf0b9..3068f4e0e69 100644 --- a/protocol-designer/src/molecules/ToggleStepFormField/index.tsx +++ b/protocol-designer/src/molecules/ToggleStepFormField/index.tsx @@ -1,5 +1,6 @@ import { ALIGN_CENTER, + Check, COLORS, DIRECTION_COLUMN, Flex, @@ -16,12 +17,13 @@ import { ToggleButton } from '../../atoms/ToggleButton' interface ToggleStepFormFieldProps { title: string isSelected: boolean - onLabel: string - offLabel: string toggleUpdateValue: (value: unknown) => void toggleValue: unknown tooltipContent: string | null - isDisabled: boolean + isDisabled?: boolean + onLabel?: string + offLabel?: string + toggleElement?: 'toggle' | 'checkbox' } export function ToggleStepFormField( props: ToggleStepFormFieldProps @@ -34,7 +36,8 @@ export function ToggleStepFormField( toggleUpdateValue, toggleValue, tooltipContent, - isDisabled, + isDisabled = false, + toggleElement = 'toggle', } = props const [targetProps, tooltipProps] = useHoverTooltip() @@ -42,7 +45,7 @@ export function ToggleStepFormField( <> { if (!isDisabled) { toggleUpdateValue(!toggleValue) @@ -50,11 +53,7 @@ export function ToggleStepFormField( }} disabled={isDisabled} > - {tooltipContent != null ? ( - {tooltipContent} - ) : null} - - + {title} @@ -72,15 +72,21 @@ export function ToggleStepFormField( > {isSelected ? onLabel : offLabel} - + {toggleElement === 'toggle' ? ( + + ) : ( + + )} + {tooltipContent != null ? ( + {tooltipContent} + ) : null} ) } diff --git a/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/PipetteFields/LabwareField.tsx b/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/PipetteFields/LabwareField.tsx index 07e08b8a299..00f68dcd46c 100644 --- a/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/PipetteFields/LabwareField.tsx +++ b/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/PipetteFields/LabwareField.tsx @@ -31,6 +31,7 @@ export function LabwareField(props: FieldProps): JSX.Element { onExit={() => { dispatch(hoverSelection({ id: null, text: null })) }} + width="100%" /> ) } diff --git a/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/StepFormToolbox.tsx b/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/StepFormToolbox.tsx index 253889423ca..45eee9219f8 100644 --- a/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/StepFormToolbox.tsx +++ b/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/StepFormToolbox.tsx @@ -360,6 +360,7 @@ export function StepFormToolbox(props: StepFormToolboxProps): JSX.Element { } + width="21.875rem" >
{tab === 'aspirate' ? ( - ) : null} = ( ] : [] const aspirateDisposalVolumeOnce = chunkIndex === 0 ? disposalVolume : 0 + // if changeTip is 'once' or 'never', only prewet for first aspiration + // if changeTip is 'always', pre-wet for each chunk + const preWetTipCommands = + args.preWetTip && + (args.changeTip === 'always' ? true : chunkIndex === 0) + ? mixUtil({ + pipette: args.pipette, + labware: args.sourceLabware, + well: args.sourceWell, + volume: + args.volume * destWellChunk.length + + (args.changeTip === 'always' + ? disposalVolume + : aspirateDisposalVolumeOnce), + times: 1, + offsetFromBottomMm: aspirateOffsetFromBottomMm, + aspirateFlowRateUlSec, + dispenseFlowRateUlSec, + aspirateDelaySeconds: aspirateDelay?.seconds, + dispenseDelaySeconds: dispenseDelay?.seconds, + tipRack: args.tipRack, + xOffset: aspirateXOffset, + yOffset: aspirateYOffset, + nozzles, + }) + : [] return [ ...tipCommands, + ...preWetTipCommands, ...configureForVolumeCommand, ...mixBeforeAspirateCommands, curryCommandCreator(aspirate, { diff --git a/step-generation/src/commandCreators/compound/transfer.ts b/step-generation/src/commandCreators/compound/transfer.ts index c4b3d183ea2..282b92ad3e1 100644 --- a/step-generation/src/commandCreators/compound/transfer.ts +++ b/step-generation/src/commandCreators/compound/transfer.ts @@ -286,7 +286,7 @@ export const transfer: CommandCreator = ( pipette: args.pipette, labware: args.sourceLabware, well: sourceWell, - volume: Math.max(subTransferVol), + volume: subTransferVol, times: 1, offsetFromBottomMm: aspirateOffsetFromBottomMm, aspirateFlowRateUlSec, diff --git a/step-generation/src/fixtures/commandFixtures.ts b/step-generation/src/fixtures/commandFixtures.ts index 37e4ed07a44..056ad5114cd 100644 --- a/step-generation/src/fixtures/commandFixtures.ts +++ b/step-generation/src/fixtures/commandFixtures.ts @@ -138,7 +138,12 @@ export const makeAspirateHelper: MakeAspDispHelper = bakedP ...params, }, }) -export const makeMoveToWellHelper = (wellName: string, labwareId?: string) => ({ +export const makeMoveToWellHelper = ( + wellName: string, + labwareId?: string, + forceDirect?: boolean, + minimumZHeight?: number +) => ({ commandType: 'moveToWell', key: expect.any(String), params: { @@ -153,6 +158,8 @@ export const makeMoveToWellHelper = (wellName: string, labwareId?: string) => ({ z: 11.54, }, }, + forceDirect, + minimumZHeight, }, }) export const makeAirGapHelper = (volume: number) => ({ @@ -268,18 +275,25 @@ export const makeTouchTipHelper: MakeTouchTipHelper = bakedParams => ( key: expect.any(String), params: { ..._defaultTouchTipParams, ...bakedParams, wellName, ...params }, }) -export const delayCommand = (seconds: number): CreateCommand => ({ +export const delayCommand = ( + seconds: number, + message?: string +): CreateCommand => ({ commandType: 'waitForDuration', key: expect.any(String), params: { seconds: seconds, + message, }, }) export const delayWithOffset = ( wellName: string, labwareId: string, seconds?: number, - zOffset?: number + zOffset?: number, + forceDirect?: boolean, + minimumZHeight?: number, + message?: string ): CreateCommand[] => [ { commandType: 'moveToWell', @@ -296,6 +310,8 @@ export const delayWithOffset = ( z: zOffset || 14, }, }, + forceDirect, + minimumZHeight, }, }, { @@ -303,6 +319,7 @@ export const delayWithOffset = ( key: expect.any(String), params: { seconds: seconds ?? 12, + message, }, }, ] From ba079631618172694a33d31b29459732cb7c73ed Mon Sep 17 00:00:00 2001 From: Max Marrone Date: Thu, 6 Feb 2025 11:10:46 -0500 Subject: [PATCH 083/150] feat(robot-server): Allow adding multiple labware offsets in a single request (#17436) --- api-client/src/runs/createLabwareOffset.ts | 24 +++-- .../runs/useCreateLabwareOffsetMutation.ts | 33 +++---- .../robot_server/labware_offsets/router.py | 76 +++++++++++----- .../maintenance_runs/router/labware_router.py | 38 ++++++-- .../runs/router/labware_router.py | 42 +++++++-- .../robot_server/service/dependencies.py | 22 ++++- .../http_api/test_labware_offsets.tavern.yaml | 90 +++++++++++++++++++ .../router/test_labware_router.py | 52 +++++++++-- .../tests/runs/router/test_labware_router.py | 50 +++++++++-- 9 files changed, 345 insertions(+), 82 deletions(-) diff --git a/api-client/src/runs/createLabwareOffset.ts b/api-client/src/runs/createLabwareOffset.ts index 0b91566cf46..e1c125f8254 100644 --- a/api-client/src/runs/createLabwareOffset.ts +++ b/api-client/src/runs/createLabwareOffset.ts @@ -2,17 +2,25 @@ import { POST, request } from '../request' import type { ResponsePromise } from '../request' import type { HostConfig } from '../types' -import type { LegacyLabwareOffsetCreateData, Run } from './types' +import type { LabwareOffset, LegacyLabwareOffsetCreateData } from './types' export function createLabwareOffset( config: HostConfig, runId: string, data: LegacyLabwareOffsetCreateData -): ResponsePromise { - return request( - POST, - `/runs/${runId}/labware_offsets`, - { data }, - config - ) +): ResponsePromise +export function createLabwareOffset( + config: HostConfig, + runId: string, + data: LegacyLabwareOffsetCreateData[] +): ResponsePromise +export function createLabwareOffset( + config: HostConfig, + runId: string, + data: LegacyLabwareOffsetCreateData | LegacyLabwareOffsetCreateData[] +): ResponsePromise { + return request< + LabwareOffset | LabwareOffset[], + { data: LegacyLabwareOffsetCreateData | LegacyLabwareOffsetCreateData[] } + >(POST, `/runs/${runId}/labware_offsets`, { data }, config) } diff --git a/react-api-client/src/runs/useCreateLabwareOffsetMutation.ts b/react-api-client/src/runs/useCreateLabwareOffsetMutation.ts index f1b04505b30..28628da1555 100644 --- a/react-api-client/src/runs/useCreateLabwareOffsetMutation.ts +++ b/react-api-client/src/runs/useCreateLabwareOffsetMutation.ts @@ -3,8 +3,8 @@ import { createLabwareOffset } from '@opentrons/api-client' import { useHost } from '../api' import type { HostConfig, - Run, LegacyLabwareOffsetCreateData, + LabwareOffset, } from '@opentrons/api-client' import type { UseMutationResult, UseMutateAsyncFunction } from 'react-query' @@ -14,12 +14,12 @@ interface CreateLabwareOffsetParams { } export type UseCreateLabwareOffsetMutationResult = UseMutationResult< - Run, + LabwareOffset, unknown, CreateLabwareOffsetParams > & { createLabwareOffset: UseMutateAsyncFunction< - Run, + LabwareOffset, unknown, CreateLabwareOffsetParams > @@ -29,19 +29,22 @@ export function useCreateLabwareOffsetMutation(): UseCreateLabwareOffsetMutation const host = useHost() const queryClient = useQueryClient() - const mutation = useMutation( - ({ runId, data }) => - createLabwareOffset(host as HostConfig, runId, data) - .then(response => { - queryClient.invalidateQueries([host, 'runs']).catch((e: Error) => { - console.error(`error invalidating runs query: ${e.message}`) - }) - return response.data - }) - .catch((e: Error) => { - console.error(`error creating labware offsets: ${e.message}`) - throw e + const mutation = useMutation< + LabwareOffset, + unknown, + CreateLabwareOffsetParams + >(({ runId, data }) => + createLabwareOffset(host as HostConfig, runId, data) + .then(response => { + queryClient.invalidateQueries([host, 'runs']).catch((e: Error) => { + console.error(`error invalidating runs query: ${e.message}`) }) + return response.data + }) + .catch((e: Error) => { + console.error(`error creating labware offsets: ${e.message}`) + throw e + }) ) return { diff --git a/robot-server/robot_server/labware_offsets/router.py b/robot-server/robot_server/labware_offsets/router.py index 4ebf532d657..7d00fbc68d6 100644 --- a/robot-server/robot_server/labware_offsets/router.py +++ b/robot-server/robot_server/labware_offsets/router.py @@ -12,7 +12,10 @@ from opentrons.protocol_engine import ModuleModel from robot_server.labware_offsets.models import LabwareOffsetNotFound -from robot_server.service.dependencies import get_current_time, get_unique_id +from robot_server.service.dependencies import ( + UniqueIDFactory, + get_current_time, +) from robot_server.service.json_api.request import RequestModel from robot_server.service.json_api.response import ( MultiBodyMeta, @@ -42,42 +45,67 @@ @PydanticResponse.wrap_route( router.post, path="/labwareOffsets", - summary="Store a labware offset", + summary="Store labware offsets", description=textwrap.dedent( """\ - Store a labware offset for later retrieval through `GET /labwareOffsets`. + Store labware offsets for later retrieval through `GET /labwareOffsets`. On its own, this does not affect robot motion. - To do that, you must add the offset to a run, through the `/runs` endpoints. + To do that, you must add the offsets to a run, through the `/runs` endpoints. + + The response body's `data` will either be a single offset or a list of offsets, + depending on whether you provided a single offset or a list in the request body's `data`. """ ), status_code=201, include_in_schema=False, # todo(mm, 2025-01-08): Include for v8.4.0. ) -async def post_labware_offset( # noqa: D103 +async def post_labware_offsets( # noqa: D103 store: Annotated[LabwareOffsetStore, fastapi.Depends(get_labware_offset_store)], - new_offset_id: Annotated[str, fastapi.Depends(get_unique_id)], + new_offset_id_factory: Annotated[UniqueIDFactory, fastapi.Depends(UniqueIDFactory)], new_offset_created_at: Annotated[datetime, fastapi.Depends(get_current_time)], - request_body: Annotated[RequestModel[StoredLabwareOffsetCreate], fastapi.Body()], -) -> PydanticResponse[SimpleBody[StoredLabwareOffset]]: - new_offset = IncomingStoredLabwareOffset( - id=new_offset_id, - createdAt=new_offset_created_at, - definitionUri=request_body.data.definitionUri, - locationSequence=request_body.data.locationSequence, - vector=request_body.data.vector, + request_body: Annotated[ + RequestModel[StoredLabwareOffsetCreate | list[StoredLabwareOffsetCreate]], + fastapi.Body(), + ], +) -> PydanticResponse[SimpleBody[StoredLabwareOffset | list[StoredLabwareOffset]]]: + new_offsets = [ + IncomingStoredLabwareOffset( + id=new_offset_id_factory.get(), + createdAt=new_offset_created_at, + definitionUri=request_body_element.definitionUri, + locationSequence=request_body_element.locationSequence, + vector=request_body_element.vector, + ) + for request_body_element in ( + request_body.data + if isinstance(request_body.data, list) + else [request_body.data] + ) + ] + + for new_offset in new_offsets: + store.add(new_offset) + + stored_offsets = [ + StoredLabwareOffset.model_construct( + id=incoming.id, + createdAt=incoming.createdAt, + definitionUri=incoming.definitionUri, + locationSequence=incoming.locationSequence, + vector=incoming.vector, + ) + for incoming in new_offsets + ] + + # Return a list if the client POSTed a list, or an object if the client POSTed an object. + # For some reason, mypy needs to be given the type annotation explicitly. + response_data: StoredLabwareOffset | list[StoredLabwareOffset] = ( + stored_offsets if isinstance(request_body.data, list) else stored_offsets[0] ) - store.add(new_offset) + return await PydanticResponse.create( - content=SimpleBody.model_construct( - data=StoredLabwareOffset( - id=new_offset_id, - createdAt=new_offset_created_at, - definitionUri=request_body.data.definitionUri, - locationSequence=request_body.data.locationSequence, - vector=request_body.data.vector, - ) - ), + content=SimpleBody.model_construct(data=response_data), status_code=201, ) diff --git a/robot-server/robot_server/maintenance_runs/router/labware_router.py b/robot-server/robot_server/maintenance_runs/router/labware_router.py index c64e8b7db97..1271710de1e 100644 --- a/robot-server/robot_server/maintenance_runs/router/labware_router.py +++ b/robot-server/robot_server/maintenance_runs/router/labware_router.py @@ -36,33 +36,57 @@ "There is no matching `GET /maintenance_runs/{runId}/labware_offsets` endpoint." " To read the list of labware offsets currently on the run," " see the run's `labwareOffsets` field." + "\n\n" + "The response body's `data` will either be a single offset or a list of offsets," + " depending on whether you provided a single offset or a list in the request body's `data`." ), status_code=status.HTTP_201_CREATED, responses={ - status.HTTP_201_CREATED: {"model": SimpleBody[LabwareOffset]}, + status.HTTP_201_CREATED: { + "model": SimpleBody[LabwareOffset | list[LabwareOffset]] + }, status.HTTP_404_NOT_FOUND: {"model": ErrorBody[RunNotFound]}, status.HTTP_409_CONFLICT: {"model": ErrorBody[RunNotIdle]}, }, ) async def add_labware_offset( - request_body: RequestModel[LabwareOffsetCreate | LegacyLabwareOffsetCreate], + request_body: RequestModel[ + LabwareOffsetCreate + | LegacyLabwareOffsetCreate + | list[LabwareOffsetCreate | LegacyLabwareOffsetCreate] + ], run_orchestrator_store: Annotated[ MaintenanceRunOrchestratorStore, Depends(get_maintenance_run_orchestrator_store) ], run: Annotated[MaintenanceRun, Depends(get_run_data_from_url)], -) -> PydanticResponse[SimpleBody[LabwareOffset]]: - """Add a labware offset to a maintenance run. +) -> PydanticResponse[SimpleBody[LabwareOffset | list[LabwareOffset]]]: + """Add labware offsets to a maintenance run. Args: request_body: New labware offset request data from request body. run_orchestrator_store: Engine storage interface. run: Run response data by ID from URL; ensures 404 if run not found. """ - added_offset = run_orchestrator_store.add_labware_offset(request_body.data) - log.info(f'Added labware offset "{added_offset.id}"' f' to run "{run.id}".') + offsets_to_add = ( + request_body.data + if isinstance(request_body.data, list) + else [request_body.data] + ) + + added_offsets: list[LabwareOffset] = [] + for offset_to_add in offsets_to_add: + added_offset = run_orchestrator_store.add_labware_offset(offset_to_add) + added_offsets.append(added_offset) + log.info(f'Added labware offset "{added_offset.id}" to run "{run.id}".') + + # Return a list if the client POSTed a list, or an object if the client POSTed an object. + # For some reason, mypy needs to be given the type annotation explicitly. + response_data: LabwareOffset | list[LabwareOffset] = ( + added_offsets if isinstance(request_body.data, list) else added_offsets[0] + ) return await PydanticResponse.create( - content=SimpleBody.model_construct(data=added_offset), + content=SimpleBody.model_construct(data=response_data), status_code=status.HTTP_201_CREATED, ) diff --git a/robot-server/robot_server/runs/router/labware_router.py b/robot-server/robot_server/runs/router/labware_router.py index 78c880a2df5..970af7415c3 100644 --- a/robot-server/robot_server/runs/router/labware_router.py +++ b/robot-server/robot_server/runs/router/labware_router.py @@ -35,29 +35,38 @@ @PydanticResponse.wrap_route( labware_router.post, path="/runs/{runId}/labware_offsets", - summary="Add a labware offset to a run", + summary="Add labware offsets to a run", description=( - "Add a labware offset to an existing run, returning the created offset." + "Add labware offsets to an existing run, returning the created offsets." "\n\n" "There is no matching `GET /runs/{runId}/labware_offsets` endpoint." " To read the list of labware offsets currently on the run," " see the run's `labwareOffsets` field." + "\n\n" + "The response body's `data` will either be a single offset or a list of offsets," + " depending on whether you provided a single offset or a list in the request body's `data`." ), status_code=status.HTTP_201_CREATED, responses={ - status.HTTP_201_CREATED: {"model": SimpleBody[LabwareOffset]}, + status.HTTP_201_CREATED: { + "model": SimpleBody[LabwareOffset | list[LabwareOffset]] + }, status.HTTP_404_NOT_FOUND: {"model": ErrorBody[RunNotFound]}, status.HTTP_409_CONFLICT: {"model": ErrorBody[Union[RunStopped, RunNotIdle]]}, }, ) async def add_labware_offset( - request_body: RequestModel[LegacyLabwareOffsetCreate | LabwareOffsetCreate], + request_body: RequestModel[ + LegacyLabwareOffsetCreate + | LabwareOffsetCreate + | list[LegacyLabwareOffsetCreate | LabwareOffsetCreate] + ], run_orchestrator_store: Annotated[ RunOrchestratorStore, Depends(get_run_orchestrator_store) ], run: Annotated[Run, Depends(get_run_data_from_url)], -) -> PydanticResponse[SimpleBody[LabwareOffset]]: - """Add a labware offset to a run. +) -> PydanticResponse[SimpleBody[LabwareOffset | list[LabwareOffset]]]: + """Add labware offsets to a run. Args: request_body: New labware offset request data from request body. @@ -69,11 +78,26 @@ async def add_labware_offset( status.HTTP_409_CONFLICT ) - added_offset = run_orchestrator_store.add_labware_offset(request_body.data) - log.info(f'Added labware offset "{added_offset.id}"' f' to run "{run.id}".') + offsets_to_add = ( + request_body.data + if isinstance(request_body.data, list) + else [request_body.data] + ) + + added_offsets: list[LabwareOffset] = [] + for offset_to_add in offsets_to_add: + added_offset = run_orchestrator_store.add_labware_offset(offset_to_add) + added_offsets.append(added_offset) + log.info(f'Added labware offset "{added_offset.id}" to run "{run.id}".') + + # Return a list if the client POSTed a list, or an object if the client POSTed an object. + # For some reason, mypy needs to be given the type annotation explicitly. + response_data: LabwareOffset | list[LabwareOffset] = ( + added_offsets if isinstance(request_body.data, list) else added_offsets[0] + ) return await PydanticResponse.create( - content=SimpleBody.model_construct(data=added_offset), + content=SimpleBody.model_construct(data=response_data), status_code=status.HTTP_201_CREATED, ) diff --git a/robot-server/robot_server/service/dependencies.py b/robot-server/robot_server/service/dependencies.py index b27e014a3e9..80d811616c9 100644 --- a/robot-server/robot_server/service/dependencies.py +++ b/robot-server/robot_server/service/dependencies.py @@ -35,7 +35,27 @@ async def get_session_manager( async def get_unique_id() -> str: """Get a unique ID string to use as a resource identifier.""" - return str(uuid4()) + return UniqueIDFactory().get() + + +class UniqueIDFactory: + """ + This is equivalent to the `get_unique_id()` free function. Wrapping it in a factory + class makes things easier for FastAPI endpoint functions that need multiple unique + IDs. They can do: + + unique_id_factory: UniqueIDFactory = fastapi.Depends(UniqueIDFactory) + + And then: + + unique_id_1 = await unique_id_factory.get() + unique_id_2 = await unique_id_factory.get() + """ + + @staticmethod + def get() -> str: + """Get a unique ID to use as a resource identifier.""" + return str(uuid4()) async def get_current_time() -> datetime: diff --git a/robot-server/tests/integration/http_api/test_labware_offsets.tavern.yaml b/robot-server/tests/integration/http_api/test_labware_offsets.tavern.yaml index 0745f10a2ae..754a20df132 100644 --- a/robot-server/tests/integration/http_api/test_labware_offsets.tavern.yaml +++ b/robot-server/tests/integration/http_api/test_labware_offsets.tavern.yaml @@ -150,14 +150,98 @@ stages: cursor: 0 totalLength: 0 +--- +test_name: Test POSTing multiple offsets in a single request + +marks: + - usefixtures: + - ot3_server_base_url + +stages: + - name: POST multiple offsets and check the response + request: + method: POST + url: '{ot3_server_base_url}/labwareOffsets' + json: + data: + - definitionUri: testNamespace/loadName1/1 + locationSequence: + - kind: onAddressableArea + addressableAreaName: A1 + vector: + x: 1 + y: 1 + z: 1 + - definitionUri: testNamespace/loadName2/1 + locationSequence: + - kind: onAddressableArea + addressableAreaName: A2 + vector: + x: 2 + y: 2 + z: 2 + response: + status_code: 201 + json: + data: + - id: !anystr + createdAt: !anystr + definitionUri: testNamespace/loadName1/1 + locationSequence: + - kind: onAddressableArea + addressableAreaName: A1 + vector: + x: 1 + y: 1 + z: 1 + - id: !anystr + createdAt: !anystr + definitionUri: testNamespace/loadName2/1 + locationSequence: + - kind: onAddressableArea + addressableAreaName: A2 + vector: + x: 2 + y: 2 + z: 2 + save: + json: + offset_1_data: data[0] + offset_2_data: data[1] + + - name: POST an empty list of offsets and check the response + request: + method: POST + url: '{ot3_server_base_url}/labwareOffsets' + json: + data: [] + response: + status_code: 201 + json: + data: [] + + - name: Make sure all offsets got stored + request: + url: '{ot3_server_base_url}/labwareOffsets' + response: + json: + data: + - !force_format_include '{offset_1_data}' + - !force_format_include '{offset_2_data}' + meta: + cursor: 0 + totalLength: 2 + --- # Some of the filter query parameters can have `null` values or be omitted, # with different semantics between the two. That distinction takes a bit of care to # preserve across our code, so here we test it specifically. test_name: Test null vs. omitted filter query parameters + marks: - usefixtures: - ot3_server_base_url + stages: - name: POST test offset 1 request: @@ -180,6 +264,7 @@ stages: save: json: offset_1_data: data + - name: POST test offset 2 request: method: POST @@ -202,6 +287,7 @@ stages: save: json: offset_2_data: data + - name: POST test offset 3 request: method: POST @@ -224,6 +310,7 @@ stages: save: json: offset_3_data: data + - name: POST test offset 4 request: method: POST @@ -247,6 +334,7 @@ stages: save: json: offset_4_data: data + - name: Test no filters request: url: '{ot3_server_base_url}/labwareOffsets' @@ -258,6 +346,7 @@ stages: - !force_format_include '{offset_3_data}' - !force_format_include '{offset_4_data}' meta: !anydict + - name: Test filtering on locationModuleModel=null request: url: '{ot3_server_base_url}/labwareOffsets?locationModuleModel=null' @@ -267,6 +356,7 @@ stages: - !force_format_include '{offset_1_data}' - !force_format_include '{offset_3_data}' meta: !anydict + - name: Test filtering on locationDefinitionUri=null request: url: '{ot3_server_base_url}/labwareOffsets?locationDefinitionUri=null' diff --git a/robot-server/tests/maintenance_runs/router/test_labware_router.py b/robot-server/tests/maintenance_runs/router/test_labware_router.py index 72b1e95e2f7..e1691c1b26b 100644 --- a/robot-server/tests/maintenance_runs/router/test_labware_router.py +++ b/robot-server/tests/maintenance_runs/router/test_labware_router.py @@ -50,20 +50,32 @@ def labware_definition(minimal_labware_def: LabwareDefDict) -> LabwareDefinition return LabwareDefinition.model_validate(minimal_labware_def) -async def test_add_labware_offset( +async def test_add_labware_offsets( decoy: Decoy, mock_maintenance_run_orchestrator_store: MaintenanceRunOrchestratorStore, run: MaintenanceRun, ) -> None: - """It should add the labware offset to the engine, assuming the run is current.""" - labware_offset_request = pe_types.LegacyLabwareOffsetCreate( + """It should add the labware offsets to the engine, assuming the run is current.""" + labware_offset_request_1 = pe_types.LegacyLabwareOffsetCreate( definitionUri="namespace_1/load_name_1/123", location=pe_types.LegacyLabwareOffsetLocation(slotName=DeckSlotName.SLOT_1), vector=pe_types.LabwareOffsetVector(x=1, y=2, z=3), ) + labware_offset_request_2 = pe_types.LegacyLabwareOffsetCreate( + definitionUri="namespace_1/load_name_2/123", + location=pe_types.LegacyLabwareOffsetLocation(slotName=DeckSlotName.SLOT_1), + vector=pe_types.LabwareOffsetVector(x=1, y=2, z=3), + ) - labware_offset = pe_types.LabwareOffset( - id="labware-offset-id", + labware_offset_1 = pe_types.LabwareOffset( + id="labware-offset-id-1", + createdAt=datetime(year=2022, month=2, day=2), + definitionUri="labware-definition-uri", + location=pe_types.LegacyLabwareOffsetLocation(slotName=DeckSlotName.SLOT_1), + vector=pe_types.LabwareOffsetVector(x=0, y=0, z=0), + ) + labware_offset_2 = pe_types.LabwareOffset( + id="labware-offset-id-2", createdAt=datetime(year=2022, month=2, day=2), definitionUri="labware-definition-uri", location=pe_types.LegacyLabwareOffsetLocation(slotName=DeckSlotName.SLOT_1), @@ -72,17 +84,39 @@ async def test_add_labware_offset( decoy.when( mock_maintenance_run_orchestrator_store.add_labware_offset( - labware_offset_request + labware_offset_request_1 + ) + ).then_return(labware_offset_1) + decoy.when( + mock_maintenance_run_orchestrator_store.add_labware_offset( + labware_offset_request_2 ) - ).then_return(labware_offset) + ).then_return(labware_offset_2) result = await add_labware_offset( - request_body=RequestModel(data=labware_offset_request), + request_body=RequestModel(data=labware_offset_request_1), run_orchestrator_store=mock_maintenance_run_orchestrator_store, run=run, ) + assert result.content == SimpleBody(data=labware_offset_1) + assert result.status_code == 201 - assert result.content == SimpleBody(data=labware_offset) + result = await add_labware_offset( + request_body=RequestModel( + data=[labware_offset_request_1, labware_offset_request_2] + ), + run_orchestrator_store=mock_maintenance_run_orchestrator_store, + run=run, + ) + assert result.content == SimpleBody(data=[labware_offset_1, labware_offset_2]) + assert result.status_code == 201 + + result = await add_labware_offset( + request_body=RequestModel(data=[]), + run_orchestrator_store=mock_maintenance_run_orchestrator_store, + run=run, + ) + assert result.content == SimpleBody(data=[]) assert result.status_code == 201 diff --git a/robot-server/tests/runs/router/test_labware_router.py b/robot-server/tests/runs/router/test_labware_router.py index 2b55b4097f6..e8304784fbf 100644 --- a/robot-server/tests/runs/router/test_labware_router.py +++ b/robot-server/tests/runs/router/test_labware_router.py @@ -53,20 +53,32 @@ def labware_definition(minimal_labware_def: LabwareDefDict) -> LabwareDefinition return LabwareDefinition.model_validate(minimal_labware_def) -async def test_add_labware_offset( +async def test_add_labware_offsets( decoy: Decoy, mock_run_orchestrator_store: RunOrchestratorStore, run: Run, ) -> None: - """It should add the labware offset to the engine, assuming the run is current.""" - labware_offset_request = pe_types.LegacyLabwareOffsetCreate( + """It should add the labware offsets to the engine, assuming the run is current.""" + labware_offset_request_1 = pe_types.LegacyLabwareOffsetCreate( definitionUri="namespace_1/load_name_1/123", location=pe_types.LegacyLabwareOffsetLocation(slotName=DeckSlotName.SLOT_1), vector=pe_types.LabwareOffsetVector(x=1, y=2, z=3), ) + labware_offset_request_2 = pe_types.LegacyLabwareOffsetCreate( + definitionUri="namespace_1/load_name_2/123", + location=pe_types.LegacyLabwareOffsetLocation(slotName=DeckSlotName.SLOT_1), + vector=pe_types.LabwareOffsetVector(x=1, y=2, z=3), + ) - labware_offset = pe_types.LabwareOffset( - id="labware-offset-id", + labware_offset_1 = pe_types.LabwareOffset( + id="labware-offset-id-1", + createdAt=datetime(year=2022, month=2, day=2), + definitionUri="labware-definition-uri", + location=pe_types.LegacyLabwareOffsetLocation(slotName=DeckSlotName.SLOT_1), + vector=pe_types.LabwareOffsetVector(x=0, y=0, z=0), + ) + labware_offset_2 = pe_types.LabwareOffset( + id="labware-offset-id-2", createdAt=datetime(year=2022, month=2, day=2), definitionUri="labware-definition-uri", location=pe_types.LegacyLabwareOffsetLocation(slotName=DeckSlotName.SLOT_1), @@ -74,16 +86,36 @@ async def test_add_labware_offset( ) decoy.when( - mock_run_orchestrator_store.add_labware_offset(labware_offset_request) - ).then_return(labware_offset) + mock_run_orchestrator_store.add_labware_offset(labware_offset_request_1) + ).then_return(labware_offset_1) + decoy.when( + mock_run_orchestrator_store.add_labware_offset(labware_offset_request_2) + ).then_return(labware_offset_2) result = await add_labware_offset( - request_body=RequestModel(data=labware_offset_request), + request_body=RequestModel(data=labware_offset_request_1), run_orchestrator_store=mock_run_orchestrator_store, run=run, ) + assert result.content == SimpleBody(data=labware_offset_1) + assert result.status_code == 201 - assert result.content == SimpleBody(data=labware_offset) + result = await add_labware_offset( + request_body=RequestModel( + data=[labware_offset_request_1, labware_offset_request_2] + ), + run_orchestrator_store=mock_run_orchestrator_store, + run=run, + ) + assert result.content == SimpleBody(data=[labware_offset_1, labware_offset_2]) + assert result.status_code == 201 + + result = await add_labware_offset( + request_body=RequestModel(data=[]), + run_orchestrator_store=mock_run_orchestrator_store, + run=run, + ) + assert result.content == SimpleBody(data=[]) assert result.status_code == 201 From 30f65d9bfd6b9d14bfbe6b8e9dd36f41f8049059 Mon Sep 17 00:00:00 2001 From: Laura Cox <31892318+Laura-Danielle@users.noreply.github.com> Date: Thu, 6 Feb 2025 10:16:14 -0600 Subject: [PATCH 084/150] refactor(api): Move the plunger position starting position after an evotip seal command (#17438) # Overview Moving the plunger the position to 400ul rather than the maximum volume of the 1000ul pipettes. ## Test Plan and Hands on Testing - Verify that we can still push out liquid OK from the resin tips. ## Changelog - Modify the plunger volume aspirated to a lower number to avoid large pressure build-ups. ## Risk assessment Low. Beta feature --- .../protocol_engine/commands/evotip_seal_pipette.py | 6 +++--- .../protocol_engine/commands/test_evotip_seal_pipette.py | 6 ++---- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/api/src/opentrons/protocol_engine/commands/evotip_seal_pipette.py b/api/src/opentrons/protocol_engine/commands/evotip_seal_pipette.py index 0e67e8fc2c0..d357ad66e2f 100644 --- a/api/src/opentrons/protocol_engine/commands/evotip_seal_pipette.py +++ b/api/src/opentrons/protocol_engine/commands/evotip_seal_pipette.py @@ -44,6 +44,7 @@ _PREP_DISTANCE_DEFAULT = 8.25 _PRESS_DISTANCE_DEFAULT = 3.5 _EJECTOR_PUSH_MM_DEFAULT = 7.0 +_SAFE_TOP_VOLUME = 400 class TipPickUpParams(BaseModel): @@ -240,7 +241,6 @@ async def execute( tip_geometry = self._state_view.geometry.get_nominal_tip_geometry( pipette_id, labware_id, well_name ) - maximum_volume = self._state_view.pipettes.get_maximum_volume(pipette_id) if self._state_view.pipettes.get_mount(pipette_id) == MountType.LEFT: await self._hardware_api.home(axes=[Axis.P_L]) else: @@ -281,7 +281,7 @@ async def execute( self._tip_handler.cache_tip(pipette_id, tip_geometry) hw_instr = self._hardware_api.hardware_instruments[mount.to_hw_mount()] if hw_instr is not None: - hw_instr.set_current_volume(maximum_volume) + hw_instr.set_current_volume(_SAFE_TOP_VOLUME) state_update = StateUpdate() state_update.update_pipette_tip_state( @@ -291,7 +291,7 @@ async def execute( state_update.set_fluid_aspirated( pipette_id=pipette_id, - fluid=AspiratedFluid(kind=FluidKind.LIQUID, volume=maximum_volume), + fluid=AspiratedFluid(kind=FluidKind.LIQUID, volume=_SAFE_TOP_VOLUME), ) return SuccessData( public=EvotipSealPipetteResult( diff --git a/api/tests/opentrons/protocol_engine/commands/test_evotip_seal_pipette.py b/api/tests/opentrons/protocol_engine/commands/test_evotip_seal_pipette.py index 3d1bbeb1406..fab36a81277 100644 --- a/api/tests/opentrons/protocol_engine/commands/test_evotip_seal_pipette.py +++ b/api/tests/opentrons/protocol_engine/commands/test_evotip_seal_pipette.py @@ -102,7 +102,6 @@ async def test_success( decoy.when( state_view.geometry.get_nominal_tip_geometry("pipette-id", "labware-id", "A3") ).then_return(TipGeometry(length=42, diameter=5, volume=300)) - decoy.when(state_view.pipettes.get_maximum_volume("pipette-id")).then_return(1000) decoy.when( await tip_handler.pick_up_tip( @@ -135,7 +134,7 @@ async def test_success( ), pipette_aspirated_fluid=update_types.PipetteAspiratedFluidUpdate( pipette_id="pipette-id", - fluid=AspiratedFluid(kind=FluidKind.LIQUID, volume=1000), + fluid=AspiratedFluid(kind=FluidKind.LIQUID, volume=400), ), ), ) @@ -202,7 +201,6 @@ async def test_no_tip_physically_missing_error( decoy.when(state_view.labware.get_definition(labware_id)).then_return( evotips_definition ) - decoy.when(state_view.pipettes.get_maximum_volume(pipette_id)).then_return(1000) result = await subject.execute( EvotipSealPipetteParams( @@ -224,7 +222,7 @@ async def test_no_tip_physically_missing_error( ), pipette_aspirated_fluid=update_types.PipetteAspiratedFluidUpdate( pipette_id="pipette-id", - fluid=AspiratedFluid(kind=FluidKind.LIQUID, volume=1000), + fluid=AspiratedFluid(kind=FluidKind.LIQUID, volume=400), ), ), ) From ff9f365a06a868c1f08134605290999f7ac9a17b Mon Sep 17 00:00:00 2001 From: emilyburghardt Date: Thu, 6 Feb 2025 10:21:10 -0700 Subject: [PATCH 085/150] API 2.22 docs versioning update (#17400) # Overview Adding API 2.22 to our PAPI versioning page. Now, we document API 2.22 for customers, but it's clear that this version only contains changes for our commercial partners. ## Test Plan and Hands on Testing Needs to be built ## Changelog -update versions table -add a simple version description for API 2.22 ## Review requests ## Risk assessment low --- api/docs/v2/versioning.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/api/docs/v2/versioning.rst b/api/docs/v2/versioning.rst index 935011f61dd..9f615ed04ff 100644 --- a/api/docs/v2/versioning.rst +++ b/api/docs/v2/versioning.rst @@ -84,6 +84,8 @@ This table lists the correspondence between Protocol API versions and robot soft +-------------+------------------------------+ | API Version | Introduced in Robot Software | +=============+==============================+ +| 2.22 | 8.3.0 | ++-------------+------------------------------+ | 2.21 | 8.2.0 | +-------------+------------------------------+ | 2.20 | 8.0.0 | @@ -136,6 +138,10 @@ This table lists the correspondence between Protocol API versions and robot soft Changes in API Versions ======================= +Version 2.22 +------------- +This version includes beta features for our commercial partners. + Version 2.21 ------------ - Adds :py:class:`.AbsorbanceReaderContext` to support the :ref:`Absorbance Plate Reader Module `. Use the load name ``absorbanceReaderV1`` with :py:meth:`.ProtocolContext.load_module` to add an Absorbance Plate Reader to a protocol. From 73b70f44648d8d4369d882c9f4de28565fbe509c Mon Sep 17 00:00:00 2001 From: Josh McVey Date: Thu, 6 Feb 2025 12:20:41 -0600 Subject: [PATCH 086/150] chore(ci): adjust codecov settings and update step-generation workflow (#17424) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Most js projects were not uploading to codecov before the change in #17406 to produce lcov output. - Now that they are, we don't want ❌ everywhere so let us adjust the patch threshold and catch up the ignore list. - Tackle any specific areas of coverage deficit strategically. - In addition convert `.github/workflows/step-generation-test.yaml` to the pattern of PD like in #17406 --- .codecov.yml | 66 +++++++++++++++------ .github/workflows/step-generation-test.yaml | 38 ++++-------- NOTICE | 2 +- step-generation/Makefile | 4 +- 4 files changed, 62 insertions(+), 48 deletions(-) diff --git a/.codecov.yml b/.codecov.yml index 4eb13688110..0ec55aa6462 100644 --- a/.codecov.yml +++ b/.codecov.yml @@ -1,27 +1,55 @@ +version: 2.0 + +coverage: + status: + project: + default: + target: auto + threshold: '10' + patch: + default: + target: auto + threshold: 0 + +comment: + layout: 'reach, diff, flags, files' + ignore: - - '**/node_modules' - - 'webpack-config' - - 'hardware-testing' - - '**/*.md' - - '**/*.yaml' + - 'webpack-config/**' + - 'hardware-testing/**' + - 'abr-testing/**' + - 'test-data-generation/**' + - 'performance-metrics/**' + - 'package-testing/**' + - 'opentrons-ai-server/**' + - 'opentrons-ai-client/**' + - 'g-code-testing/**' + - 'api-client/**' + - 'analyses-snapshot-testing/**' + - '.storybook/**' + - 'react-api-client/**' + - 'scripts/**' + - '.github/**' + - '**/build/**' + - '**/dist/**' + - '**/node_modules/**' + - '**/{test,tests,__tests__,__mocks__,mocks}/**' + - '**/*.{md,yaml,yml,json,rst}' - '**/Makefile' - - '**/*.in' - - '**/*.json' - - '**/*.config.js' + - '**/*.{in,ini,lock,toml,cfg}' + - '**/setup.py' + - '**/requirements.txt' + - '**/.flake8' + - '**/.coveragerc' + - '**/.prettierrc.js' + - '**/.eslintrc.js' + - '**/Pipfile' + - '**/Dockerfile*' + - '**/*.{config.js,config.ts}' - '**/*.mk' - '**/*.stories.tsx' - -comment: - # add flags to `layout` configuration to show up in the PR comment - layout: 'reach, diff, flags, files' + - '**/*.{mjs,css,cjs,mts}' flag_management: default_rules: carryforward: true - -coverage: - status: - project: - default: - target: auto - threshold: 10 diff --git a/.github/workflows/step-generation-test.yaml b/.github/workflows/step-generation-test.yaml index 4dd540eccb8..c589223e452 100644 --- a/.github/workflows/step-generation-test.yaml +++ b/.github/workflows/step-generation-test.yaml @@ -9,12 +9,18 @@ on: - 'shared-data/**' - 'package.json' - '.github/workflows/step-generation-test.yaml' + - '.github/actions/js/setup/action.yml' + - '.github/actions/git/resolve-tag/action.yml' + - '.github/actions/environment/complex-variables/action.yml' push: paths: - 'step-generation/**' - 'shared-data/**' - 'package.json' - '.github/workflows/step-generation-test.yaml' + - '.github/actions/js/setup/action.yml' + - '.github/actions/git/resolve-tag/action.yml' + - '.github/actions/environment/complex-variables/action.yml' branches: - '*' @@ -33,35 +39,15 @@ jobs: js-unit-test: name: 'step generation unit tests' runs-on: 'ubuntu-24.04' - timeout-minutes: 30 + timeout-minutes: 20 steps: - - uses: 'actions/checkout@v4' - - uses: 'actions/setup-node@v4' - with: - node-version: '22.11.0' - - name: 'install udev for usb-detection' - run: | - # WORKAROUND: Remove microsoft debian repo due to https://github.com/microsoft/linux-package-repositories/issues/130. Remove line below after it is resolved - sudo rm -f /etc/apt/sources.list.d/microsoft-prod.list - sudo apt-get update && sudo apt-get install libudev-dev - - name: 'cache yarn cache' - uses: actions/cache@v3 - with: - path: | - ${{ github.workspace }}/.yarn-cache - ${{ github.workspace }}/.npm-cache - key: js-${{ secrets.GH_CACHE_VERSION }}-${{ runner.os }}-yarn-${{ hashFiles('yarn.lock') }} - restore-keys: | - js-${{ secrets.GH_CACHE_VERSION }}-${{ runner.os }}-yarn- - - name: 'setup-js' - run: | - npm config set cache ./.npm-cache - yarn config set cache-folder ./.yarn-cache - make setup-js + - name: 'Checkout Repository' + uses: actions/checkout@v4 + - uses: ./.github/actions/js/setup - name: 'run step generation unit tests' run: make -C step-generation test-cov - name: 'Upload coverage report' - uses: codecov/codecov-action@v3 + uses: codecov/codecov-action@v5 with: - files: ./coverage/lcov.info flags: step-generation + token: ${{ secrets.CODECOV_TOKEN }} diff --git a/NOTICE b/NOTICE index 3d2de27433a..88a30e2a338 100644 --- a/NOTICE +++ b/NOTICE @@ -1,5 +1,5 @@ Opentrons Platform -Copyright 2015-2020 Opentrons Labworks, Inc. +Copyright 2015-2025 Opentrons Labworks, Inc. The source code in this repository is licensed under the Apache License, Version 2.0 (the "License"); you may not use this code except in diff --git a/step-generation/Makefile b/step-generation/Makefile index fb32b39b756..9d3d98b40bf 100644 --- a/step-generation/Makefile +++ b/step-generation/Makefile @@ -3,10 +3,10 @@ # using bash instead of /bin/bash in SHELL prevents macOS optimizing away our PATH update SHELL := bash -# These variables can be overriden when make is invoked to customize the +# These variables can be overridden when make is invoked to customize the # behavior of jest tests ?= -cov_opts ?= --coverage=true +cov_opts ?= --coverage --pool=threads test_opts ?= .PHONY: test From cdb7802bd14cead5b64574faf269d79b2f160b5f Mon Sep 17 00:00:00 2001 From: Max Marrone Date: Thu, 6 Feb 2025 14:27:49 -0500 Subject: [PATCH 087/150] docs(robot-server): Include `/labwareOffsets` endpoints in docs again (#17441) These HTTP API endpoints were hidden from the docs because they were incomplete and we didn't want the soon-to-be-released v8.3.0 software to advertise them. v8.3.0 is in its own branch now, so we can undo that, so the docs match the in-development state of v8.4.0. Reverts commit 5f869ea04c29cb6d1b2e4884af8d859dbbd88149, PR #17219. --- robot-server/robot_server/labware_offsets/router.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/robot-server/robot_server/labware_offsets/router.py b/robot-server/robot_server/labware_offsets/router.py index 7d00fbc68d6..c388046dad2 100644 --- a/robot-server/robot_server/labware_offsets/router.py +++ b/robot-server/robot_server/labware_offsets/router.py @@ -58,7 +58,6 @@ """ ), status_code=201, - include_in_schema=False, # todo(mm, 2025-01-08): Include for v8.4.0. ) async def post_labware_offsets( # noqa: D103 store: Annotated[LabwareOffsetStore, fastapi.Depends(get_labware_offset_store)], @@ -119,7 +118,6 @@ async def post_labware_offsets( # noqa: D103 " Filters are ANDed together." " Results are returned in order from oldest to newest." ), - include_in_schema=False, # todo(mm, 2025-01-08): Include for v8.4.0. ) async def get_labware_offsets( # noqa: D103 store: Annotated[LabwareOffsetStore, fastapi.Depends(get_labware_offset_store)], @@ -211,7 +209,6 @@ async def get_labware_offsets( # noqa: D103 path="/labwareOffsets/{id}", summary="Delete a single labware offset", description="Delete a single labware offset. The deleted offset is returned.", - include_in_schema=False, # todo(mm, 2025-01-08): Include for v8.4.0. ) async def delete_labware_offset( # noqa: D103 store: Annotated[LabwareOffsetStore, fastapi.Depends(get_labware_offset_store)], @@ -234,7 +231,6 @@ async def delete_labware_offset( # noqa: D103 router.delete, path="/labwareOffsets", summary="Delete all labware offsets", - include_in_schema=False, # todo(mm, 2025-01-08): Include for v8.4.0. ) async def delete_all_labware_offsets( # noqa: D103 store: Annotated[LabwareOffsetStore, fastapi.Depends(get_labware_offset_store)], From 71bfaf647965a33ca011613f7a3deccd9ab44f1b Mon Sep 17 00:00:00 2001 From: Seth Foster Date: Thu, 6 Feb 2025 15:14:09 -0500 Subject: [PATCH 088/150] fix(shared-data): evotips v1 are schema 2 now (#17428) We had the evotips labware and adapter as schema 3 labware. This was probably necessary while this was a 3-element stack, but now it is not, and we need to avoid shipping schema 3 labware in 8.3 so that we retain the ability to change it. Closes EXEC-1179 ## review - seem fine? ## testing - smoke test. nothing checks schema identity, just whether data is there, and all the data that the code in 8.3 uses is still there. --- .../commands/test_evotip_dispense.py | 9 +- .../commands/test_evotip_seal_pipette.py | 10 +- .../commands/test_evotip_unseal_pipette.py | 10 +- shared-data/js/labware.ts | 5 +- .../2/evotips_flex_96_tiprack_adapter/1.json | 41 + .../2/evotips_opentrons_96_labware/1.json | 1054 +++++++++++++++++ .../{1.json => 2.json} | 2 +- .../{1.json => 2.json} | 4 +- 8 files changed, 1109 insertions(+), 26 deletions(-) create mode 100644 shared-data/labware/definitions/2/evotips_flex_96_tiprack_adapter/1.json create mode 100644 shared-data/labware/definitions/2/evotips_opentrons_96_labware/1.json rename shared-data/labware/definitions/3/evotips_flex_96_tiprack_adapter/{1.json => 2.json} (98%) rename shared-data/labware/definitions/3/evotips_opentrons_96_labware/{1.json => 2.json} (99%) diff --git a/api/tests/opentrons/protocol_engine/commands/test_evotip_dispense.py b/api/tests/opentrons/protocol_engine/commands/test_evotip_dispense.py index 568ddda83c1..f922caec41d 100644 --- a/api/tests/opentrons/protocol_engine/commands/test_evotip_dispense.py +++ b/api/tests/opentrons/protocol_engine/commands/test_evotip_dispense.py @@ -1,5 +1,4 @@ """Test evotip dispense in place commands.""" -import json import pytest from decoy import Decoy @@ -28,7 +27,7 @@ from opentrons.protocol_engine.state.state import StateView from opentrons.protocol_engine.state import update_types -from opentrons_shared_data import load_shared_data +from opentrons_shared_data.labware import load_definition @pytest.fixture @@ -36,11 +35,7 @@ def evotips_definition() -> LabwareDefinition: """A fixturee of the evotips definition.""" # TODO (chb 2025-01-29): When we migrate all labware to v3 we can clean this up return LabwareDefinition.model_validate( - json.loads( - load_shared_data( - "labware/definitions/3/evotips_opentrons_96_labware/1.json" - ) - ) + load_definition("evotips_opentrons_96_labware", 1) ) diff --git a/api/tests/opentrons/protocol_engine/commands/test_evotip_seal_pipette.py b/api/tests/opentrons/protocol_engine/commands/test_evotip_seal_pipette.py index fab36a81277..590156e6513 100644 --- a/api/tests/opentrons/protocol_engine/commands/test_evotip_seal_pipette.py +++ b/api/tests/opentrons/protocol_engine/commands/test_evotip_seal_pipette.py @@ -36,8 +36,8 @@ PipettingHandler, ) from opentrons.hardware_control import HardwareControlAPI -import json -from opentrons_shared_data import load_shared_data + +from opentrons_shared_data.labware import load_definition @pytest.fixture @@ -45,11 +45,7 @@ def evotips_definition() -> LabwareDefinition: """A fixturee of the evotips definition.""" # TODO (chb 2025-01-29): When we migrate all labware to v3 we can clean this up return LabwareDefinition.model_validate( - json.loads( - load_shared_data( - "labware/definitions/3/evotips_opentrons_96_labware/1.json" - ) - ) + load_definition("evotips_opentrons_96_labware", 1) ) diff --git a/api/tests/opentrons/protocol_engine/commands/test_evotip_unseal_pipette.py b/api/tests/opentrons/protocol_engine/commands/test_evotip_unseal_pipette.py index 5f1c94c3dd6..e1b0f24596c 100644 --- a/api/tests/opentrons/protocol_engine/commands/test_evotip_unseal_pipette.py +++ b/api/tests/opentrons/protocol_engine/commands/test_evotip_unseal_pipette.py @@ -27,8 +27,8 @@ from opentrons.protocol_engine.state.state import StateView from opentrons.protocol_engine.execution import MovementHandler, GantryMover, TipHandler from opentrons.protocols.models import LabwareDefinition -import json -from opentrons_shared_data import load_shared_data + +from opentrons_shared_data.labware import load_definition from opentrons.types import Point @@ -89,11 +89,7 @@ def evotips_definition() -> LabwareDefinition: """A fixturee of the evotips definition.""" # TODO (chb 2025-01-29): When we migrate all labware to v3 we can clean this up return LabwareDefinition.model_validate( - json.loads( - load_shared_data( - "labware/definitions/3/evotips_opentrons_96_labware/1.json" - ) - ) + load_definition("evotips_opentrons_96_labware", 1) ) diff --git a/shared-data/js/labware.ts b/shared-data/js/labware.ts index d404893bdee..8656cdd7ae0 100644 --- a/shared-data/js/labware.ts +++ b/shared-data/js/labware.ts @@ -121,8 +121,8 @@ import thermoscientificnunc96Wellplate2000UlV1Uncasted from '../labware/definiti import tipone96Tiprack200UlV1Uncasted from '../labware/definitions/2/tipone_96_tiprack_200ul/1.json' import usascientific12Reservoir22MlV1Uncasted from '../labware/definitions/2/usascientific_12_reservoir_22ml/1.json' import usascientific96Wellplate24MlDeepV1Uncasted from '../labware/definitions/2/usascientific_96_wellplate_2.4ml_deep/1.json' -import evotipsFlex96TiprackAdapterV1Uncasted from '../labware/definitions/3/evotips_flex_96_tiprack_adapter/1.json' -import evotipsOpentrons96LabwareV1Uncasted from '../labware/definitions/3/evotips_opentrons_96_labware/1.json' +import evotipsFlex96TiprackAdapterV1Uncasted from '../labware/definitions/2/evotips_flex_96_tiprack_adapter/1.json' +import evotipsOpentrons96LabwareV1Uncasted from '../labware/definitions/2/evotips_opentrons_96_labware/1.json' // v1 legacy labware definitions @@ -473,6 +473,7 @@ const latestDefs = { evotipsFlex96TiprackAdapterV1, evotipsOpentrons96LabwareV1, } + // labware definitions const getAllLabwareDefs = (): Record< keyof typeof latestDefs, diff --git a/shared-data/labware/definitions/2/evotips_flex_96_tiprack_adapter/1.json b/shared-data/labware/definitions/2/evotips_flex_96_tiprack_adapter/1.json new file mode 100644 index 00000000000..e9cf3d8966f --- /dev/null +++ b/shared-data/labware/definitions/2/evotips_flex_96_tiprack_adapter/1.json @@ -0,0 +1,41 @@ +{ + "ordering": [], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "metadata": { + "displayName": "Evotips adapter", + "displayCategory": "adapter", + "displayVolumeUnits": "\u00b5L", + "tags": [] + }, + "dimensions": { + "xDimension": 156.5, + "yDimension": 105, + "zDimension": 132 + }, + "wells": {}, + "groups": [ + { + "metadata": {}, + "wells": [] + } + ], + "parameters": { + "format": "96Standard", + "quirks": ["tiprackAdapterFor96Channel", "stackingMaxFive"], + "isTiprack": false, + "isMagneticModuleCompatible": false, + "loadName": "evotips_flex_96_tiprack_adapter" + }, + "namespace": "opentrons", + "version": 1, + "schemaVersion": 2, + "allowedRoles": ["adapter"], + "cornerOffsetFromSlot": { + "x": -14.25, + "y": -3.5, + "z": 0 + } +} diff --git a/shared-data/labware/definitions/2/evotips_opentrons_96_labware/1.json b/shared-data/labware/definitions/2/evotips_opentrons_96_labware/1.json new file mode 100644 index 00000000000..788e8eff8c4 --- /dev/null +++ b/shared-data/labware/definitions/2/evotips_opentrons_96_labware/1.json @@ -0,0 +1,1054 @@ +{ + "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": "opentrons", + "brandId": [] + }, + "metadata": { + "displayName": "Evotips", + "displayCategory": "wellPlate", + "displayVolumeUnits": "µL", + "tags": [] + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 86, + "zDimension": 55 + }, + "wells": { + "A1": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 14.08, + "y": 75.25, + "z": 1 + }, + "B1": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 14.08, + "y": 66.25, + "z": 1 + }, + "C1": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 14.08, + "y": 57.25, + "z": 1 + }, + "D1": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 14.08, + "y": 48.25, + "z": 1 + }, + "E1": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 14.08, + "y": 39.25, + "z": 1 + }, + "F1": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 14.08, + "y": 30.25, + "z": 1 + }, + "G1": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 14.08, + "y": 21.25, + "z": 1 + }, + "H1": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 14.08, + "y": 12.25, + "z": 1 + }, + "A2": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 23.08, + "y": 75.25, + "z": 1 + }, + "B2": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 23.08, + "y": 66.25, + "z": 1 + }, + "C2": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 23.08, + "y": 57.25, + "z": 1 + }, + "D2": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 23.08, + "y": 48.25, + "z": 1 + }, + "E2": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 23.08, + "y": 39.25, + "z": 1 + }, + "F2": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 23.08, + "y": 30.25, + "z": 1 + }, + "G2": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 23.08, + "y": 21.25, + "z": 1 + }, + "H2": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 23.08, + "y": 12.25, + "z": 1 + }, + "A3": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 32.08, + "y": 75.25, + "z": 1 + }, + "B3": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 32.08, + "y": 66.25, + "z": 1 + }, + "C3": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 32.08, + "y": 57.25, + "z": 1 + }, + "D3": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 32.08, + "y": 48.25, + "z": 1 + }, + "E3": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 32.08, + "y": 39.25, + "z": 1 + }, + "F3": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 32.08, + "y": 30.25, + "z": 1 + }, + "G3": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 32.08, + "y": 21.25, + "z": 1 + }, + "H3": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 32.08, + "y": 12.25, + "z": 1 + }, + "A4": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 41.08, + "y": 75.25, + "z": 1 + }, + "B4": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 41.08, + "y": 66.25, + "z": 1 + }, + "C4": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 41.08, + "y": 57.25, + "z": 1 + }, + "D4": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 41.08, + "y": 48.25, + "z": 1 + }, + "E4": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 41.08, + "y": 39.25, + "z": 1 + }, + "F4": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 41.08, + "y": 30.25, + "z": 1 + }, + "G4": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 41.08, + "y": 21.25, + "z": 1 + }, + "H4": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 41.08, + "y": 12.25, + "z": 1 + }, + "A5": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 50.08, + "y": 75.25, + "z": 1 + }, + "B5": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 50.08, + "y": 66.25, + "z": 1 + }, + "C5": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 50.08, + "y": 57.25, + "z": 1 + }, + "D5": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 50.08, + "y": 48.25, + "z": 1 + }, + "E5": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 50.08, + "y": 39.25, + "z": 1 + }, + "F5": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 50.08, + "y": 30.25, + "z": 1 + }, + "G5": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 50.08, + "y": 21.25, + "z": 1 + }, + "H5": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 50.08, + "y": 12.25, + "z": 1 + }, + "A6": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 59.08, + "y": 75.25, + "z": 1 + }, + "B6": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 59.08, + "y": 66.25, + "z": 1 + }, + "C6": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 59.08, + "y": 57.25, + "z": 1 + }, + "D6": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 59.08, + "y": 48.25, + "z": 1 + }, + "E6": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 59.08, + "y": 39.25, + "z": 1 + }, + "F6": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 59.08, + "y": 30.25, + "z": 1 + }, + "G6": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 59.08, + "y": 21.25, + "z": 1 + }, + "H6": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 59.08, + "y": 12.25, + "z": 1 + }, + "A7": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 68.08, + "y": 75.25, + "z": 1 + }, + "B7": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 68.08, + "y": 66.25, + "z": 1 + }, + "C7": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 68.08, + "y": 57.25, + "z": 1 + }, + "D7": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 68.08, + "y": 48.25, + "z": 1 + }, + "E7": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 68.08, + "y": 39.25, + "z": 1 + }, + "F7": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 68.08, + "y": 30.25, + "z": 1 + }, + "G7": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 68.08, + "y": 21.25, + "z": 1 + }, + "H7": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 68.08, + "y": 12.25, + "z": 1 + }, + "A8": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 77.08, + "y": 75.25, + "z": 1 + }, + "B8": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 77.08, + "y": 66.25, + "z": 1 + }, + "C8": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 77.08, + "y": 57.25, + "z": 1 + }, + "D8": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 77.08, + "y": 48.25, + "z": 1 + }, + "E8": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 77.08, + "y": 39.25, + "z": 1 + }, + "F8": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 77.08, + "y": 30.25, + "z": 1 + }, + "G8": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 77.08, + "y": 21.25, + "z": 1 + }, + "H8": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 77.08, + "y": 12.25, + "z": 1 + }, + "A9": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 86.08, + "y": 75.25, + "z": 1 + }, + "B9": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 86.08, + "y": 66.25, + "z": 1 + }, + "C9": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 86.08, + "y": 57.25, + "z": 1 + }, + "D9": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 86.08, + "y": 48.25, + "z": 1 + }, + "E9": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 86.08, + "y": 39.25, + "z": 1 + }, + "F9": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 86.08, + "y": 30.25, + "z": 1 + }, + "G9": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 86.08, + "y": 21.25, + "z": 1 + }, + "H9": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 86.08, + "y": 12.25, + "z": 1 + }, + "A10": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 95.08, + "y": 75.25, + "z": 1 + }, + "B10": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 95.08, + "y": 66.25, + "z": 1 + }, + "C10": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 95.08, + "y": 57.25, + "z": 1 + }, + "D10": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 95.08, + "y": 48.25, + "z": 1 + }, + "E10": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 95.08, + "y": 39.25, + "z": 1 + }, + "F10": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 95.08, + "y": 30.25, + "z": 1 + }, + "G10": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 95.08, + "y": 21.25, + "z": 1 + }, + "H10": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 95.08, + "y": 12.25, + "z": 1 + }, + "A11": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 104.08, + "y": 75.25, + "z": 1 + }, + "B11": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 104.08, + "y": 66.25, + "z": 1 + }, + "C11": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 104.08, + "y": 57.25, + "z": 1 + }, + "D11": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 104.08, + "y": 48.25, + "z": 1 + }, + "E11": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 104.08, + "y": 39.25, + "z": 1 + }, + "F11": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 104.08, + "y": 30.25, + "z": 1 + }, + "G11": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 104.08, + "y": 21.25, + "z": 1 + }, + "H11": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 104.08, + "y": 12.25, + "z": 1 + }, + "A12": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 113.08, + "y": 75.25, + "z": 1 + }, + "B12": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 113.08, + "y": 66.25, + "z": 1 + }, + "C12": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 113.08, + "y": 57.25, + "z": 1 + }, + "D12": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 113.08, + "y": 48.25, + "z": 1 + }, + "E12": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 113.08, + "y": 39.25, + "z": 1 + }, + "F12": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 113.08, + "y": 30.25, + "z": 1 + }, + "G12": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 113.08, + "y": 21.25, + "z": 1 + }, + "H12": { + "depth": 54, + "totalLiquidVolume": 1000, + "shape": "circular", + "diameter": 7, + "x": 113.08, + "y": 12.25, + "z": 1 + } + }, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "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": ["stackingOnly"], + "isTiprack": false, + "tipLength": 42.0, + "tipOverlap": 10.0, + "isMagneticModuleCompatible": false, + "loadName": "evotips_opentrons_96_labware" + }, + "namespace": "opentrons", + "allowedRoles": ["labware"], + "version": 1, + "stackLimit": 5, + "schemaVersion": 2, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "gripHeightFromLabwareBottom": 21.5, + "gripForce": 15, + "gripperOffsets": { + "default": { + "pickUpOffset": { + "x": 0, + "y": 0, + "z": 15 + }, + "dropOffset": { + "x": 0, + "y": 0, + "z": 15 + } + } + }, + "stackingOffsetWithLabware": { + "nest_96_wellplate_2ml_deep": { + "x": 0, + "y": 0, + "z": 22.5 + }, + "nest_1_reservoir_195ml": { + "x": 0, + "y": 0, + "z": 22.5 + }, + "evotips_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 76.78 + } + } +} diff --git a/shared-data/labware/definitions/3/evotips_flex_96_tiprack_adapter/1.json b/shared-data/labware/definitions/3/evotips_flex_96_tiprack_adapter/2.json similarity index 98% rename from shared-data/labware/definitions/3/evotips_flex_96_tiprack_adapter/1.json rename to shared-data/labware/definitions/3/evotips_flex_96_tiprack_adapter/2.json index 36125856ad3..16ec497e93b 100644 --- a/shared-data/labware/definitions/3/evotips_flex_96_tiprack_adapter/1.json +++ b/shared-data/labware/definitions/3/evotips_flex_96_tiprack_adapter/2.json @@ -30,7 +30,7 @@ "loadName": "evotips_flex_96_tiprack_adapter" }, "namespace": "opentrons", - "version": 1, + "version": 2, "schemaVersion": 3, "allowedRoles": ["adapter"], "cornerOffsetFromSlot": { diff --git a/shared-data/labware/definitions/3/evotips_opentrons_96_labware/1.json b/shared-data/labware/definitions/3/evotips_opentrons_96_labware/2.json similarity index 99% rename from shared-data/labware/definitions/3/evotips_opentrons_96_labware/1.json rename to shared-data/labware/definitions/3/evotips_opentrons_96_labware/2.json index d2ecbdce217..38716089fc0 100644 --- a/shared-data/labware/definitions/3/evotips_opentrons_96_labware/1.json +++ b/shared-data/labware/definitions/3/evotips_opentrons_96_labware/2.json @@ -26,7 +26,7 @@ "dimensions": { "xDimension": 127.75, "yDimension": 86, - "zDimension": 39.25 + "zDimension": 55 }, "wells": { "A1": { @@ -1010,7 +1010,7 @@ }, "namespace": "opentrons", "allowedRoles": ["labware"], - "version": 1, + "version": 2, "stackLimit": 5, "compatibleParentLabware": [ "nest_96_wellplate_2ml_deep", From 94bd0e94a66154e2a3eb1c59725a04dddef15cdf Mon Sep 17 00:00:00 2001 From: Sanniti Pimpley Date: Thu, 6 Feb 2025 15:16:13 -0500 Subject: [PATCH 089/150] docs(api): clarify in docs that Well.has_tip checks only for unused tips (#17412) Closes RQA-3790 # Overview `Well.has_tip` property has been checking for only clean/ unused tips since API v2.2 but the docstrings don't mention that. That has understandably caused some confusion in protocol behaviors. This PR helps mitigate that issue by clarifying the exact behavior of this property ## Risk assessment None. --------- Co-authored-by: Max Marrone --- api/src/opentrons/protocol_api/labware.py | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/api/src/opentrons/protocol_api/labware.py b/api/src/opentrons/protocol_api/labware.py index 57472641969..19a707867b7 100644 --- a/api/src/opentrons/protocol_api/labware.py +++ b/api/src/opentrons/protocol_api/labware.py @@ -117,8 +117,23 @@ def parent(self) -> Labware: @property @requires_version(2, 0) def has_tip(self) -> bool: - """Whether this well contains a tip. Always ``False`` if the parent labware - isn't a tip rack.""" + """Whether this well contains an unused tip. + + From API v2.2 on: + + - Returns ``False`` if: + + - the well has no tip present, or + - the well has a tip that's been used by the protocol previously + + - Returns ``True`` if the well has an unused tip. + + Before API v2.2: + + - Returns ``True`` as long as the well has a tip, even if it is used. + + Always ``False`` if the parent labware isn't a tip rack. + """ return self._core.has_tip() @has_tip.setter From 741382dbb1ecfb16065d4556b0f5234e7187e008 Mon Sep 17 00:00:00 2001 From: Jamey Huffnagle Date: Thu, 6 Feb 2025 15:57:50 -0500 Subject: [PATCH 090/150] fix(app): fix multi-location tip selection during error recovery (#17454) Closes RQA-3927 --- .../ErrorRecoveryFlows/shared/TipSelection.tsx | 1 + .../shared/__tests__/TipSelection.test.tsx | 1 + app/src/organisms/WellSelection/index.tsx | 17 +++++++++++++---- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/app/src/organisms/ErrorRecoveryFlows/shared/TipSelection.tsx b/app/src/organisms/ErrorRecoveryFlows/shared/TipSelection.tsx index f22c7fb268b..ba2b7ec35a5 100644 --- a/app/src/organisms/ErrorRecoveryFlows/shared/TipSelection.tsx +++ b/app/src/organisms/ErrorRecoveryFlows/shared/TipSelection.tsx @@ -37,6 +37,7 @@ export function TipSelection(props: TipSelectionProps): JSX.Element { relevantActiveNozzleLayout )} allowSelect={allowTipSelection} + allowMultiDrag={false} /> ) } diff --git a/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/TipSelection.test.tsx b/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/TipSelection.test.tsx index c6bee4f8d55..36f81c3ca35 100644 --- a/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/TipSelection.test.tsx +++ b/app/src/organisms/ErrorRecoveryFlows/shared/__tests__/TipSelection.test.tsx @@ -42,6 +42,7 @@ describe('TipSelection', () => { channels: props.failedPipetteUtils.failedPipetteInfo?.data.channels ?? 1, allowSelect: props.allowTipSelection, + allowMultiDrag: false, pipetteNozzleDetails: undefined, }), {} diff --git a/app/src/organisms/WellSelection/index.tsx b/app/src/organisms/WellSelection/index.tsx index 06daf9536a5..27949aa14e6 100644 --- a/app/src/organisms/WellSelection/index.tsx +++ b/app/src/organisms/WellSelection/index.tsx @@ -1,5 +1,6 @@ import { useState } from 'react' import reduce from 'lodash/reduce' +import pick from 'lodash/pick' import { COLORS, Labware, RobotCoordinateSpace } from '@opentrons/components' import { @@ -29,6 +30,8 @@ interface WellSelectionProps { pipetteNozzleDetails?: NozzleLayoutDetails /* Whether highlighting and selectWells() updates are permitted. */ allowSelect?: boolean + /* Whether selecting more than the channel count of well locations is permitted. */ + allowMultiDrag?: boolean } export function WellSelection(props: WellSelectionProps): JSX.Element { @@ -40,6 +43,7 @@ export function WellSelection(props: WellSelectionProps): JSX.Element { channels, pipetteNozzleDetails, allowSelect = true, + allowMultiDrag = true, } = props const [highlightedWells, setHighlightedWells] = useState({}) @@ -61,16 +65,21 @@ export function WellSelection(props: WellSelectionProps): JSX.Element { }) if (!wellSet) { return acc + } else if (allowMultiDrag) { + return { ...acc, [wellSet[0]]: null } + } else { + return { [wellSet[0]]: null } } - return { ...acc, [wellSet[0]]: null } }, {} ) return primaryWells + } else { + // single-channel or ingred selection mode + return allowMultiDrag + ? selectedWells + : pick(selectedWells, Object.keys(selectedWells)[0]) } - - // single-channel or ingred selection mode - return selectedWells } const _getWellsFromRect: (rect: GenericRect) => WellGroup = rect => { From 163a29762bf19b37a979efb4a1b6180481b0bb2f Mon Sep 17 00:00:00 2001 From: Sanniti Pimpley Date: Thu, 6 Feb 2025 16:17:13 -0500 Subject: [PATCH 091/150] docs(api): clarify in docs that Well.has_tip checks only for unused tips (#17455) Cherry-picked commit for 8.3.0 release branch Original PR: #17412 Closes RQA-3790 # Overview `Well.has_tip` property has been checking for only clean/ unused tips since API v2.2 but the docstrings don't mention that. That has understandably caused some confusion in protocol behaviors. This PR helps mitigate that issue by clarifying the exact behavior of this property ## Risk assessment None. Co-authored-by: Max Marrone --- api/src/opentrons/protocol_api/labware.py | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/api/src/opentrons/protocol_api/labware.py b/api/src/opentrons/protocol_api/labware.py index bb8a094e4c2..98ec5c7308d 100644 --- a/api/src/opentrons/protocol_api/labware.py +++ b/api/src/opentrons/protocol_api/labware.py @@ -115,8 +115,23 @@ def parent(self) -> Labware: @property @requires_version(2, 0) def has_tip(self) -> bool: - """Whether this well contains a tip. Always ``False`` if the parent labware - isn't a tip rack.""" + """Whether this well contains an unused tip. + + From API v2.2 on: + + - Returns ``False`` if: + + - the well has no tip present, or + - the well has a tip that's been used by the protocol previously + + - Returns ``True`` if the well has an unused tip. + + Before API v2.2: + + - Returns ``True`` as long as the well has a tip, even if it is used. + + Always ``False`` if the parent labware isn't a tip rack. + """ return self._core.has_tip() @has_tip.setter From db4640f8a266b282c8f274a70d575a3035ac2daa Mon Sep 17 00:00:00 2001 From: Jamey Huffnagle Date: Thu, 6 Feb 2025 17:08:10 -0500 Subject: [PATCH 092/150] feat(app): Implement LPC Redesign Header on ODD (#17449) Closes EXEC-1131 --- .../en/labware_position_check.json | 6 + .../LabwarePositionCheck/ExitConfirmation.tsx | 150 --------------- .../LPCContentContainer.tsx | 47 +++++ .../LabwarePositionCheck/LPCErrorModal.tsx | 95 +++++---- .../LPCProbeNotAttached.tsx | 37 ++++ .../LabwarePositionCheck/LPCRobotInMotion.tsx | 65 +++++++ .../LabwarePositionCheck/LPCWizardFlex.tsx | 89 ++++----- .../RobotMotionLoader.tsx | 54 ------ .../__fixtures__/mockLPCContentProps.ts | 10 + .../__tests__/LPCContentContainer.test.tsx | 59 ++++++ .../LabwarePositionCheck/__tests__/utils.ts | 7 + .../__tests__/useLPCHeaderCommands.test.tsx | 181 ++++++++++++++++++ .../hooks/useLPCCommands/index.ts | 6 +- ...ditionalCleanup.ts => useHandleCleanup.ts} | 31 +-- .../useLPCCommands/useHandleProbeCommands.ts | 14 +- .../useLPCCommands/useLPCHeaderCommands.ts | 76 ++++++++ .../hooks/useLPCInitialState/index.ts | 1 + .../steps/AttachProbe.tsx | 138 +++---------- .../steps/BeforeBeginning/index.tsx | 95 +++++---- .../steps/DetachProbe.tsx | 101 ++-------- .../steps/HandleLabware/index.tsx | 22 +++ .../steps/LPCComplete/index.tsx | 21 +- .../LabwarePositionCheck/types/content.ts | 14 +- .../organisms/ODD/ChildNavigation/index.tsx | 2 +- app/src/redux/protocol-runs/actions/lpc.ts | 14 +- .../protocol-runs/constants/lpc/actions.ts | 2 +- app/src/redux/protocol-runs/reducer/index.ts | 2 +- app/src/redux/protocol-runs/reducer/lpc.ts | 44 +++-- .../protocol-runs/selectors/lpc/steps.ts | 14 +- app/src/redux/protocol-runs/types/lpc.ts | 6 +- 30 files changed, 793 insertions(+), 610 deletions(-) delete mode 100644 app/src/organisms/LabwarePositionCheck/ExitConfirmation.tsx create mode 100644 app/src/organisms/LabwarePositionCheck/LPCContentContainer.tsx create mode 100644 app/src/organisms/LabwarePositionCheck/LPCProbeNotAttached.tsx create mode 100644 app/src/organisms/LabwarePositionCheck/LPCRobotInMotion.tsx delete mode 100644 app/src/organisms/LabwarePositionCheck/RobotMotionLoader.tsx create mode 100644 app/src/organisms/LabwarePositionCheck/__fixtures__/mockLPCContentProps.ts create mode 100644 app/src/organisms/LabwarePositionCheck/__tests__/LPCContentContainer.test.tsx create mode 100644 app/src/organisms/LabwarePositionCheck/__tests__/utils.ts create mode 100644 app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/__tests__/useLPCHeaderCommands.test.tsx rename app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/{useHandleConditionalCleanup.ts => useHandleCleanup.ts} (54%) create mode 100644 app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/useLPCHeaderCommands.ts diff --git a/app/src/assets/localization/en/labware_position_check.json b/app/src/assets/localization/en/labware_position_check.json index 7cdd8cce2d1..73f4263a4c5 100644 --- a/app/src/assets/localization/en/labware_position_check.json +++ b/app/src/assets/localization/en/labware_position_check.json @@ -23,13 +23,17 @@ "confirm_detached": "Confirm removal", "confirm_pick_up_tip_modal_title": "Did the pipette pick up a tip successfully?", "confirm_pick_up_tip_modal_try_again_text": "No, try again", + "confirm_placement": "Confirm placement", "confirm_position_and_move": "Confirm position, move to slot {{next_slot}}", "confirm_position_and_pick_up_tip": "Confirm position, pick up tip", "confirm_position_and_return_tip": "Confirm position, return tip to Slot {{next_slot}} and home", + "confirm_removal": "Confirm removal", + "continue": "Continue", "default_labware_offset": "Default Labware Offset", "detach_probe": "Remove calibration probe", "ensure_nozzle_position_desktop": "Ensure that the {{tip_type}} is centered above and level with {{item_location}}. If it isn't, use the controls below or your keyboard to jog the pipette until it is properly aligned.", "ensure_nozzle_position_odd": "Ensure that the {{tip_type}} is centered above and level with {{item_location}}. If it isn't, tap Move pipette and then jog the pipette until it is properly aligned.", + "exit": "Exit", "exit_screen_confirm_exit": "Exit and discard all labware offsets", "exit_screen_go_back": "Go back to labware position check", "exit_screen_subtitle": "If you exit now, all labware offsets will be discarded. This cannot be undone.", @@ -104,6 +108,7 @@ "robot_in_motion": "Stand back, robot is in motion.", "run": "Run", "run_labware_position_check": "run labware position check", + "save": "Save", "secondary_pipette_tipracks_section": "Check tip racks with {{secondary_mount}} Pipette", "see_how_offsets_work": "See how labware offsets work", "select_labware_from_list": "Select a labware from the list to check its stored offset data", @@ -115,6 +120,7 @@ "stored_offsets_for_this_protocol": "Stored Labware Offset data that applies to this protocol", "table_view": "Table View", "tip_rack": "tip rack", + "try_again": "Try again", "view_current_offsets": "view current offsets", "view_data": "View data", "what_is_labware_offset_data": "What is labware offset data?" diff --git a/app/src/organisms/LabwarePositionCheck/ExitConfirmation.tsx b/app/src/organisms/LabwarePositionCheck/ExitConfirmation.tsx deleted file mode 100644 index d5dbd072d04..00000000000 --- a/app/src/organisms/LabwarePositionCheck/ExitConfirmation.tsx +++ /dev/null @@ -1,150 +0,0 @@ -import styled, { css } from 'styled-components' -import { useTranslation } from 'react-i18next' -import { useSelector } from 'react-redux' - -import { - AlertPrimaryButton, - ALIGN_CENTER, - COLORS, - DIRECTION_COLUMN, - Flex, - Icon, - JUSTIFY_CENTER, - JUSTIFY_FLEX_END, - RESPONSIVENESS, - SecondaryButton, - SIZE_3, - SPACING, - LegacyStyledText, - TEXT_ALIGN_CENTER, - TYPOGRAPHY, -} from '@opentrons/components' - -import { SmallButton } from '/app/atoms/buttons' -import { getIsOnDevice } from '/app/redux/config' - -import type { LPCWizardContentProps } from '/app/organisms/LabwarePositionCheck/types' - -export function ExitConfirmation({ - commandUtils, -}: LPCWizardContentProps): JSX.Element { - const { i18n, t } = useTranslation(['labware_position_check', 'shared']) - const { confirmExitLPC, cancelExitLPC, toggleRobotMoving } = commandUtils - const isOnDevice = useSelector(getIsOnDevice) - - const handleConfirmExit = (): void => { - toggleRobotMoving(true).then(() => { - confirmExitLPC() - }) - } - - return ( - - - - {isOnDevice ? ( - <> - - {t('remove_probe_before_exit')} - - - - {t('exit_screen_subtitle')} - - - - ) : ( - <> - - {t('remove_probe_before_exit')} - - - {t('exit_screen_subtitle')} - - - )} - - {isOnDevice ? ( - - - - - ) : ( - - - - {t('shared:go_back')} - - - {t('remove_calibration_probe')} - - - - )} - - ) -} - -const CONTAINER_STYLE = css` - flex-direction: ${DIRECTION_COLUMN}; - padding: ${SPACING.spacing32}; - min-height: 29.5rem; -` - -const CONTENT_CONTAINER_STYLE = css` - flex: 1; - flex-direction: ${DIRECTION_COLUMN}; - justify-content: ${JUSTIFY_CENTER}; - align-items: ${ALIGN_CENTER}; - padding-left: ${SPACING.spacing32}; - padding-right: ${SPACING.spacing32}; -` - -const BUTTON_CONTAINER_STYLE = css` - width: 100%; - margin-top: ${SPACING.spacing32}; - justify-content: ${JUSTIFY_FLEX_END}; - align-items: ${ALIGN_CENTER}; -` - -const BUTTON_CONTAINER_STYLE_ODD = css` - width: 100%; - justify-content: ${JUSTIFY_FLEX_END}; - align-items: ${ALIGN_CENTER}; - grid-gap: ${SPACING.spacing8}; -` - -const ConfirmationHeader = styled.h1` - margin-top: ${SPACING.spacing24}; - ${TYPOGRAPHY.h1Default} - @media ${RESPONSIVENESS.touchscreenMediaQuerySpecs} { - ${TYPOGRAPHY.level4HeaderSemiBold} - } -` - -const ConfirmationHeaderODD = styled.h1` - margin-top: ${SPACING.spacing24}; - ${TYPOGRAPHY.level3HeaderBold} - @media ${RESPONSIVENESS.touchscreenMediaQuerySpecs} { - ${TYPOGRAPHY.level4HeaderSemiBold} - } -` - -const ConfirmationBodyODD = styled.h1` - ${TYPOGRAPHY.level4HeaderRegular} - @media ${RESPONSIVENESS.touchscreenMediaQuerySpecs} { - ${TYPOGRAPHY.level4HeaderRegular} - } - color: ${COLORS.grey60}; -` diff --git a/app/src/organisms/LabwarePositionCheck/LPCContentContainer.tsx b/app/src/organisms/LabwarePositionCheck/LPCContentContainer.tsx new file mode 100644 index 00000000000..aaf94add565 --- /dev/null +++ b/app/src/organisms/LabwarePositionCheck/LPCContentContainer.tsx @@ -0,0 +1,47 @@ +import { css } from 'styled-components' + +import { DIRECTION_COLUMN, Flex, SPACING } from '@opentrons/components' + +import { StepMeter } from '/app/atoms/StepMeter' +// TODO(jh, 02-05-25): Move ChildNavigation to molecules. +// eslint-disable-next-line opentrons/no-imports-across-applications +import { ChildNavigation } from '/app/organisms/ODD/ChildNavigation' +import { useSelector } from 'react-redux' +import { selectStepInfo } from '/app/redux/protocol-runs' + +// eslint-disable-next-line opentrons/no-imports-across-applications +import type { ChildNavigationProps } from '/app/organisms/ODD/ChildNavigation' +import type { LPCWizardContentProps } from '/app/organisms/LabwarePositionCheck/types' + +type LPCContentContainerProps = LPCWizardContentProps & + Partial & { + children: JSX.Element + header: string + } + +export function LPCContentContainer({ + children, + runId, + ...rest +}: LPCContentContainerProps): JSX.Element { + const { currentStepIndex, totalStepCount } = useSelector( + selectStepInfo(runId) + ) + + return ( + <> + + + {children} + + ) +} + +// TODO(jh, 02-05-25): Investigate whether we can remove the position: fixed styling from ChildNav. +const CHILD_NAV_STYLE = css` + top: ${SPACING.spacing8}; +` +const CHILDREN_CONTAINER_STYLE = css` + margin-top: 7.75rem; + flex-direction: ${DIRECTION_COLUMN}; +` diff --git a/app/src/organisms/LabwarePositionCheck/LPCErrorModal.tsx b/app/src/organisms/LabwarePositionCheck/LPCErrorModal.tsx index 88a3e2b01de..af3e81ad7ac 100644 --- a/app/src/organisms/LabwarePositionCheck/LPCErrorModal.tsx +++ b/app/src/organisms/LabwarePositionCheck/LPCErrorModal.tsx @@ -22,62 +22,61 @@ import { import { i18n } from '/app/i18n' import type { LPCWizardContentProps } from '/app/organisms/LabwarePositionCheck/types' +import { LPCContentContainer } from '/app/organisms/LabwarePositionCheck/LPCContentContainer' const SUPPORT_EMAIL = 'support@opentrons.com' -export function LPCErrorModal({ - commandUtils, - onCloseClick, -}: LPCWizardContentProps): JSX.Element { +export function LPCErrorModal(props: LPCWizardContentProps): JSX.Element { const { t } = useTranslation(['labware_position_check', 'shared', 'branded']) - const { errorMessage, toggleRobotMoving } = commandUtils - - const handleClose = (): void => { - void toggleRobotMoving(true).then(() => { - onCloseClick() - }) - } + const { errorMessage, headerCommands } = props.commandUtils return ( - - - - {i18n.format(t('shared:something_went_wrong'), 'sentenceCase')} - - - - {t('remove_probe_before_exit')} - - - {t('branded:help_us_improve_send_error_report', { - support_email: SUPPORT_EMAIL, - })} - - - - - {t('shared:exit')} - - + + + {i18n.format(t('shared:something_went_wrong'), 'sentenceCase')} + + + + {t('remove_probe_before_exit')} + + + {t('branded:help_us_improve_send_error_report', { + support_email: SUPPORT_EMAIL, + })} + + + + + {t('shared:exit')} + + + ) } diff --git a/app/src/organisms/LabwarePositionCheck/LPCProbeNotAttached.tsx b/app/src/organisms/LabwarePositionCheck/LPCProbeNotAttached.tsx new file mode 100644 index 00000000000..ac58206358e --- /dev/null +++ b/app/src/organisms/LabwarePositionCheck/LPCProbeNotAttached.tsx @@ -0,0 +1,37 @@ +import { useSelector } from 'react-redux' +import { useTranslation } from 'react-i18next' + +import { ProbeNotAttached } from '/app/organisms/PipetteWizardFlows/ProbeNotAttached' +import { getIsOnDevice } from '/app/redux/config' +import { LPCContentContainer } from '/app/organisms/LabwarePositionCheck/LPCContentContainer' + +import type { LPCWizardContentProps } from '/app/organisms/LabwarePositionCheck/types' + +// TODO(jh, 02-05-25): EXEC-1190. +export function LPCProbeNotAttached(props: LPCWizardContentProps): JSX.Element { + const { t } = useTranslation('labware_position_check') + const { commandUtils } = props + const { setShowUnableToDetect, headerCommands } = commandUtils + const isOnDevice = useSelector(getIsOnDevice) + + return ( + + null} + setShowUnableToDetect={setShowUnableToDetect} + isOnDevice={isOnDevice} + /> + + ) +} diff --git a/app/src/organisms/LabwarePositionCheck/LPCRobotInMotion.tsx b/app/src/organisms/LabwarePositionCheck/LPCRobotInMotion.tsx new file mode 100644 index 00000000000..d08b2f69005 --- /dev/null +++ b/app/src/organisms/LabwarePositionCheck/LPCRobotInMotion.tsx @@ -0,0 +1,65 @@ +import styled, { css } from 'styled-components' +import { + ALIGN_CENTER, + COLORS, + DIRECTION_COLUMN, + Flex, + Icon, + JUSTIFY_CENTER, + RESPONSIVENESS, + SIZE_4, + SPACING, + LegacyStyledText, + TYPOGRAPHY, +} from '@opentrons/components' + +import { LPCContentContainer } from '/app/organisms/LabwarePositionCheck/LPCContentContainer' + +import type { LPCWizardContentProps } from '/app/organisms/LabwarePositionCheck/types' +import { useTranslation } from 'react-i18next' + +interface RobotMotionLoaderProps extends LPCWizardContentProps { + header?: string + body?: string +} + +export function LPCRobotInMotion(props: RobotMotionLoaderProps): JSX.Element { + const { header, body } = props + const { t } = useTranslation('labware_position_check') + + return ( + + + + {header != null ? {header} : null} + {body != null ? ( + {body} + ) : null} + + + ) +} + +const LoadingText = styled.h1` + ${TYPOGRAPHY.h1Default} + + p { + text-transform: lowercase; + } + + p::first-letter { + text-transform: uppercase; + } + + @media ${RESPONSIVENESS.touchscreenMediaQuerySpecs} { + ${TYPOGRAPHY.level4HeaderSemiBold} + } +` + +const CONTAINER_STYLE = css` + flex-direction: ${DIRECTION_COLUMN}; + justify-content: ${JUSTIFY_CENTER}; + align-items: ${ALIGN_CENTER}; + min-height: 29.5rem; + grid-gap: ${SPACING.spacing24}; +` diff --git a/app/src/organisms/LabwarePositionCheck/LPCWizardFlex.tsx b/app/src/organisms/LabwarePositionCheck/LPCWizardFlex.tsx index 805b2071227..8d753023def 100644 --- a/app/src/organisms/LabwarePositionCheck/LPCWizardFlex.tsx +++ b/app/src/organisms/LabwarePositionCheck/LPCWizardFlex.tsx @@ -1,3 +1,4 @@ +import { useEffect } from 'react' import { createPortal } from 'react-dom' import { useTranslation } from 'react-i18next' import { useDispatch, useSelector } from 'react-redux' @@ -12,42 +13,43 @@ import { DetachProbe, LPCComplete, } from '/app/organisms/LabwarePositionCheck/steps' -import { ExitConfirmation } from './ExitConfirmation' -import { RobotMotionLoader } from './RobotMotionLoader' -import { WizardHeader } from '/app/molecules/WizardHeader' +import { LPCRobotInMotion } from './LPCRobotInMotion' import { LPCErrorModal } from './LPCErrorModal' +import { LPCProbeNotAttached } from './LPCProbeNotAttached' import { useLPCCommands, useLPCInitialState, } from '/app/organisms/LabwarePositionCheck/hooks' import { closeLPC, - proceedStep, + proceedStep as proceedStepDispatch, + goBackLastStep as goBackStepDispatch, LPC_STEP, selectCurrentStep, } from '/app/redux/protocol-runs' import { getIsOnDevice } from '/app/redux/config' +import { useLPCHeaderCommands } from '/app/organisms/LabwarePositionCheck/hooks/useLPCCommands/useLPCHeaderCommands' import type { LPCFlowsProps } from '/app/organisms/LabwarePositionCheck/LPCFlows' import type { LPCWizardContentProps } from '/app/organisms/LabwarePositionCheck/types' -import type { State } from '/app/redux/types' -import { useEffect } from 'react' +import type { LPCStep } from '/app/redux/protocol-runs' export interface LPCWizardFlexProps extends Omit {} export function LPCWizardFlex(props: LPCWizardFlexProps): JSX.Element { const { onCloseClick, ...rest } = props - const proceed = (): void => { - dispatch(proceedStep(props.runId)) + const proceedStep = (toStep?: LPCStep): void => { + dispatch(proceedStepDispatch(props.runId, toStep)) } - const onCloseClickDispatch = (): void => { - onCloseClick() + const goBackLastStep = (): void => { + dispatch(goBackStepDispatch(props.runId)) } + const dispatch = useDispatch() const LPCHandlerUtils = useLPCCommands({ ...props, - onCloseClick: onCloseClickDispatch, + onCloseClick, }) useLPCInitialState({ ...rest }) @@ -59,12 +61,19 @@ export function LPCWizardFlex(props: LPCWizardFlexProps): JSX.Element { } }, []) + const headerCommands = useLPCHeaderCommands({ + ...props, + LPCHandlerUtils, + proceedStep, + goBackLastStep, + }) + return ( ) } @@ -74,12 +83,11 @@ function LPCWizardFlexComponent(props: LPCWizardContentProps): JSX.Element { return isOnDevice ? ( <> - ) : ( createPortal( - }> + , getTopPortalEl() @@ -87,56 +95,25 @@ function LPCWizardFlexComponent(props: LPCWizardContentProps): JSX.Element { ) } -function LPCWizardHeader({ - runId, - commandUtils, -}: LPCWizardContentProps): JSX.Element { - const { t } = useTranslation('labware_position_check') - const { currentStepIndex, totalStepCount } = useSelector((state: State) => ({ - currentStepIndex: - state.protocolRuns[runId]?.lpc?.steps.currentStepIndex ?? 0, - totalStepCount: state.protocolRuns[runId]?.lpc?.steps.totalStepCount ?? 0, - })) - const { - errorMessage, - showExitConfirmation, - isExiting, - confirmExitLPC, - } = commandUtils - - // TODO(jh 01-15-24): Revisit the onExit conditions. Can we simplify? - return ( - - ) -} - function LPCWizardContent(props: LPCWizardContentProps): JSX.Element { const { t } = useTranslation('shared') const currentStep = useSelector(selectCurrentStep(props.runId)) - const { - isRobotMoving, - errorMessage, - showExitConfirmation, - } = props.commandUtils + const { isRobotMoving, errorMessage, unableToDetect } = props.commandUtils // Handle special cases that are shared by multiple steps first. if (isRobotMoving) { - return + return ( + + ) } if (errorMessage != null) { return } - if (showExitConfirmation) { - return + if (unableToDetect) { + return } if (currentStep == null) { console.error('LPC store not properly initialized.') diff --git a/app/src/organisms/LabwarePositionCheck/RobotMotionLoader.tsx b/app/src/organisms/LabwarePositionCheck/RobotMotionLoader.tsx deleted file mode 100644 index 5b83f147b8b..00000000000 --- a/app/src/organisms/LabwarePositionCheck/RobotMotionLoader.tsx +++ /dev/null @@ -1,54 +0,0 @@ -import styled, { css } from 'styled-components' -import { - ALIGN_CENTER, - COLORS, - DIRECTION_COLUMN, - Flex, - Icon, - JUSTIFY_CENTER, - RESPONSIVENESS, - SIZE_4, - SPACING, - LegacyStyledText, - TYPOGRAPHY, -} from '@opentrons/components' - -interface RobotMotionLoaderProps { - header?: string - body?: string -} - -export function RobotMotionLoader(props: RobotMotionLoaderProps): JSX.Element { - const { header, body } = props - return ( - - - {header != null ? {header} : null} - {body != null ? {body} : null} - - ) -} - -const LoadingText = styled.h1` - ${TYPOGRAPHY.h1Default} - - p { - text-transform: lowercase; - } - - p::first-letter { - text-transform: uppercase; - } - - @media ${RESPONSIVENESS.touchscreenMediaQuerySpecs} { - ${TYPOGRAPHY.level4HeaderSemiBold} - } -` - -const CONTAINER_STYLE = css` - flex-direction: ${DIRECTION_COLUMN}; - justify-content: ${JUSTIFY_CENTER}; - align-items: ${ALIGN_CENTER}; - min-height: 29.5rem; - grid-gap: ${SPACING.spacing24}; -` diff --git a/app/src/organisms/LabwarePositionCheck/__fixtures__/mockLPCContentProps.ts b/app/src/organisms/LabwarePositionCheck/__fixtures__/mockLPCContentProps.ts new file mode 100644 index 00000000000..80c1d49a23a --- /dev/null +++ b/app/src/organisms/LabwarePositionCheck/__fixtures__/mockLPCContentProps.ts @@ -0,0 +1,10 @@ +import { vi } from 'vitest' + +import type { LPCWizardContentProps } from '/app/organisms/LabwarePositionCheck/types' + +export const mockLPCContentProps: LPCWizardContentProps = { + runId: 'MOCK_RUN_ID', + commandUtils: {} as any, + proceedStep: vi.fn(), + goBackLastStep: vi.fn(), +} diff --git a/app/src/organisms/LabwarePositionCheck/__tests__/LPCContentContainer.test.tsx b/app/src/organisms/LabwarePositionCheck/__tests__/LPCContentContainer.test.tsx new file mode 100644 index 00000000000..e9596fabefc --- /dev/null +++ b/app/src/organisms/LabwarePositionCheck/__tests__/LPCContentContainer.test.tsx @@ -0,0 +1,59 @@ +import { describe, beforeEach, afterEach, it, vi } from 'vitest' +import { screen } from '@testing-library/react' +import { useSelector } from 'react-redux' +import { renderWithProviders } from '/app/__testing-utils__' +import { i18n } from '/app/i18n' +import { LPCContentContainer } from '/app/organisms/LabwarePositionCheck/LPCContentContainer' +// eslint-disable-next-line opentrons/no-imports-across-applications +import { ChildNavigation } from '/app/organisms/ODD/ChildNavigation' +import { StepMeter } from '/app/atoms/StepMeter' +import { mockLPCContentProps } from '/app/organisms/LabwarePositionCheck/__fixtures__/mockLPCContentProps' + +import type { ComponentProps } from 'react' + +vi.mock('react-redux', async importOriginal => { + const actual = await importOriginal() + return { + ...actual, + useSelector: vi.fn(), + } +}) +vi.mock('/app/organisms/ODD/ChildNavigation') +vi.mock('/app/atoms/StepMeter') + +const render = (props: ComponentProps) => { + return renderWithProviders(, { + i18nInstance: i18n, + })[0] +} + +describe('LPCContentContainer', () => { + let props: ComponentProps + + beforeEach(() => { + props = { + header: 'MOCK_HEADER', + ...mockLPCContentProps, + children:
MOCK_CHILDREN
, + } + + vi.mocked(ChildNavigation).mockReturnValue(
MOCK_CHILD_NAV
) + vi.mocked(StepMeter).mockReturnValue(
MOCK_STEP_METER
) + vi.mocked(useSelector).mockReturnValue({ + currentStepIndex: 1, + totalStepCount: 5, + }) + }) + + afterEach(() => { + vi.restoreAllMocks() + }) + + it('renders correct content and children', () => { + render(props) + + screen.getByText('MOCK_CHILDREN') + screen.getByText('MOCK_CHILD_NAV') + screen.getByText('MOCK_STEP_METER') + }) +}) diff --git a/app/src/organisms/LabwarePositionCheck/__tests__/utils.ts b/app/src/organisms/LabwarePositionCheck/__tests__/utils.ts new file mode 100644 index 00000000000..63fa87d046b --- /dev/null +++ b/app/src/organisms/LabwarePositionCheck/__tests__/utils.ts @@ -0,0 +1,7 @@ +import { screen, fireEvent } from '@testing-library/react' + +// TODO(jh, 02-06-25): Find a good place for testing utils. This is also used in Error Recovery. +export function clickButtonLabeled(label: string): void { + const buttons = screen.getAllByRole('button', { name: label }) + fireEvent.click(buttons[0]) +} diff --git a/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/__tests__/useLPCHeaderCommands.test.tsx b/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/__tests__/useLPCHeaderCommands.test.tsx new file mode 100644 index 00000000000..4e7915eb708 --- /dev/null +++ b/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/__tests__/useLPCHeaderCommands.test.tsx @@ -0,0 +1,181 @@ +import { describe, beforeEach, afterEach, it, vi, expect } from 'vitest' +import { renderHook, act, waitFor } from '@testing-library/react' +import { useSelector, Provider } from 'react-redux' +import { createStore } from 'redux' +import { I18nextProvider } from 'react-i18next' + +import { i18n } from '/app/i18n' +import { LPC_STEP } from '/app/redux/protocol-runs' +import { useLPCHeaderCommands } from '../useLPCHeaderCommands' + +import type { FunctionComponent, ReactNode } from 'react' +import type { UseLPCCommandsResult } from '/app/organisms/LabwarePositionCheck/hooks' +import type { UseLPCHeaderCommandsProps } from '../useLPCHeaderCommands' +import type { State } from '/app/redux/types' +import type { Store } from 'redux' + +vi.mock('react-redux', async importOriginal => { + const actual = await importOriginal() + return { + ...actual, + useSelector: vi.fn(), + } +}) + +let props: UseLPCHeaderCommandsProps +let mockLPCHandlerUtils: UseLPCCommandsResult +let wrapper: FunctionComponent<{ children: ReactNode }> +let store: Store +let toggleRobotMovingPromise: Promise +let handleStartLPCPromise: Promise +let handleProbeAttachmentPromise: Promise +let handleValidMoveToMaintenancePositionPromise: Promise +let handleCleanUpAndClosePromise: Promise + +describe('useLPCHeaderCommands', () => { + const mockPipette = { id: 'mock-pipette' } + const mockRunId = 'mock-run-id' + const mockProceedStep = vi.fn() + + beforeEach(() => { + toggleRobotMovingPromise = Promise.resolve() + handleStartLPCPromise = Promise.resolve() + handleProbeAttachmentPromise = Promise.resolve() + handleValidMoveToMaintenancePositionPromise = Promise.resolve() + handleCleanUpAndClosePromise = Promise.resolve() + + mockLPCHandlerUtils = { + toggleRobotMoving: vi.fn(() => toggleRobotMovingPromise), + handleStartLPC: vi.fn(() => handleStartLPCPromise), + handleProbeAttachment: vi.fn(() => handleProbeAttachmentPromise), + handleValidMoveToMaintenancePosition: vi.fn( + () => handleValidMoveToMaintenancePositionPromise + ), + handleCleanUpAndClose: vi.fn(() => handleCleanUpAndClosePromise), + } as any + + props = { + LPCHandlerUtils: mockLPCHandlerUtils, + proceedStep: mockProceedStep, + goBackLastStep: vi.fn(), + runId: mockRunId, + } + + store = createStore(vi.fn(), {}) + store.dispatch = vi.fn() + + wrapper = ({ children }) => ( + + {children} + + ) + + vi.mocked(useSelector).mockImplementation(() => { + return mockPipette + }) + }) + + afterEach(() => { + vi.clearAllMocks() + }) + + it('should execute handleProceed commands in correct sequence', async () => { + const { result } = renderHook(() => useLPCHeaderCommands(props), { + wrapper, + }) + + await act(async () => { + result.current.handleProceed() + }) + + await waitFor(() => { + expect(mockLPCHandlerUtils.toggleRobotMoving).toHaveBeenCalledWith(true) + }) + + await waitFor(() => { + expect(mockLPCHandlerUtils.handleStartLPC).toHaveBeenCalledWith( + mockPipette, + mockProceedStep + ) + }) + + await waitFor(() => { + expect(mockLPCHandlerUtils.toggleRobotMoving).toHaveBeenCalledWith(false) + }) + }) + + it('should execute handleAttachProbeCheck commands in correct sequence', async () => { + const { result } = renderHook(() => useLPCHeaderCommands(props), { + wrapper, + }) + + await act(async () => { + result.current.handleAttachProbeCheck() + }) + + await waitFor(() => { + expect(mockLPCHandlerUtils.toggleRobotMoving).toHaveBeenCalledWith(true) + }) + + await waitFor(() => { + expect(mockLPCHandlerUtils.handleProbeAttachment).toHaveBeenCalledWith( + mockPipette, + mockProceedStep + ) + }) + + await waitFor(() => { + expect(mockProceedStep).toHaveBeenCalled() + }) + + await waitFor(() => { + expect(mockLPCHandlerUtils.toggleRobotMoving).toHaveBeenCalledWith(false) + }) + }) + + it('should execute handleNavToDetachProbe commands in correct sequence', async () => { + const { result } = renderHook(() => useLPCHeaderCommands(props), { + wrapper, + }) + + await act(async () => { + result.current.handleNavToDetachProbe() + }) + + await waitFor(() => { + expect(mockLPCHandlerUtils.toggleRobotMoving).toHaveBeenCalledWith(true) + }) + + await waitFor(() => { + expect( + mockLPCHandlerUtils.handleValidMoveToMaintenancePosition + ).toHaveBeenCalledWith(mockPipette) + }) + + await waitFor(() => { + expect(mockProceedStep).toHaveBeenCalledWith(LPC_STEP.DETACH_PROBE) + }) + + await waitFor(() => { + expect(mockLPCHandlerUtils.toggleRobotMoving).toHaveBeenCalledWith(false) + }) + }) + + it('should execute handleClose commands in correct sequence', async () => { + const { result } = renderHook(() => useLPCHeaderCommands(props), { + wrapper, + }) + + await act(async () => { + result.current.handleClose() + }) + + await waitFor(() => { + expect(mockLPCHandlerUtils.toggleRobotMoving).toHaveBeenCalledWith(true) + }) + + await waitFor(() => { + expect(mockLPCHandlerUtils.handleCleanUpAndClose).toHaveBeenCalled() + }) + }) +}) diff --git a/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/index.ts b/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/index.ts index 606d25a7e45..b8c21262e3d 100644 --- a/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/index.ts +++ b/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/index.ts @@ -2,7 +2,7 @@ import { useState } from 'react' import { useApplyLPCOffsets } from './useApplyLPCOffsets' import { useHandleJog } from './useHandleJog' -import { useHandleConditionalCleanup } from './useHandleConditionalCleanup' +import { useHandleCleanup } from './useHandleCleanup' import { useChainMaintenanceCommands } from '/app/resources/maintenance_runs' import { useHandleProbeCommands } from './useHandleProbeCommands' import { useHandleStartLPC } from './useHandleStartLPC' @@ -16,7 +16,7 @@ import { useHandleValidMoveToMaintenancePosition } from './useHandleValidMoveToM import type { CreateCommand } from '@opentrons/shared-data' import type { CommandData } from '@opentrons/api-client' import type { UseProbeCommandsResult } from './useHandleProbeCommands' -import type { UseHandleConditionalCleanupResult } from './useHandleConditionalCleanup' +import type { UseHandleConditionalCleanupResult } from './useHandleCleanup' import type { UseHandleJogResult } from './useHandleJog' import type { UseApplyLPCOffsetsResult } from './useApplyLPCOffsets' import type { UseHandleStartLPCResult } from './useHandleStartLPC' @@ -76,7 +76,7 @@ export function useLPCCommands( const applyLPCOffsetsUtils = useApplyLPCOffsets({ ...props, setErrorMessage }) const buildLPCOffsets = useBuildOffsetsToApply({ ...props, setErrorMessage }) const handleJogUtils = useHandleJog({ ...props, setErrorMessage }) - const handleConditionalCleanupUtils = useHandleConditionalCleanup(props) + const handleConditionalCleanupUtils = useHandleCleanup(props) const handleProbeCommands = useHandleProbeCommands({ ...props, chainLPCCommands, diff --git a/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/useHandleConditionalCleanup.ts b/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/useHandleCleanup.ts similarity index 54% rename from app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/useHandleConditionalCleanup.ts rename to app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/useHandleCleanup.ts index 63af35de66e..787eae57f08 100644 --- a/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/useHandleConditionalCleanup.ts +++ b/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/useHandleCleanup.ts @@ -1,7 +1,4 @@ import { useState } from 'react' - -import { useConditionalConfirm } from '@opentrons/components' - import { useChainMaintenanceCommands } from '/app/resources/maintenance_runs' import { retractSafelyAndHomeCommands } from './commands' @@ -10,36 +7,28 @@ import type { CreateCommand } from '@opentrons/shared-data' export interface UseHandleConditionalCleanupResult { isExiting: boolean - showExitConfirmation: boolean - confirmExitLPC: () => void - cancelExitLPC: () => void + handleCleanUpAndClose: () => Promise } -export function useHandleConditionalCleanup({ +export function useHandleCleanup({ onCloseClick, maintenanceRunId, }: UseLPCCommandChildProps): UseHandleConditionalCleanupResult { const [isExiting, setIsExiting] = useState(false) - const { chainRunCommands } = useChainMaintenanceCommands() - const handleCleanUpAndClose = (): void => { + const handleCleanUpAndClose = (): Promise => { setIsExiting(true) - const cleanupCommands: CreateCommand[] = [...retractSafelyAndHomeCommands()] - void chainRunCommands(maintenanceRunId, cleanupCommands, true).finally( - () => { + return chainRunCommands(maintenanceRunId, cleanupCommands, true) + .then(() => { + onCloseClick() + }) + .catch(() => { onCloseClick() - } - ) + }) } - const { - confirm: confirmExitLPC, - showConfirmation: showExitConfirmation, - cancel: cancelExitLPC, - } = useConditionalConfirm(handleCleanUpAndClose, true) - - return { isExiting, confirmExitLPC, cancelExitLPC, showExitConfirmation } + return { isExiting, handleCleanUpAndClose } } diff --git a/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/useHandleProbeCommands.ts b/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/useHandleProbeCommands.ts index 9c3abf18996..d825747dc63 100644 --- a/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/useHandleProbeCommands.ts +++ b/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/useHandleProbeCommands.ts @@ -1,9 +1,11 @@ -import { useState } from 'react' +import { useState, useEffect } from 'react' +import { useSelector } from 'react-redux' import { retractPipetteAxesSequentiallyCommands, verifyProbeAttachmentAndHomeCommands, } from './commands' +import { LPC_STEP, selectCurrentStep } from '/app/redux/protocol-runs' import type { CreateCommand, LoadedPipette } from '@opentrons/shared-data' import type { UseLPCCommandWithChainRunChildProps } from './types' @@ -23,8 +25,18 @@ export interface UseProbeCommandsResult { export function useHandleProbeCommands({ chainLPCCommands, + runId, }: UseLPCCommandWithChainRunChildProps): UseProbeCommandsResult { const [showUnableToDetect, setShowUnableToDetect] = useState(false) + const currentStep = useSelector(selectCurrentStep(runId)) + + // We only care about probe detection on the "attach probe" step. When that + // step is not active, do not permit redirection to the "probe not attached" view. + useEffect(() => { + if (currentStep !== LPC_STEP.ATTACH_PROBE && showUnableToDetect) { + setShowUnableToDetect(false) + } + }, [currentStep, showUnableToDetect]) const handleProbeAttachment = ( pipette: LoadedPipette | null, diff --git a/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/useLPCHeaderCommands.ts b/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/useLPCHeaderCommands.ts new file mode 100644 index 00000000000..e4d6b90864f --- /dev/null +++ b/app/src/organisms/LabwarePositionCheck/hooks/useLPCCommands/useLPCHeaderCommands.ts @@ -0,0 +1,76 @@ +import { useSelector } from 'react-redux' + +import { LPC_STEP, selectActivePipette } from '/app/redux/protocol-runs' + +import type { LPCWizardContentProps } from '/app/organisms/LabwarePositionCheck/types' +import type { UseLPCCommandsResult } from '/app/organisms/LabwarePositionCheck/hooks' + +export type UseLPCHeaderCommandsProps = Omit< + LPCWizardContentProps, + 'commandUtils' +> & { + LPCHandlerUtils: UseLPCCommandsResult +} + +export interface UseLPCHeaderCommandsResult { + handleProceed: () => void + handleAttachProbeCheck: () => void + handleNavToDetachProbe: () => void + handleClose: () => void +} + +// Wraps core LPC command functionality, since the header component reuses many of the same commands. +export function useLPCHeaderCommands({ + LPCHandlerUtils, + proceedStep, + runId, +}: UseLPCHeaderCommandsProps): UseLPCHeaderCommandsResult { + const activePipette = useSelector(selectActivePipette(runId)) + const pipette = useSelector(selectActivePipette(runId)) + + const { + handleStartLPC, + toggleRobotMoving, + handleValidMoveToMaintenancePosition, + handleCleanUpAndClose, + handleProbeAttachment, + } = LPCHandlerUtils + + const handleProceed = (): void => { + void toggleRobotMoving(true) + .then(() => handleStartLPC(activePipette, proceedStep)) + .finally(() => toggleRobotMoving(false)) + } + + // If the maintenance run fails, we cannot move the gantry, so just clean up LPC. + const handleClose = (): void => { + void toggleRobotMoving(true).then(() => { + void handleCleanUpAndClose() + }) + } + + const handleAttachProbeCheck = (): void => { + void toggleRobotMoving(true) + .then(() => handleProbeAttachment(pipette, proceedStep)) + .then(() => { + proceedStep() + }) + .finally(() => toggleRobotMoving(false)) + } + + const handleNavToDetachProbe = (): void => { + void toggleRobotMoving(true) + .then(() => handleValidMoveToMaintenancePosition(pipette)) + .then(() => { + proceedStep(LPC_STEP.DETACH_PROBE) + }) + .finally(() => toggleRobotMoving(false)) + } + + return { + handleProceed, + handleAttachProbeCheck, + handleNavToDetachProbe, + handleClose, + } +} diff --git a/app/src/organisms/LabwarePositionCheck/hooks/useLPCInitialState/index.ts b/app/src/organisms/LabwarePositionCheck/hooks/useLPCInitialState/index.ts index 9362a9e8319..555ba37f0be 100644 --- a/app/src/organisms/LabwarePositionCheck/hooks/useLPCInitialState/index.ts +++ b/app/src/organisms/LabwarePositionCheck/hooks/useLPCInitialState/index.ts @@ -30,6 +30,7 @@ export function useLPCInitialState({ currentStepIndex: 0, totalStepCount: LPC_STEPS.length, all: LPC_STEPS, + lastStepIndices: null, }, } diff --git a/app/src/organisms/LabwarePositionCheck/steps/AttachProbe.tsx b/app/src/organisms/LabwarePositionCheck/steps/AttachProbe.tsx index da84e634b34..7ceac091428 100644 --- a/app/src/organisms/LabwarePositionCheck/steps/AttachProbe.tsx +++ b/app/src/organisms/LabwarePositionCheck/steps/AttachProbe.tsx @@ -1,120 +1,30 @@ -import { Trans, useTranslation } from 'react-i18next' -import styled from 'styled-components' -import { useSelector } from 'react-redux' +import { useTranslation } from 'react-i18next' -import { - RESPONSIVENESS, - SPACING, - LegacyStyledText, - TYPOGRAPHY, -} from '@opentrons/components' - -import { ProbeNotAttached } from '/app/organisms/PipetteWizardFlows/ProbeNotAttached' -import { GenericWizardTile } from '/app/molecules/GenericWizardTile' -import { - selectActivePipette, - selectActivePipetteChannelCount, -} from '/app/redux/protocol-runs' -import { getIsOnDevice } from '/app/redux/config' - -import attachProbe1 from '/app/assets/videos/pipette-wizard-flows/Pipette_Attach_Probe_1.webm' -import attachProbe8 from '/app/assets/videos/pipette-wizard-flows/Pipette_Attach_Probe_8.webm' -import attachProbe96 from '/app/assets/videos/pipette-wizard-flows/Pipette_Attach_Probe_96.webm' +import { LPCContentContainer } from '/app/organisms/LabwarePositionCheck/LPCContentContainer' import type { LPCWizardContentProps } from '/app/organisms/LabwarePositionCheck/types' -const StyledVideo = styled.video` - padding-top: ${SPACING.spacing4}; - width: 100%; - min-height: 18rem; -` - -const StyledBody = styled(LegacyStyledText)` - ${TYPOGRAPHY.pRegular}; - - @media ${RESPONSIVENESS.touchscreenMediaQuerySpecs} { - font-size: 1.275rem; - line-height: 1.75rem; - } -` - -export function AttachProbe({ - runId, - proceed, - commandUtils, -}: LPCWizardContentProps): JSX.Element { - const { t, i18n } = useTranslation(['labware_position_check', 'shared']) - const isOnDevice = useSelector(getIsOnDevice) - const pipette = useSelector(selectActivePipette(runId)) +export function AttachProbe(props: LPCWizardContentProps): JSX.Element { const { - handleProbeAttachment, - toggleRobotMoving, - setShowUnableToDetect, - unableToDetect, - } = commandUtils - const channels = useSelector(selectActivePipetteChannelCount(runId)) - - const { probeLocation, probeVideoSrc } = ((): { - probeLocation: string - probeVideoSrc: string - } => { - switch (channels) { - case 1: - return { probeLocation: '', probeVideoSrc: attachProbe1 } - case 8: - return { probeLocation: t('backmost'), probeVideoSrc: attachProbe8 } - case 96: - return { - probeLocation: t('ninety_six_probe_location'), - probeVideoSrc: attachProbe96, - } - } - })() - - const handleProbeCheck = (): void => { - void toggleRobotMoving(true) - .then(() => handleProbeAttachment(pipette, proceed)) - .finally(() => toggleRobotMoving(false)) - } - - const handleProceed = (): void => { - void toggleRobotMoving(true) - .then(() => handleProbeAttachment(pipette, proceed)) - .finally(() => toggleRobotMoving(false)) - } - - if (unableToDetect) { - return ( - - ) - } else { - return ( - - - - } - bodyText={ - - , - }} - /> - - } - proceedButtonText={i18n.format(t('shared:continue'), 'capitalize')} - proceed={handleProceed} - /> - ) - } + handleAttachProbeCheck, + handleNavToDetachProbe, + } = props.commandUtils.headerCommands + const { t } = useTranslation('labware_position_check') + + return ( + +
PLACEHOLDER ATTACH PROBE
+
+ ) } diff --git a/app/src/organisms/LabwarePositionCheck/steps/BeforeBeginning/index.tsx b/app/src/organisms/LabwarePositionCheck/steps/BeforeBeginning/index.tsx index cfda3476d6b..40540e9c56d 100644 --- a/app/src/organisms/LabwarePositionCheck/steps/BeforeBeginning/index.tsx +++ b/app/src/organisms/LabwarePositionCheck/steps/BeforeBeginning/index.tsx @@ -18,6 +18,7 @@ import { selectActivePipette, selectLabwareOffsetsForAllLw, } from '/app/redux/protocol-runs' +import { LPCContentContainer } from '/app/organisms/LabwarePositionCheck/LPCContentContainer' import type { State } from '/app/redux/types' import type { LPCWizardContentProps } from '/app/organisms/LabwarePositionCheck/types' @@ -25,19 +26,16 @@ import type { LPCWizardContentProps } from '/app/organisms/LabwarePositionCheck/ // TODO(BC, 09/01/23): replace updated support article link for LPC on OT-2/Flex const SUPPORT_PAGE_URL = 'https://support.opentrons.com/s/ot2-calibration' -export function BeforeBeginning({ - runId, - proceed, - commandUtils, -}: LPCWizardContentProps): JSX.Element { +export function BeforeBeginning(props: LPCWizardContentProps): JSX.Element { const { t, i18n } = useTranslation(['labware_position_check', 'shared']) + const { runId, proceedStep, commandUtils } = props const isOnDevice = useSelector(getIsOnDevice) const activePipette = useSelector(selectActivePipette(runId)) const existingOffsets = useSelector(selectLabwareOffsetsForAllLw(runId)) const { protocolName, labwareDefs } = useSelector( (state: State) => state.protocolRuns[runId]?.lpc ) ?? { protocolName: '', labwareDefs: [] } - const { handleStartLPC, toggleRobotMoving } = commandUtils + const { handleStartLPC, toggleRobotMoving, headerCommands } = commandUtils const requiredEquipmentList = [ { @@ -52,45 +50,58 @@ export function BeforeBeginning({ const handleProceed = (): void => { void toggleRobotMoving(true) - .then(() => handleStartLPC(activePipette, proceed)) + .then(() => handleStartLPC(activePipette, proceedStep)) .finally(() => toggleRobotMoving(false)) } return ( - }} - /> - } - rightElement={ - - } - footer={ - - {isOnDevice ? ( - - ) : ( - - )} - {isOnDevice ? ( - - ) : ( - - {i18n.format(t('shared:get_started'), 'capitalize')} - - )} - - } - /> + + }} + /> + } + rightElement={ + + } + footer={ + + {isOnDevice ? ( + + ) : ( + + )} + {isOnDevice ? ( + + ) : ( + + {i18n.format(t('shared:get_started'), 'capitalize')} + + )} + + } + /> + ) } diff --git a/app/src/organisms/LabwarePositionCheck/steps/DetachProbe.tsx b/app/src/organisms/LabwarePositionCheck/steps/DetachProbe.tsx index d6261151e7a..88838d6ccae 100644 --- a/app/src/organisms/LabwarePositionCheck/steps/DetachProbe.tsx +++ b/app/src/organisms/LabwarePositionCheck/steps/DetachProbe.tsx @@ -1,95 +1,24 @@ -import { useEffect } from 'react' import { useTranslation } from 'react-i18next' -import styled from 'styled-components' -import { useSelector } from 'react-redux' -import { - LegacyStyledText, - RESPONSIVENESS, - SPACING, - TYPOGRAPHY, -} from '@opentrons/components' - -import { GenericWizardTile } from '/app/molecules/GenericWizardTile' -import { - selectActivePipette, - selectActivePipetteChannelCount, -} from '/app/redux/protocol-runs' - -import detachProbe1 from '/app/assets/videos/pipette-wizard-flows/Pipette_Detach_Probe_1.webm' -import detachProbe8 from '/app/assets/videos/pipette-wizard-flows/Pipette_Detach_Probe_8.webm' -import detachProbe96 from '/app/assets/videos/pipette-wizard-flows/Pipette_Detach_Probe_96.webm' +import { LPCContentContainer } from '/app/organisms/LabwarePositionCheck/LPCContentContainer' import type { LPCWizardContentProps } from '/app/organisms/LabwarePositionCheck/types' -const StyledVideo = styled.video` - padding-top: ${SPACING.spacing4}; - width: 100%; - min-height: 18rem; -` - -const StyledBody = styled(LegacyStyledText)` - ${TYPOGRAPHY.pRegular}; - - @media ${RESPONSIVENESS.touchscreenMediaQuerySpecs} { - font-size: 1.275rem; - line-height: 1.75rem; - } -` - -export const DetachProbe = ({ - runId, - proceed, - commandUtils, -}: LPCWizardContentProps): JSX.Element => { - const { t, i18n } = useTranslation(['labware_position_check', 'shared']) - const { - handleProbeDetachment, - toggleRobotMoving, - handleValidMoveToMaintenancePosition, - } = commandUtils - const pipette = useSelector(selectActivePipette(runId)) - const channels = useSelector(selectActivePipetteChannelCount(runId)) - - // TODO(jh, 01-30-25): This will break the flows, but currently, DetachProbe is inaccessible. - // This onClick behavior should be tied directly to the "exit" button. - useEffect(() => { - void toggleRobotMoving(true) - .then(() => handleValidMoveToMaintenancePosition(pipette)) - .finally(() => toggleRobotMoving(false)) - }, []) - - const probeVideoSrc = ((): string => { - switch (channels) { - case 1: - return detachProbe1 - case 8: - return detachProbe8 - case 96: - return detachProbe96 - } - })() - - const handleProceed = (): void => { - void toggleRobotMoving(true) - .then(() => handleProbeDetachment(pipette, proceed)) - .finally(() => toggleRobotMoving(false)) - } +export function DetachProbe(props: LPCWizardContentProps): JSX.Element { + const { proceedStep, goBackLastStep } = props + const { t } = useTranslation('labware_position_check') return ( - - - - } - bodyText={ - {i18n.format(t('remove_probe'), 'capitalize')} - } - proceedButtonText={t('confirm_detached')} - proceed={handleProceed} - /> + { + proceedStep() + }} + onClickBack={goBackLastStep} + > +
PLACEHOLDER DETACH PROBE
+
) } diff --git a/app/src/organisms/LabwarePositionCheck/steps/HandleLabware/index.tsx b/app/src/organisms/LabwarePositionCheck/steps/HandleLabware/index.tsx index e168b19df09..df324cbcfe1 100644 --- a/app/src/organisms/LabwarePositionCheck/steps/HandleLabware/index.tsx +++ b/app/src/organisms/LabwarePositionCheck/steps/HandleLabware/index.tsx @@ -1,4 +1,5 @@ import { useSelector } from 'react-redux' +import { useTranslation } from 'react-i18next' import { selectSelectedLabwareFlowType, @@ -7,18 +8,39 @@ import { import { CheckItem } from './CheckItem' import { LPCLabwareList } from './LPCLabwareList' import { LPCLabwareDetails } from './LPCLabwareDetails' +import { LPCContentContainer } from '/app/organisms/LabwarePositionCheck/LPCContentContainer' import type { LPCWizardContentProps } from '/app/organisms/LabwarePositionCheck/types' export function HandleLabware(props: LPCWizardContentProps): JSX.Element { + const { t } = useTranslation('labware_position_check') + + // TODO(jh, 02-05-25): EXEC-1119. Use header overrides for the substeps. + return ( + + + + ) +} + +function HandleLabwareContent(props: LPCWizardContentProps): JSX.Element { const selectedLw = useSelector(selectSelectedLabwareInfo(props.runId)) const offsetFlowType = useSelector(selectSelectedLabwareFlowType(props.runId)) + // These routes are one step, since the progress bar remains static during the core LPC flow. if (selectedLw == null) { + // The general labware list view. return } else if (selectedLw.offsetLocationDetails == null) { + // The offset view for a singular labware geometry. return } else { + // The core flow for updating an offset for a singular labware geometry. switch (offsetFlowType) { case 'default': return diff --git a/app/src/organisms/LabwarePositionCheck/steps/LPCComplete/index.tsx b/app/src/organisms/LabwarePositionCheck/steps/LPCComplete/index.tsx index f40e117dba0..18bc52bc680 100644 --- a/app/src/organisms/LabwarePositionCheck/steps/LPCComplete/index.tsx +++ b/app/src/organisms/LabwarePositionCheck/steps/LPCComplete/index.tsx @@ -1,13 +1,20 @@ -import { useEffect } from 'react' +import { useTranslation } from 'react-i18next' + +import { LPCContentContainer } from '/app/organisms/LabwarePositionCheck/LPCContentContainer' import type { LPCWizardContentProps } from '/app/organisms/LabwarePositionCheck/types' export function LPCComplete(props: LPCWizardContentProps): JSX.Element { - useEffect(() => { - setTimeout(() => { - props.onCloseClick() - }, 5000) - }, []) + const { t } = useTranslation('labware_position_check') - return <>LPC COMPLETE + return ( + +
PLACEHOLDER LPC COMPLETE
+
+ ) } diff --git a/app/src/organisms/LabwarePositionCheck/types/content.ts b/app/src/organisms/LabwarePositionCheck/types/content.ts index d32b02191bb..7dd7ec301dc 100644 --- a/app/src/organisms/LabwarePositionCheck/types/content.ts +++ b/app/src/organisms/LabwarePositionCheck/types/content.ts @@ -1,10 +1,12 @@ import type { UseLPCCommandsResult } from '/app/organisms/LabwarePositionCheck/hooks' import type { LPCWizardFlexProps } from '/app/organisms/LabwarePositionCheck/LPCWizardFlex' +import type { LPCStep } from '/app/redux/protocol-runs' +import type { UseLPCHeaderCommandsResult } from '/app/organisms/LabwarePositionCheck/hooks/useLPCCommands/useLPCHeaderCommands' -export type LPCWizardContentProps = Pick< - LPCWizardFlexProps, - 'onCloseClick' | 'runId' -> & { - proceed: () => void - commandUtils: UseLPCCommandsResult +export type LPCWizardContentProps = Pick & { + proceedStep: (toStep?: LPCStep) => void + goBackLastStep: () => void + commandUtils: UseLPCCommandsResult & { + headerCommands: UseLPCHeaderCommandsResult + } } diff --git a/app/src/organisms/ODD/ChildNavigation/index.tsx b/app/src/organisms/ODD/ChildNavigation/index.tsx index ff1ebed1c95..0376b4ffa21 100644 --- a/app/src/organisms/ODD/ChildNavigation/index.tsx +++ b/app/src/organisms/ODD/ChildNavigation/index.tsx @@ -28,7 +28,7 @@ import type { SmallButtonTypes, } from '/app/atoms/buttons/SmallButton' -interface ChildNavigationProps extends StyleProps { +export interface ChildNavigationProps extends StyleProps { header: string onClickBack?: MouseEventHandler buttonText?: ReactNode diff --git a/app/src/redux/protocol-runs/actions/lpc.ts b/app/src/redux/protocol-runs/actions/lpc.ts index d5a90ec07b5..ba54e6cf1a0 100644 --- a/app/src/redux/protocol-runs/actions/lpc.ts +++ b/app/src/redux/protocol-runs/actions/lpc.ts @@ -4,7 +4,7 @@ import { SET_FINAL_POSITION, START_LPC, FINISH_LPC, - GO_BACK_STEP, + GO_BACK_LAST_STEP, SET_SELECTED_LABWARE, CLEAR_SELECTED_LABWARE, SET_SELECTED_LABWARE_NAME, @@ -25,15 +25,19 @@ import type { SelectedLabwareNameAction, OffsetLocationDetails, ApplyOffsetAction, + LPCStep, } from '../types' -export const proceedStep = (runId: string): ProceedStepAction => ({ +export const proceedStep = ( + runId: string, + toStep?: LPCStep +): ProceedStepAction => ({ type: PROCEED_STEP, - payload: { runId }, + payload: { runId, toStep }, }) -export const goBackStep = (runId: string): GoBackStepAction => ({ - type: GO_BACK_STEP, +export const goBackLastStep = (runId: string): GoBackStepAction => ({ + type: GO_BACK_LAST_STEP, payload: { runId }, }) diff --git a/app/src/redux/protocol-runs/constants/lpc/actions.ts b/app/src/redux/protocol-runs/constants/lpc/actions.ts index 6fd006a9759..7c3849d0fba 100644 --- a/app/src/redux/protocol-runs/constants/lpc/actions.ts +++ b/app/src/redux/protocol-runs/constants/lpc/actions.ts @@ -1,7 +1,7 @@ export const START_LPC = 'START_LPC' export const FINISH_LPC = 'FINISH_LPC' export const PROCEED_STEP = 'PROCEED_STEP' -export const GO_BACK_STEP = 'GO_BACK_STEP' +export const GO_BACK_LAST_STEP = 'GO_BACK_LAST_STEP' export const SET_SELECTED_LABWARE_NAME = 'SET_SELECTED_LABWARE_NAME' export const SET_SELECTED_LABWARE = 'SET_SELECTED_LABWARE' export const CLEAR_SELECTED_LABWARE = 'CLEAR_SELECTED_LABWARE' diff --git a/app/src/redux/protocol-runs/reducer/index.ts b/app/src/redux/protocol-runs/reducer/index.ts index 6626b30bc0b..22c5a7ad74e 100644 --- a/app/src/redux/protocol-runs/reducer/index.ts +++ b/app/src/redux/protocol-runs/reducer/index.ts @@ -32,7 +32,7 @@ export const protocolRunReducer: Reducer = ( case Constants.START_LPC: case Constants.FINISH_LPC: case Constants.PROCEED_STEP: - case Constants.GO_BACK_STEP: + case Constants.GO_BACK_LAST_STEP: case Constants.SET_SELECTED_LABWARE_NAME: case Constants.SET_SELECTED_LABWARE: case Constants.CLEAR_SELECTED_LABWARE: diff --git a/app/src/redux/protocol-runs/reducer/lpc.ts b/app/src/redux/protocol-runs/reducer/lpc.ts index 60c766b7295..73df299c2ae 100644 --- a/app/src/redux/protocol-runs/reducer/lpc.ts +++ b/app/src/redux/protocol-runs/reducer/lpc.ts @@ -5,10 +5,11 @@ import { SET_FINAL_POSITION, FINISH_LPC, START_LPC, - GO_BACK_STEP, + GO_BACK_LAST_STEP, SET_SELECTED_LABWARE_NAME, CLEAR_SELECTED_LABWARE, APPLY_OFFSET, + LPC_STEPS, } from '../constants' import { updateOffsetsForURI } from './transforms' @@ -31,30 +32,51 @@ export function LPCReducer( } else { switch (action.type) { case PROCEED_STEP: { - const { currentStepIndex, totalStepCount } = state.steps - const newStepIdx = - currentStepIndex + 1 < totalStepCount - ? currentStepIndex + 1 - : currentStepIndex + const { + currentStepIndex, + lastStepIndices, + totalStepCount, + } = state.steps + const { toStep } = action.payload + + const newStepIdx = (): number => { + if (toStep == null) { + return currentStepIndex + 1 < totalStepCount + ? currentStepIndex + 1 + : currentStepIndex + } else { + const newIdx = LPC_STEPS.findIndex(step => step === toStep) + + if (newIdx === -1) { + console.error(`Unexpected routing to step: ${toStep}`) + return 0 + } else { + return newIdx + } + } + } return { ...state, steps: { ...state.steps, - currentStepIndex: newStepIdx, + currentStepIndex: newStepIdx(), + lastStepIndices: [...(lastStepIndices ?? []), currentStepIndex], }, } } - case GO_BACK_STEP: { - const { currentStepIndex } = state.steps - const newStepIdx = currentStepIndex > 0 ? currentStepIndex - 1 : 0 + case GO_BACK_LAST_STEP: { + const { lastStepIndices } = state.steps + const lastStep = lastStepIndices?.[lastStepIndices.length - 1] ?? 0 return { ...state, steps: { ...state.steps, - currentStepIndex: newStepIdx, + currentStepIndex: lastStep, + lastStepIndices: + lastStepIndices?.slice(0, lastStepIndices.length - 1) ?? null, }, } } diff --git a/app/src/redux/protocol-runs/selectors/lpc/steps.ts b/app/src/redux/protocol-runs/selectors/lpc/steps.ts index a4d34160140..c8d524a0dd3 100644 --- a/app/src/redux/protocol-runs/selectors/lpc/steps.ts +++ b/app/src/redux/protocol-runs/selectors/lpc/steps.ts @@ -4,7 +4,7 @@ import { LPC_STEP } from '/app/redux/protocol-runs' import type { Selector } from 'reselect' import type { State } from '../../../types' -import type { LPCStep } from '/app/redux/protocol-runs' +import type { LPCStep, StepInfo } from '/app/redux/protocol-runs' export const selectCurrentStep = (runId: string): Selector => createSelector( @@ -13,3 +13,15 @@ export const selectCurrentStep = (runId: string): Selector => (currentIdx, allSteps) => allSteps?.[currentIdx ?? 0] ?? LPC_STEP.BEFORE_BEGINNING ) + +export const selectStepInfo = (runId: string): Selector => + createSelector( + (state: State) => state.protocolRuns[runId]?.lpc?.steps, + stepInfo => + stepInfo ?? { + currentStepIndex: 0, + totalStepCount: 0, + all: [], + lastStepIndices: null, + } + ) diff --git a/app/src/redux/protocol-runs/types/lpc.ts b/app/src/redux/protocol-runs/types/lpc.ts index 843ae3e8aaf..9cc6f713a72 100644 --- a/app/src/redux/protocol-runs/types/lpc.ts +++ b/app/src/redux/protocol-runs/types/lpc.ts @@ -19,6 +19,8 @@ export interface StepInfo { currentStepIndex: number totalStepCount: number all: LPCStep[] + /* The last step idx in the user's routing history - not necessarily the previous step idx. */ + lastStepIndices: number[] | null } export interface ExistingOffset { @@ -111,11 +113,11 @@ export interface FinishLPCAction { export interface ProceedStepAction { type: 'PROCEED_STEP' - payload: { runId: string } + payload: { runId: string; toStep?: LPCStep } } export interface GoBackStepAction { - type: 'GO_BACK_STEP' + type: 'GO_BACK_LAST_STEP' payload: { runId: string } } From 193993ff71815a0b79647502aa187f9cb9e72cab Mon Sep 17 00:00:00 2001 From: Andy Sigler Date: Fri, 7 Feb 2025 09:39:17 -0500 Subject: [PATCH 093/150] chore(hardware-testing): Pipette assembly QC script uses default OT3API.liquid_probe() settings (#17462) --- .../pipette_assembly_qc_ot3/__main__.py | 51 +------------------ 1 file changed, 1 insertion(+), 50 deletions(-) diff --git a/hardware-testing/hardware_testing/production_qc/pipette_assembly_qc_ot3/__main__.py b/hardware-testing/hardware_testing/production_qc/pipette_assembly_qc_ot3/__main__.py index 6be7cc92fab..8f276919610 100644 --- a/hardware-testing/hardware_testing/production_qc/pipette_assembly_qc_ot3/__main__.py +++ b/hardware-testing/hardware_testing/production_qc/pipette_assembly_qc_ot3/__main__.py @@ -18,7 +18,6 @@ from opentrons_hardware.firmware_bindings.messages.messages import MessageDefinition from opentrons_hardware.firmware_bindings.constants import SensorType, SensorId -from opentrons.config.types import LiquidProbeSettings from opentrons.hardware_control.types import ( TipStateType, FailedTipStateCheck, @@ -1324,41 +1323,6 @@ async def _test_tip_presence_flag( return pick_up_result and drop_result and wiggle_passed -@dataclass -class _LiqProbeCfg: - mount_speed: float - plunger_speed: float - sensor_threshold_pascals: float - - -PROBE_SETTINGS: Dict[int, Dict[int, _LiqProbeCfg]] = { - 50: { - 50: _LiqProbeCfg( - mount_speed=11, - plunger_speed=21, - sensor_threshold_pascals=150, - ), - }, - 1000: { - 50: _LiqProbeCfg( - mount_speed=5, - plunger_speed=10, - sensor_threshold_pascals=200, - ), - 200: _LiqProbeCfg( - mount_speed=5, - plunger_speed=10, - sensor_threshold_pascals=200, - ), - 1000: _LiqProbeCfg( - mount_speed=5, - plunger_speed=11, - sensor_threshold_pascals=150, - ), - }, -} - - async def _test_liquid_probe( api: OT3API, mount: OT3Mount, @@ -1368,7 +1332,6 @@ async def _test_liquid_probe( ) -> Dict[InstrumentProbeType, List[float]]: pip = api.hardware_pipettes[mount.to_mount()] assert pip - pip_vol = int(pip.working_volume) trial_results: Dict[InstrumentProbeType, List[float]] = { probe: [] for probe in probes } @@ -1383,20 +1346,8 @@ async def _test_liquid_probe( await _pick_up_tip_for_tip_volume(api, mount, tip_volume) for probe in probes: await _move_to_above_plate_liquid(api, mount, probe, height_mm=hover_mm) - probe_cfg = PROBE_SETTINGS[pip_vol][tip_volume] - probe_settings = LiquidProbeSettings( - mount_speed=probe_cfg.mount_speed, - plunger_speed=probe_cfg.plunger_speed, - plunger_impulse_time=0.2, - sensor_threshold_pascals=probe_cfg.sensor_threshold_pascals, - aspirate_while_sensing=False, - z_overlap_between_passes_mm=0.1, - plunger_reset_offset=2.0, - samples_for_baselining=20, - sample_time_sec=0.004, - ) end_z = await api.liquid_probe( - mount, max_z_distance_machine_coords, probe_settings, probe=probe + mount, max_z_distance_machine_coords, probe=probe ) if probe == InstrumentProbeType.PRIMARY: pz = CALIBRATED_LABWARE_LOCATIONS.plate_primary.z From f0ec5e5352488bfd37cab1806482d680d9aa0942 Mon Sep 17 00:00:00 2001 From: Sarah Breen Date: Fri, 7 Feb 2025 10:25:59 -0500 Subject: [PATCH 094/150] chore(shared-data,app): Block evotips labware from PD, LL, and Quick Transfer (#17460) --- app/src/organisms/ODD/QuickTransferFlow/constants.ts | 3 --- .../utils/getCompatibleLabwareByCategory.ts | 7 +++++-- shared-data/js/getLabware.ts | 6 ++++++ 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/app/src/organisms/ODD/QuickTransferFlow/constants.ts b/app/src/organisms/ODD/QuickTransferFlow/constants.ts index 5aa6aa3b60d..dd1b18cda43 100644 --- a/app/src/organisms/ODD/QuickTransferFlow/constants.ts +++ b/app/src/organisms/ODD/QuickTransferFlow/constants.ts @@ -100,7 +100,6 @@ export const SINGLE_CHANNEL_COMPATIBLE_LABWARE = [ 'opentrons/thermoscientificnunc_96_wellplate_2000ul/1', 'opentrons/usascientific_12_reservoir_22ml/1', 'opentrons/usascientific_96_wellplate_2.4ml_deep/1', - 'opentrons/evotips_opentrons_96_labware/1', ] export const EIGHT_CHANNEL_COMPATIBLE_LABWARE = [ @@ -145,7 +144,6 @@ export const EIGHT_CHANNEL_COMPATIBLE_LABWARE = [ 'opentrons/thermoscientificnunc_96_wellplate_2000ul/1', 'opentrons/usascientific_12_reservoir_22ml/1', 'opentrons/usascientific_96_wellplate_2.4ml_deep/1', - 'opentrons/evotips_opentrons_96_labware/1', ] export const NINETY_SIX_CHANNEL_COMPATIBLE_LABWARE = [ @@ -190,5 +188,4 @@ export const NINETY_SIX_CHANNEL_COMPATIBLE_LABWARE = [ 'opentrons/thermoscientificnunc_96_wellplate_2000ul/1', 'opentrons/usascientific_12_reservoir_22ml/1', 'opentrons/usascientific_96_wellplate_2.4ml_deep/1', - 'opentrons/evotips_opentrons_96_labware/1', ] diff --git a/app/src/organisms/ODD/QuickTransferFlow/utils/getCompatibleLabwareByCategory.ts b/app/src/organisms/ODD/QuickTransferFlow/utils/getCompatibleLabwareByCategory.ts index cb52a095a33..dd0c0ff7182 100644 --- a/app/src/organisms/ODD/QuickTransferFlow/utils/getCompatibleLabwareByCategory.ts +++ b/app/src/organisms/ODD/QuickTransferFlow/utils/getCompatibleLabwareByCategory.ts @@ -1,4 +1,7 @@ -import { getAllDefinitions } from '@opentrons/shared-data' +import { + getAllDefinitions, + LABWAREV2_DO_NOT_LIST, +} from '@opentrons/shared-data' import { SINGLE_CHANNEL_COMPATIBLE_LABWARE, EIGHT_CHANNEL_COMPATIBLE_LABWARE, @@ -12,7 +15,7 @@ export function getCompatibleLabwareByCategory( pipetteChannels: 1 | 8 | 96, category: LabwareFilter ): LabwareDefinition2[] | undefined { - const allLabwareDefinitions = getAllDefinitions() + const allLabwareDefinitions = getAllDefinitions(LABWAREV2_DO_NOT_LIST) let compatibleLabwareUris: string[] = SINGLE_CHANNEL_COMPATIBLE_LABWARE if (pipetteChannels === 8) { compatibleLabwareUris = EIGHT_CHANNEL_COMPATIBLE_LABWARE diff --git a/shared-data/js/getLabware.ts b/shared-data/js/getLabware.ts index 41949e01d9a..a6a42801639 100644 --- a/shared-data/js/getLabware.ts +++ b/shared-data/js/getLabware.ts @@ -44,6 +44,9 @@ export const LABWAREV2_DO_NOT_LIST = [ 'opentrons_ot3_96_tiprack_1000ul', 'opentrons_ot3_96_tiprack_50ul', 'opentrons_flex_lid_absorbance_plate_reader_module', + // temporarily blocking evotips until it is out of beta + 'evotips_flex_96_tiprack_adapter', + 'evotips_opentrons_96_labware', ] // NOTE(sa, 2020-7-14): in PD we do not want to list calibration blocks // or the adapter/labware combos since we migrated to splitting them up @@ -60,6 +63,9 @@ export const PD_DO_NOT_LIST = [ // temporarily blocking TC lid adapter and deck riser until it is supported in PD 'opentrons_tough_pcr_auto_sealing_lid', 'opentrons_flex_deck_riser', + // temporarily blocking evotips until it is supported in PD + 'evotips_flex_96_tiprack_adapter', + 'evotips_opentrons_96_labware', ] export function getIsLabwareV1Tiprack(def: LabwareDefinition1): boolean { From 08d9dd24e0151b6285bd425377d53fcf24a466d0 Mon Sep 17 00:00:00 2001 From: Ryan Howard Date: Fri, 7 Feb 2025 12:01:17 -0500 Subject: [PATCH 095/150] fix(hardware): correct duration calculation from the change in z-raise post LLD success (#17434) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit …as still raising too far out of the well # Overview We had updated the distance that the z raises after an LLD success but did not update the duration calculation so the z was still raising too far out of the liquid. ## Test Plan and Hands on Testing ## Changelog ## Review requests ## Risk assessment --- .../hardware_control/tool_sensors.py | 2 +- .../hardware_control/test_tool_sensors.py | 17 +++++++++++++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/hardware/opentrons_hardware/hardware_control/tool_sensors.py b/hardware/opentrons_hardware/hardware_control/tool_sensors.py index 9df634f11b1..e0e82f1e0f8 100644 --- a/hardware/opentrons_hardware/hardware_control/tool_sensors.py +++ b/hardware/opentrons_hardware/hardware_control/tool_sensors.py @@ -337,7 +337,7 @@ async def liquid_probe( distance={head_node: float64(z_offset_for_plunger_prep)}, velocity={head_node: float64(-1 * mount_speed)}, acceleration={}, - duration=float64(max_z_distance / mount_speed), + duration=float64(z_offset_for_plunger_prep / mount_speed), present_nodes=[head_node], ) diff --git a/hardware/tests/opentrons_hardware/hardware_control/test_tool_sensors.py b/hardware/tests/opentrons_hardware/hardware_control/test_tool_sensors.py index ebcfcc5f05a..b5c73c4bd34 100644 --- a/hardware/tests/opentrons_hardware/hardware_control/test_tool_sensors.py +++ b/hardware/tests/opentrons_hardware/hardware_control/test_tool_sensors.py @@ -10,6 +10,7 @@ ReadFromSensorResponse, Acknowledgement, BindSensorOutputRequest, + AddLinearMoveRequest, ) from opentrons_hardware.firmware_bindings.messages import MessageDefinition from opentrons_hardware.firmware_bindings.messages.payloads import ( @@ -49,6 +50,7 @@ SensorThresholdMode, SensorOutputBinding, ) +from opentrons_hardware.hardware_control.constants import interrupts_per_sec from opentrons_hardware.sensors.scheduler import SensorScheduler from opentrons_hardware.sensors.sensor_driver import SensorDriver from opentrons_hardware.sensors.types import SensorDataType @@ -214,6 +216,11 @@ def get_responder() -> Iterator[ yield check_third_move responder_getter = get_responder() + z_offset_for_plunger_prep = 2.0 + mount_speed = 10.0 + expected_raise_duration = ( + interrupts_per_sec * z_offset_for_plunger_prep / mount_speed + ) def move_responder( node_id: NodeId, message: MessageDefinition @@ -223,6 +230,12 @@ def move_responder( responder = next(responder_getter) return responder(node_id, message) else: + if isinstance(message, AddLinearMoveRequest): + if message.payload.velocity_mm.value < 0: + # value < 0 means the raise z move + assert message.payload.duration.value == expected_raise_duration + velocity = int(-1 * mount_speed / interrupts_per_sec * 2**31) + assert message.payload.velocity_mm.value == velocity return [] message_send_loopback.add_responder(move_responder) @@ -232,12 +245,12 @@ def move_responder( tool=target_node, head_node=motor_node, max_p_distance=70, - mount_speed=10, + mount_speed=mount_speed, plunger_speed=8, threshold_pascals=threshold_pascals, plunger_impulse_time=0.2, num_baseline_reads=20, - z_offset_for_plunger_prep=2.0, + z_offset_for_plunger_prep=z_offset_for_plunger_prep, sensor_id=SensorId.S0, ) assert position[motor_node].positions_only()[0] == 14 From 18865c522378593599e6be83d1048f37aedd2521 Mon Sep 17 00:00:00 2001 From: koji Date: Fri, 7 Feb 2025 12:15:29 -0500 Subject: [PATCH 096/150] =?UTF-8?q?chore:=20=F0=9F=A4=96=20update=20ubuntu?= =?UTF-8?q?=20version=20(#17461)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: update ubuntu version --- .github/workflows/api-test-lint-deploy.yaml | 4 ++-- .github/workflows/docs-build.yaml | 2 +- .github/workflows/g-code-confirm-tests.yaml | 2 +- .github/workflows/g-code-testing-lint-test.yaml | 2 +- .github/workflows/http-docs-build.yaml | 2 +- .../opentrons-ai-client-staging-continuous-deploy.yaml | 6 +++--- .github/workflows/opentrons-ai-production-deploy.yaml | 4 ++-- .github/workflows/robot-server-lint-test.yaml | 2 +- .github/workflows/server-utils-lint-test.yaml | 4 ++-- .github/workflows/shared-data-test-lint-deploy.yaml | 6 +++--- .github/workflows/system-server-lint-test.yaml | 4 ++-- .github/workflows/tag-releases.yaml | 2 +- .github/workflows/update-server-lint-test.yaml | 4 ++-- 13 files changed, 22 insertions(+), 22 deletions(-) diff --git a/.github/workflows/api-test-lint-deploy.yaml b/.github/workflows/api-test-lint-deploy.yaml index e1790f28f20..29565dc6019 100644 --- a/.github/workflows/api-test-lint-deploy.yaml +++ b/.github/workflows/api-test-lint-deploy.yaml @@ -49,7 +49,7 @@ jobs: lint: name: 'opentrons package linting' timeout-minutes: 10 - runs-on: 'ubuntu-22.04' + runs-on: 'ubuntu-24.04' steps: - uses: 'actions/checkout@v4' with: @@ -183,7 +183,7 @@ jobs: deploy: name: 'deploy opentrons package' needs: [test] - runs-on: 'ubuntu-22.04' + runs-on: 'ubuntu-24.04' if: github.event_name == 'push' steps: - uses: 'actions/checkout@v4' diff --git a/.github/workflows/docs-build.yaml b/.github/workflows/docs-build.yaml index 6a4f49f0d20..eb8de2eda84 100644 --- a/.github/workflows/docs-build.yaml +++ b/.github/workflows/docs-build.yaml @@ -38,7 +38,7 @@ defaults: jobs: build: name: opentrons documentation build - runs-on: 'ubuntu-22.04' + runs-on: 'ubuntu-24.04' steps: - uses: 'actions/checkout@v4' with: diff --git a/.github/workflows/g-code-confirm-tests.yaml b/.github/workflows/g-code-confirm-tests.yaml index 9c43bfe16d8..cb2795fdbe2 100644 --- a/.github/workflows/g-code-confirm-tests.yaml +++ b/.github/workflows/g-code-confirm-tests.yaml @@ -33,7 +33,7 @@ jobs: matrix: command: ['2-modules', 'swift-smoke', 'swift-turbo', 'omega', 'fast'] name: 'Confirm G-Code (${{ matrix.command }})' - runs-on: 'ubuntu-22.04' + runs-on: 'ubuntu-24.04' steps: - uses: 'actions/checkout@v4' with: diff --git a/.github/workflows/g-code-testing-lint-test.yaml b/.github/workflows/g-code-testing-lint-test.yaml index 9da53b78182..65b1f75a8f3 100644 --- a/.github/workflows/g-code-testing-lint-test.yaml +++ b/.github/workflows/g-code-testing-lint-test.yaml @@ -40,7 +40,7 @@ defaults: jobs: lint-test: name: 'g-code-testing package linting and tests' - runs-on: 'ubuntu-22.04' + runs-on: 'ubuntu-24.04' steps: - uses: 'actions/checkout@v4' with: diff --git a/.github/workflows/http-docs-build.yaml b/.github/workflows/http-docs-build.yaml index f2c21368d5e..a0ed3b17925 100644 --- a/.github/workflows/http-docs-build.yaml +++ b/.github/workflows/http-docs-build.yaml @@ -38,7 +38,7 @@ defaults: jobs: build: name: HTTP API reference build - runs-on: 'ubuntu-22.04' + runs-on: 'ubuntu-24.04' steps: - uses: 'actions/checkout@v4' with: diff --git a/.github/workflows/opentrons-ai-client-staging-continuous-deploy.yaml b/.github/workflows/opentrons-ai-client-staging-continuous-deploy.yaml index 88c7c70d3ec..a596fe64fdf 100644 --- a/.github/workflows/opentrons-ai-client-staging-continuous-deploy.yaml +++ b/.github/workflows/opentrons-ai-client-staging-continuous-deploy.yaml @@ -16,7 +16,7 @@ env: jobs: js-unit-test: - runs-on: 'ubuntu-22.04' + runs-on: 'ubuntu-24.04' permissions: id-token: write contents: read @@ -53,8 +53,8 @@ jobs: make setup-js - name: 'build' env: - # inject dev id since this is for staging - OT_AI_CLIENT_MIXPANEL_ID: ${{ secrets.OT_AI_CLIENT_MIXPANEL_DEV_ID }} + # inject dev id since this is for staging + OT_AI_CLIENT_MIXPANEL_ID: ${{ secrets.OT_AI_CLIENT_MIXPANEL_DEV_ID }} run: | make -C opentrons-ai-client build-staging - name: Configure AWS Credentials diff --git a/.github/workflows/opentrons-ai-production-deploy.yaml b/.github/workflows/opentrons-ai-production-deploy.yaml index 1850400bbd0..c131c8c5d2c 100644 --- a/.github/workflows/opentrons-ai-production-deploy.yaml +++ b/.github/workflows/opentrons-ai-production-deploy.yaml @@ -16,7 +16,7 @@ jobs: concurrency: group: ${{ github.workflow }}-ai-client@ cancel-in-progress: true - runs-on: 'ubuntu-22.04' + runs-on: 'ubuntu-24.04' permissions: id-token: write contents: read @@ -53,7 +53,7 @@ jobs: make setup-js - name: 'build' env: - OT_AI_CLIENT_MIXPANEL_ID: ${{ secrets.OT_AI_CLIENT_MIXPANEL_ID }} + OT_AI_CLIENT_MIXPANEL_ID: ${{ secrets.OT_AI_CLIENT_MIXPANEL_ID }} run: | make -C opentrons-ai-client build-production - name: Configure AWS Credentials diff --git a/.github/workflows/robot-server-lint-test.yaml b/.github/workflows/robot-server-lint-test.yaml index 6735ab36136..f72caf7ecc7 100644 --- a/.github/workflows/robot-server-lint-test.yaml +++ b/.github/workflows/robot-server-lint-test.yaml @@ -51,7 +51,7 @@ jobs: lint-test: name: 'robot server package linting and tests' timeout-minutes: 40 - runs-on: 'ubuntu-22.04' + runs-on: 'ubuntu-24.04' strategy: matrix: with-ot-hardware: ['true', 'false'] diff --git a/.github/workflows/server-utils-lint-test.yaml b/.github/workflows/server-utils-lint-test.yaml index 9c8f37b6c79..1119061b0eb 100644 --- a/.github/workflows/server-utils-lint-test.yaml +++ b/.github/workflows/server-utils-lint-test.yaml @@ -39,7 +39,7 @@ jobs: lint: name: 'server-utils linting' timeout-minutes: 10 - runs-on: 'ubuntu-22.04' + runs-on: 'ubuntu-24.04' steps: - uses: 'actions/checkout@v4' with: @@ -60,7 +60,7 @@ jobs: name: 'server-utils package tests' timeout-minutes: 10 needs: [lint] - runs-on: 'ubuntu-22.04' + runs-on: 'ubuntu-24.04' steps: - uses: 'actions/checkout@v4' with: diff --git a/.github/workflows/shared-data-test-lint-deploy.yaml b/.github/workflows/shared-data-test-lint-deploy.yaml index c5858d5da0e..c334a398b54 100644 --- a/.github/workflows/shared-data-test-lint-deploy.yaml +++ b/.github/workflows/shared-data-test-lint-deploy.yaml @@ -44,7 +44,7 @@ jobs: python-lint: name: 'shared-data package python lint' timeout-minutes: 10 - runs-on: 'ubuntu-22.04' + runs-on: 'ubuntu-24.04' steps: - uses: 'actions/checkout@v4' with: @@ -112,7 +112,7 @@ jobs: js-test: name: 'shared-data JS tests' - runs-on: 'ubuntu-22.04' + runs-on: 'ubuntu-24.04' timeout-minutes: 30 steps: - uses: 'actions/checkout@v4' @@ -149,7 +149,7 @@ jobs: python-deploy: name: 'shared-data package deploy' needs: [python-test] - runs-on: 'ubuntu-22.04' + runs-on: 'ubuntu-24.04' if: github.event_name == 'push' steps: - uses: 'actions/checkout@v4' diff --git a/.github/workflows/system-server-lint-test.yaml b/.github/workflows/system-server-lint-test.yaml index ffd526c6834..eb7c18fe41f 100644 --- a/.github/workflows/system-server-lint-test.yaml +++ b/.github/workflows/system-server-lint-test.yaml @@ -41,7 +41,7 @@ jobs: lint: name: 'system-server linting' timeout-minutes: 10 - runs-on: 'ubuntu-22.04' + runs-on: 'ubuntu-24.04' steps: - uses: 'actions/checkout@v4' with: @@ -62,7 +62,7 @@ jobs: name: 'system-server package tests' timeout-minutes: 10 needs: [lint] - runs-on: 'ubuntu-22.04' + runs-on: 'ubuntu-24.04' steps: - uses: 'actions/checkout@v4' with: diff --git a/.github/workflows/tag-releases.yaml b/.github/workflows/tag-releases.yaml index 1f8c3ee153a..0547ee4555c 100644 --- a/.github/workflows/tag-releases.yaml +++ b/.github/workflows/tag-releases.yaml @@ -10,7 +10,7 @@ on: jobs: create-release: - runs-on: 'ubuntu-22.04' + runs-on: 'ubuntu-24.04' name: 'Create changelogs and release' steps: # this could be improved by replacing this checkout with something like diff --git a/.github/workflows/update-server-lint-test.yaml b/.github/workflows/update-server-lint-test.yaml index 1d3164a63cf..bc80dcd38b5 100644 --- a/.github/workflows/update-server-lint-test.yaml +++ b/.github/workflows/update-server-lint-test.yaml @@ -39,7 +39,7 @@ jobs: lint: name: 'update server linting' timeout-minutes: 10 - runs-on: 'ubuntu-22.04' + runs-on: 'ubuntu-24.04' steps: - uses: 'actions/checkout@v4' with: @@ -60,7 +60,7 @@ jobs: name: 'update server package tests' timeout-minutes: 10 needs: [lint] - runs-on: 'ubuntu-22.04' + runs-on: 'ubuntu-24.04' steps: - uses: 'actions/checkout@v4' with: From f8a5436bc151536f4bb6a99f265459f1d76f507f Mon Sep 17 00:00:00 2001 From: David Chau <46395074+ddcc4@users.noreply.github.com> Date: Fri, 7 Feb 2025 15:23:34 -0500 Subject: [PATCH 097/150] feat(protocol-designer): start wiring up "Export Python" button to generate Python (#17453) # Overview Make the "Export Python" button start generating the skeleton of a Python protocol file. This just generates the `metadata` section right now. AUTH-1091 AUTH-1393 AUTH-1385 I tried to follow the structure of the existing `createFile()` function. Eventually, the `createPythonFile()` function is just going to replace `createFile()`, so that's why I'm reusing the existing `SAVE_PROTOCOL_FILE` action rather than defining a bunch of new Python-specific constants and interfaces. ## Test Plan and Hands on Testing Added unit tests for both the top-level file creator, and for the specific metadata fields. I also tested the button in my browser. ## Risk assessment Low. This is all hidden behind a feature flag, and doesn't interact with any existing functionality. --- .../file-data/__tests__/createFile.test.ts | 28 ++++++++++++++++- .../file-data/__tests__/pythonFile.test.ts | 31 +++++++++++++++++++ .../src/file-data/selectors/fileCreator.ts | 16 ++++++++++ .../src/file-data/selectors/pythonFile.ts | 31 +++++++++++++++++++ protocol-designer/src/load-file/actions.ts | 22 ++++++++++++- protocol-designer/src/load-file/utils.ts | 6 ++++ .../src/pages/ProtocolOverview/index.tsx | 4 +-- 7 files changed, 134 insertions(+), 4 deletions(-) create mode 100644 protocol-designer/src/file-data/__tests__/pythonFile.test.ts create mode 100644 protocol-designer/src/file-data/selectors/pythonFile.ts diff --git a/protocol-designer/src/file-data/__tests__/createFile.test.ts b/protocol-designer/src/file-data/__tests__/createFile.test.ts index a25f77524ea..6c50a9f02df 100644 --- a/protocol-designer/src/file-data/__tests__/createFile.test.ts +++ b/protocol-designer/src/file-data/__tests__/createFile.test.ts @@ -14,7 +14,11 @@ import { fixture_tiprack_300_ul, } from '@opentrons/shared-data/labware/fixtures/2' import { getLoadLiquidCommands } from '../../load-file/migration/utils/getLoadLiquidCommands' -import { createFile, getLabwareDefinitionsInUse } from '../selectors' +import { + createFile, + createPythonFile, + getLabwareDefinitionsInUse, +} from '../selectors' import { fileMetadata, dismissedWarnings, @@ -92,7 +96,29 @@ describe('createFile selector', () => { ingredLocations ) }) + + it('should return a valid Python protocol file', () => { + // @ts-expect-error(sa, 2021-6-15): resultFunc not part of Selector type + const result = createPythonFile.resultFunc(fileMetadata, {}) + // This is just a quick smoke test to make sure createPythonFile() produces + // something that looks like a Python file. The individual sections of the + // generated Python will be tested in separate unit tests. + expect(result).toBe( + ` +from contextlib import nullcontext as pd_step +from opentrons import protocol_api + +metadata = { + "protocolName": "Test Protocol", + "author": "The Author", + "description": "Protocol description", + "created": "2020-02-25T21:48:32.515Z", +} +`.trimStart() + ) + }) }) + describe('getLabwareDefinitionsInUse util', () => { it('should exclude definitions that are neither on the deck nor assigned to a pipette', () => { const assignedTiprackOnDeckDef = fixture_tiprack_10_ul diff --git a/protocol-designer/src/file-data/__tests__/pythonFile.test.ts b/protocol-designer/src/file-data/__tests__/pythonFile.test.ts new file mode 100644 index 00000000000..aab11d116c4 --- /dev/null +++ b/protocol-designer/src/file-data/__tests__/pythonFile.test.ts @@ -0,0 +1,31 @@ +import { describe, it, expect } from 'vitest' +import { pythonMetadata } from '../selectors/pythonFile' + +describe('pythonMetadata', () => { + it('should generate metadata section', () => { + expect( + pythonMetadata({ + protocolName: 'Name of Protocol', + author: 'Some Author', + description: 'The description.', + created: 1000000000000, + lastModified: 1000000001000, + category: 'PCR', + subcategory: 'PCR Prep', + tags: ['wombat', 'kangaroo', 'wallaby'], + }) + ).toBe( + ` +metadata = { + "protocolName": "Name of Protocol", + "author": "Some Author", + "description": "The description.", + "created": "2001-09-09T01:46:40.000Z", + "lastModified": "2001-09-09T01:46:41.000Z", + "category": "PCR", + "subcategory": "PCR Prep", + "tags": "wombat, kangaroo, wallaby", +}`.trimStart() + ) + }) +}) diff --git a/protocol-designer/src/file-data/selectors/fileCreator.ts b/protocol-designer/src/file-data/selectors/fileCreator.ts index 23d78185b11..2695cfbc58d 100644 --- a/protocol-designer/src/file-data/selectors/fileCreator.ts +++ b/protocol-designer/src/file-data/selectors/fileCreator.ts @@ -26,6 +26,7 @@ import { getModulesLoadInfo, getPipettesLoadInfo, } from './utils' +import { pythonImports, pythonMetadata } from './pythonFile' import type { SecondOrderCommandAnnotation } from '@opentrons/shared-data/commandAnnotation/types' import type { @@ -274,3 +275,18 @@ export const createFile: Selector = createSelector( } } ) + +export const createPythonFile: Selector = createSelector( + getFileMetadata, + fileMetadata => { + return ( + [ + // Here are the sections of the Python file: + pythonImports(), + pythonMetadata(fileMetadata), + ] + .filter(section => section) // skip any blank sections + .join('\n\n') + '\n' + ) + } +) diff --git a/protocol-designer/src/file-data/selectors/pythonFile.ts b/protocol-designer/src/file-data/selectors/pythonFile.ts new file mode 100644 index 00000000000..8af7707dc08 --- /dev/null +++ b/protocol-designer/src/file-data/selectors/pythonFile.ts @@ -0,0 +1,31 @@ +/** Generate sections of the Python file for fileCreator.ts */ + +import { formatPyDict } from '@opentrons/step-generation' +import type { FileMetadataFields } from '../types' + +export function pythonImports(): string { + return [ + 'from contextlib import nullcontext as pd_step', + 'from opentrons import protocol_api', + ].join('\n') +} + +export function pythonMetadata(fileMetadata: FileMetadataFields): string { + // FileMetadataFields has timestamps, lists, etc., but Python metadata dict can only contain strings + function formatTimestamp(timestamp: number | null | undefined): string { + return timestamp ? new Date(timestamp).toISOString() : '' + } + const stringifiedMetadata = Object.fromEntries( + Object.entries({ + protocolName: fileMetadata.protocolName, + author: fileMetadata.author, + description: fileMetadata.description, + created: formatTimestamp(fileMetadata.created), + lastModified: formatTimestamp(fileMetadata.lastModified), + category: fileMetadata.category, + subcategory: fileMetadata.subcategory, + tags: fileMetadata.tags?.length && fileMetadata.tags.join(', '), + }).filter(([key, value]) => value) // drop blank entries + ) + return `metadata = ${formatPyDict(stringifiedMetadata)}` +} diff --git a/protocol-designer/src/load-file/actions.ts b/protocol-designer/src/load-file/actions.ts index a42a998edc2..da14e209246 100644 --- a/protocol-designer/src/load-file/actions.ts +++ b/protocol-designer/src/load-file/actions.ts @@ -1,6 +1,6 @@ import { migration } from './migration' import { selectors as fileDataSelectors } from '../file-data' -import { saveFile } from './utils' +import { saveFile, savePythonFile } from './utils' import type { SyntheticEvent } from 'react' import type { PDProtocolFile } from '../file-types' @@ -112,3 +112,23 @@ export const saveProtocolFile: () => ThunkAction = () => const fileName = `${protocolName}.json` saveFile(fileData, fileName) } +// Eventually this will replace saveProtocolFile: +export const savePythonProtocolFile: () => ThunkAction = () => ( + dispatch, + getState +) => { + // dispatching this should update the state, eg lastModified timestamp + dispatch({ + type: 'SAVE_PROTOCOL_FILE', + }) + const state = getState() + const fileData = fileDataSelectors.createPythonFile(state) + const protocolName = + fileDataSelectors.getFileMetadata(state).protocolName || 'untitled' + // unlike JSON files, Python filenames can't have funny characters + const fileName = `${protocolName + .trim() + .replace(/\S+/g, '_') + .replace(/[^A-Za-z0-9_]/g, '')}.py` + savePythonFile(fileData, fileName) +} diff --git a/protocol-designer/src/load-file/utils.ts b/protocol-designer/src/load-file/utils.ts index 0d90087a4dd..2da3e8664f5 100644 --- a/protocol-designer/src/load-file/utils.ts +++ b/protocol-designer/src/load-file/utils.ts @@ -6,3 +6,9 @@ export const saveFile = (fileData: ProtocolFile, fileName: string): void => { }) saveAs(blob, fileName) } +export const savePythonFile = (fileData: string, fileName: string): void => { + const blob = new Blob([fileData], { type: 'text/x-python;charset=UTF-8' }) + // For now, show the generated Python in a new window instead of saving it to a file. + // (A saved Python file wouldn't be runnable anyway until we finish this project.) + window.open(URL.createObjectURL(blob), '_blank') +} diff --git a/protocol-designer/src/pages/ProtocolOverview/index.tsx b/protocol-designer/src/pages/ProtocolOverview/index.tsx index bfd2b2c5f80..f06fee7f216 100644 --- a/protocol-designer/src/pages/ProtocolOverview/index.tsx +++ b/protocol-designer/src/pages/ProtocolOverview/index.tsx @@ -301,9 +301,9 @@ export function ProtocolOverview(): JSX.Element { {enablePythonExport ? ( { - console.log('wire this up') + dispatch(loadFileActions.savePythonProtocolFile()) }} whiteSpace={NO_WRAP} height="3.5rem" From 5ae252e32ef04d2f0e87f0a71bccebe69be903b2 Mon Sep 17 00:00:00 2001 From: Jethary Date: Fri, 7 Feb 2025 15:47:14 -0500 Subject: [PATCH 098/150] trying to add back drag drop to deck setup --- .../src/assets/localization/en/deck.json | 24 +- .../Designer/DeckSetup/AdapterControls.tsx | 179 ++++++++++++++ .../pages/Designer/DeckSetup/BlockedSlot.tsx | 68 ++++++ .../Designer/DeckSetup/DeckItemHover.tsx | 127 ++++++++-- .../Designer/DeckSetup/DeckSetupDetails.tsx | 73 +++++- .../pages/Designer/DeckSetup/SlotControls.tsx | 226 ++++++++++++++++++ .../__tests__/DeckSetupContainer.test.tsx | 2 +- .../src/pages/Designer/DeckSetup/utils.ts | 57 +++++ .../pages/Designer/OffDeck/OffDeckDetails.tsx | 4 +- .../src/utils/labwareModuleCompatibility.ts | 1 + 10 files changed, 705 insertions(+), 56 deletions(-) create mode 100644 protocol-designer/src/pages/Designer/DeckSetup/AdapterControls.tsx create mode 100644 protocol-designer/src/pages/Designer/DeckSetup/BlockedSlot.tsx create mode 100644 protocol-designer/src/pages/Designer/DeckSetup/SlotControls.tsx diff --git a/protocol-designer/src/assets/localization/en/deck.json b/protocol-designer/src/assets/localization/en/deck.json index 436c856ead5..0a19967ceab 100644 --- a/protocol-designer/src/assets/localization/en/deck.json +++ b/protocol-designer/src/assets/localization/en/deck.json @@ -8,34 +8,14 @@ "MODULE_INCOMPATIBLE_LABWARE_SWAP": "Swapping labware not possible due to module incompatibility", "LABWARE_INCOMPATIBLE_WITH_ADAPTER": "Labware incompatible with this adapter" }, - "header": { - "end": "Click on labware to inspect the result of your protocol" - }, "off_deck": { "slideout_title": "Off-deck labware", "slideout_empty_state": "There is currently no off-deck labware in this step of the protocol" }, "overlay": { - "name_labware": { - "nickname_placeholder": "Add a nickname?", - "add_liquids": "Add Liquids", - "leave_empty": "Leave Empty" - }, - "edit": { - "name_and_liquids": "Name & Liquids", - "duplicate": "Duplicate", - "delete": "Delete" - }, - "browse": { - "view_liquids": "View Liquids" - }, "slot": { - "add_labware": "Add Labware", "drag_to_new_slot": "Drag To New Slot", - "place_here": "Place Here", - "add_adapter_or_labware": "Add Labware or Adapter", - "add_adapter": "Add adapter" + "place_here": "Place Here" } - }, - "inactive_deck": "hover on a step to see deck state" + } } diff --git a/protocol-designer/src/pages/Designer/DeckSetup/AdapterControls.tsx b/protocol-designer/src/pages/Designer/DeckSetup/AdapterControls.tsx new file mode 100644 index 00000000000..8e4a8c2aea5 --- /dev/null +++ b/protocol-designer/src/pages/Designer/DeckSetup/AdapterControls.tsx @@ -0,0 +1,179 @@ +import * as React from 'react' +import { useDispatch, useSelector } from 'react-redux' +import { useDrop } from 'react-dnd' +import cx from 'classnames' +import noop from 'lodash/noop' +import { Icon, RobotCoordsForeignDiv } from '@opentrons/components' +import { DND_TYPES } from '../../../constants' +import { + getAdapterLabwareIsAMatch, + getLabwareIsCustom, +} from '../../../utils/labwareModuleCompatibility' +import { + deleteContainer, + moveDeckItem, + openAddLabwareModal, +} from '../../../labware-ingred/actions' +import { selectors as labwareDefSelectors } from '../../../labware-defs' +// import { START_TERMINAL_ITEM_ID } from '../../../steplist' +import { BlockedSlot } from './BlockedSlot' + +import type { DropTargetMonitor } from 'react-dnd' +import type { CoordinateTuple, Dimensions } from '@opentrons/shared-data' +import type { TerminalItemId } from '../../../steplist' +import type { LabwareOnDeck } from '../../../step-forms' + +// import styles from './LabwareOverlays.module.css' + +interface AdapterControlsProps { + slotPosition: CoordinateTuple + slotBoundingBox: Dimensions + // labwareId is the adapter's labwareId + labwareId: string + allLabware: LabwareOnDeck[] + onDeck: boolean + // selectedTerminalItemId?: TerminalItemId | null + handleDragHover?: () => void +} + +interface DroppedItem { + labwareOnDeck: LabwareOnDeck +} + +export const AdapterControls = ( + props: AdapterControlsProps +): JSX.Element | null => { + const { + slotPosition, + slotBoundingBox, + labwareId, + onDeck, + handleDragHover, + allLabware, + } = props + const customLabwareDefs = useSelector( + labwareDefSelectors.getCustomLabwareDefsByURI + ) + const ref = React.useRef(null) + const dispatch = useDispatch() + + const adapterName = + allLabware.find(labware => labware.id === labwareId)?.def.metadata + .displayName ?? '' + + const [{ itemType, draggedItem, isOver }, drop] = useDrop( + () => ({ + accept: DND_TYPES.LABWARE, + canDrop: (item: DroppedItem) => { + const draggedDef = item.labwareOnDeck?.def + console.assert( + draggedDef, + 'no labware def of dragged item, expected it on drop' + ) + + if (draggedDef != null) { + const isCustomLabware = getLabwareIsCustom( + customLabwareDefs, + item.labwareOnDeck + ) + return ( + getAdapterLabwareIsAMatch( + labwareId, + allLabware, + draggedDef.parameters.loadName + ) || isCustomLabware + ) + } + return true + }, + drop: (item: DroppedItem) => { + const droppedLabware = item + if (droppedLabware.labwareOnDeck != null) { + const droppedSlot = droppedLabware.labwareOnDeck.slot + dispatch(moveDeckItem(droppedSlot, labwareId)) + } + }, + hover: () => { + if (handleDragHover != null) { + handleDragHover() + } + }, + collect: (monitor: DropTargetMonitor) => ({ + itemType: monitor.getItemType(), + isOver: !!monitor.isOver(), + draggedItem: monitor.getItem() as DroppedItem, + }), + }), + [] + ) + + if (itemType !== DND_TYPES.LABWARE && itemType !== null) return null + const draggedDef = draggedItem?.labwareOnDeck?.def + const isCustomLabware = draggedItem + ? getLabwareIsCustom(customLabwareDefs, draggedItem.labwareOnDeck) + : false + + let slotBlocked: string | null = null + + if (isOver && draggedDef != null && isCustomLabware) { + slotBlocked = 'Custom Labware incompatible with this adapter' + } else if ( + isOver && + draggedDef != null && + !getAdapterLabwareIsAMatch( + labwareId, + allLabware, + draggedDef.parameters.loadName + ) + ) { + slotBlocked = 'Labware incompatible with this adapter' + } + + drop(ref) + + return ( + + {slotBlocked ? ( + + ) : ( + + dispatch(openAddLabwareModal({ slot: labwareId }))} + > + {!isOver && } + {isOver ? 'Place Here' : 'Add Labware'} + + { + window.confirm( + `"Are you sure you want to remove this ${adapterName}?` + ) && dispatch(deleteContainer({ labwareId: labwareId })) + }} + > + {!isOver && } + {'Delete'} + + + )} + + ) +} diff --git a/protocol-designer/src/pages/Designer/DeckSetup/BlockedSlot.tsx b/protocol-designer/src/pages/Designer/DeckSetup/BlockedSlot.tsx new file mode 100644 index 00000000000..2ae193d26b9 --- /dev/null +++ b/protocol-designer/src/pages/Designer/DeckSetup/BlockedSlot.tsx @@ -0,0 +1,68 @@ +import * as React from 'react' +import { useTranslation } from 'react-i18next' +import { RobotCoordsForeignDiv } from '@opentrons/components' +import { css } from 'styled-components' + +type BlockedSlotMessage = + | 'MODULE_INCOMPATIBLE_SINGLE_LABWARE' + | 'MODULE_INCOMPATIBLE_LABWARE_SWAP' + | 'LABWARE_INCOMPATIBLE_WITH_ADAPTER' + +interface Props { + x: number + y: number + width: number + height: number + message: BlockedSlotMessage +} + +export const BlockedSlot = (props: Props): JSX.Element => { + const { t } = useTranslation('deck') + const { x, y, width, height, message } = props + return ( + + + + {t(`blocked_slot.${message}`)} + + + ) +} + +// .blocked_slot_background { +// fill: rgba(200, 115, 0, 0.75); +// stroke: var(--c-red); +// rx: 6; +// } + +// .blocked_slot_content { +// height: 100%; +// margin: -1.5rem 0.5rem; +// color: var(--c-white); +// font-size: var(--fs-caption); +// text-align: center; +// line-height: 1.5; +// } diff --git a/protocol-designer/src/pages/Designer/DeckSetup/DeckItemHover.tsx b/protocol-designer/src/pages/Designer/DeckSetup/DeckItemHover.tsx index 0b480340279..99db89b1cbc 100644 --- a/protocol-designer/src/pages/Designer/DeckSetup/DeckItemHover.tsx +++ b/protocol-designer/src/pages/Designer/DeckSetup/DeckItemHover.tsx @@ -1,5 +1,7 @@ import { useTranslation } from 'react-i18next' -import { useSelector } from 'react-redux' +import { DropTargetMonitor, useDrag, useDrop } from 'react-dnd' +import { useDispatch, useSelector } from 'react-redux' +import { useRef, useEffect } from 'react' import { css } from 'styled-components' import { ALIGN_CENTER, @@ -15,7 +17,10 @@ import { RobotCoordsForeignDiv, StyledText, } from '@opentrons/components' +import { DND_TYPES } from '../../../constants' +import { moveDeckItem } from '../../../labware-ingred/actions' import { getDeckSetupForActiveItem } from '../../../top-selectors/labware-locations' +import { BlockedSlot } from './BlockedSlot' import type { Dispatch, SetStateAction } from 'react' import type { @@ -23,6 +28,8 @@ import type { DeckSlotId, Dimensions, } from '@opentrons/shared-data' +import type { LabwareOnDeck } from '../../../step-forms' +import type { ThunkDispatch } from '../../../types' import type { DeckSetupTabType } from '../types' interface DeckItemHoverProps extends DeckSetupTabType { @@ -33,10 +40,18 @@ interface DeckItemHoverProps extends DeckSetupTabType { itemId: string slotPosition: CoordinateTuple | null setShowMenuListForId: Dispatch> + labwareOnDeck: LabwareOnDeck menuListId: DeckSlotId | null + setHoveredLabware?: (labware?: LabwareOnDeck | null) => void + setDraggedLabware?: (labware?: LabwareOnDeck | null) => void + swapBlocked?: boolean isSelected?: boolean } +interface DroppedItem { + labwareOnDeck: LabwareOnDeck +} + export function DeckItemHover(props: DeckItemHoverProps): JSX.Element | null { const { hover, @@ -47,25 +62,88 @@ export function DeckItemHover(props: DeckItemHoverProps): JSX.Element | null { setShowMenuListForId, menuListId, slotPosition, + setHoveredLabware, + setDraggedLabware, isSelected = false, + swapBlocked, + labwareOnDeck, } = props const { t } = useTranslation('starting_deck_state') const deckSetup = useSelector(getDeckSetupForActiveItem) + const offDeckLabware = Object.values(deckSetup.labware).find( lw => lw.id === itemId ) - if (tab === 'protocolSteps' || slotPosition === null || isSelected) - return null const hoverOpacity = (hover != null && hover === itemId) || menuListId === itemId ? '1' : '0' + const dispatch = useDispatch>() + const ref = useRef(null) + + const [, drag] = useDrag( + () => ({ + type: DND_TYPES.LABWARE, + item: { labwareOnDeck }, + }), + [labwareOnDeck] + ) + + const [{ draggedLabware }, drop] = useDrop( + () => ({ + accept: DND_TYPES.LABWARE, + canDrop: (item: DroppedItem) => { + const draggedLabware = item?.labwareOnDeck + const isDifferentSlot = + draggedLabware && draggedLabware.slot !== labwareOnDeck?.slot + return isDifferentSlot && !swapBlocked + }, + drop: (item: DroppedItem) => { + const draggedLabware = item?.labwareOnDeck + if (draggedLabware != null && labwareOnDeck != null) { + dispatch(moveDeckItem(draggedLabware.slot, labwareOnDeck.slot)) + } + }, + hover: () => { + setHoveredLabware?.(labwareOnDeck) + }, + collect: (monitor: DropTargetMonitor) => ({ + isOver: monitor.isOver(), + draggedLabware: monitor.getItem() as DroppedItem, + }), + }), + [labwareOnDeck] + ) + + useEffect(() => { + if (draggedLabware?.labwareOnDeck != null && setDraggedLabware != null) { + setDraggedLabware(draggedLabware?.labwareOnDeck) + } else { + setHoveredLabware?.(null) + setDraggedLabware?.(null) + } + }, [draggedLabware]) + + const isBeingDragged = + draggedLabware?.labwareOnDeck?.slot === labwareOnDeck?.slot + + drag(drop(ref)) + + if (tab === 'protocolSteps' || slotPosition === null || isSelected) + return null + + const x = slotPosition[0] + const y = slotPosition[1] + const width = slotBoundingBox.xDimension + const height = slotBoundingBox.yDimension + + console.log('swapBlocked in deckItemHover', swapBlocked) return ( - { - setShowMenuListForId(itemId) - }} + - - {offDeckLabware?.slot === 'offDeck' - ? t('edit_labware') - : t('edit_slot')} - - + + + {isBeingDragged + ? 'dragging' + : offDeckLabware?.slot === 'offDeck' + ? t('edit_labware') + : t('edit_slot')} + + + + {swapBlocked && ( + + )} ) } diff --git a/protocol-designer/src/pages/Designer/DeckSetup/DeckSetupDetails.tsx b/protocol-designer/src/pages/Designer/DeckSetup/DeckSetupDetails.tsx index 110bf9535a2..34988ee6332 100644 --- a/protocol-designer/src/pages/Designer/DeckSetup/DeckSetupDetails.tsx +++ b/protocol-designer/src/pages/Designer/DeckSetup/DeckSetupDetails.tsx @@ -1,5 +1,5 @@ import values from 'lodash/values' -import { Fragment, useEffect, useState } from 'react' +import { Fragment, useCallback, useEffect, useState } from 'react' import { useDispatch, useSelector } from 'react-redux' import { Module } from '@opentrons/components' @@ -27,7 +27,7 @@ import { DeckItemHover } from './DeckItemHover' import { SlotOverflowMenu } from './SlotOverflowMenu' import { HoveredItems } from './HoveredItems' import { SelectedHoveredItems } from './SelectedHoveredItems' -import { getAdjacentLabware } from './utils' +import { getAdjacentLabware, getSwapBlocked } from './utils' import { SlotWarning } from './SlotWarning' import { HighlightItems } from './HighlightItems' @@ -53,6 +53,8 @@ import type { } from '../../../step-forms' import type { DeckSetupTabType } from '../types' import type { Fixture } from './constants' +import { getCustomLabwareDefsByURI } from '../../../labware-defs/selectors' +import { SlotControls } from './SlotControls' interface DeckSetupDetailsProps extends DeckSetupTabType { activeDeckSetup: InitialDeckSetup @@ -93,6 +95,22 @@ export function DeckSetupDetails(props: DeckSetupDetailsProps): JSX.Element { const [menuListId, setShowMenuListForId] = useState(null) const dispatch = useDispatch() + const [hoveredLabwareForSwap, setHoveredLabware] = useState< + LabwareOnDeckType | null | undefined + >(null) + const [draggedLabware, setDraggedLabware] = useState< + LabwareOnDeckType | null | undefined + >(null) + const customLabwareDefs = useSelector(getCustomLabwareDefsByURI) + const swapBlocked = getSwapBlocked({ + hoveredLabware: hoveredLabwareForSwap, + draggedLabware, + modulesById: activeDeckSetup.modules, + customLabwareDefs, + }) + + const handleHoverEmptySlot = useCallback(() => setHoveredLabware(null), []) + const { createdLabwareForSlot, createdNestedLabwareForSlot, @@ -254,13 +272,21 @@ export function DeckSetupDetails(props: DeckSetupDetailsProps): JSX.Element { slotPosition={[0, 0, 0]} itemId={slotId} tab={tab} + labwareOnDeck={labwareLoadedOnModule} + swapBlocked={ + swapBlocked && + (labwareLoadedOnModule.id === hoveredLabwareForSwap?.id || + labwareLoadedOnModule.id === draggedLabware?.id) + } + setDraggedLabware={setDraggedLabware} + setHoveredLabware={setHoveredLabware} /> ) : null} {labwareLoadedOnModule == null ? ( <> - ) : null} @@ -311,21 +339,28 @@ export function DeckSetupDetails(props: DeckSetupDetailsProps): JSX.Element { ) }) .map(addressableArea => { + const moduleType = Object.values(activeDeckSetup.modules).find( + module => module.slot === addressableArea.id + )?.type return ( - ) @@ -366,6 +401,14 @@ export function DeckSetupDetails(props: DeckSetupDetailsProps): JSX.Element { slotPosition={slotPosition} itemId={labware.slot} tab={tab} + labwareOnDeck={labware} + setDraggedLabware={setDraggedLabware} + setHoveredLabware={setHoveredLabware} + swapBlocked={ + swapBlocked && + (labware.id === hoveredLabwareForSwap?.id || + labware.id === draggedLabware?.id) + } /> ) : null @@ -429,6 +472,14 @@ export function DeckSetupDetails(props: DeckSetupDetailsProps): JSX.Element { slotPosition={slotPosition} itemId={slotOnDeck ?? ''} tab={tab} + labwareOnDeck={labware} + setDraggedLabware={setDraggedLabware} + setHoveredLabware={setHoveredLabware} + swapBlocked={ + swapBlocked && + (labware.id === hoveredLabwareForSwap?.id || + labware.id === draggedLabware?.id) + } /> ) diff --git a/protocol-designer/src/pages/Designer/DeckSetup/SlotControls.tsx b/protocol-designer/src/pages/Designer/DeckSetup/SlotControls.tsx new file mode 100644 index 00000000000..82c05c2691c --- /dev/null +++ b/protocol-designer/src/pages/Designer/DeckSetup/SlotControls.tsx @@ -0,0 +1,226 @@ +import { useTranslation } from 'react-i18next' +import { Dispatch, SetStateAction, useRef } from 'react' +import { useSelector, useDispatch } from 'react-redux' +import { useDrop, useDrag } from 'react-dnd' +import { + ALIGN_CENTER, + BORDERS, + COLORS, + CURSOR_POINTER, + DISPLAY_FLEX, + Flex, + JUSTIFY_CENTER, + Link, + POSITION_ABSOLUTE, + PRODUCT, + RobotCoordsForeignDiv, + StyledText, +} from '@opentrons/components' +import { DND_TYPES } from '../../../constants' +import { + getLabwareIsCompatible, + getLabwareIsCustom, +} from '../../../utils/labwareModuleCompatibility' +import { moveDeckItem } from '../../../labware-ingred/actions' +import { selectors as labwareDefSelectors } from '../../../labware-defs' +import { BlockedSlot } from './BlockedSlot' + +import type { DropTargetMonitor } from 'react-dnd' +import type { + CoordinateTuple, + DeckSlotId, + Dimensions, + ModuleType, +} from '@opentrons/shared-data' +import type { LabwareOnDeck } from '../../../step-forms' +import type { DeckSetupTabType } from '../types' + +interface SlotControlsProps extends DeckSetupTabType { + slotPosition: CoordinateTuple | null + slotBoundingBox: Dimensions + // slotId can be either AddressableAreaName or moduleId + slotId: string + moduleType: ModuleType | null + setHover: Dispatch> + hover: string | null + itemId: string + menuListId: DeckSlotId | null + setShowMenuListForId: Dispatch> + isSelected?: boolean + handleDragHover?: () => void +} + +interface DroppedItem { + labwareOnDeck: LabwareOnDeck +} + +export const SlotControls = (props: SlotControlsProps): JSX.Element | null => { + const { + slotBoundingBox, + slotPosition, + slotId, + moduleType, + handleDragHover, + itemId, + hover, + setHover, + isSelected, + tab, + menuListId, + setShowMenuListForId, + } = props + const { t } = useTranslation(['deck', 'starting_deck_state']) + const hoverOpacity = + (hover != null && hover === itemId) || menuListId === itemId ? '1' : '0' + const customLabwareDefs = useSelector( + labwareDefSelectors.getCustomLabwareDefsByURI + ) + const ref = useRef(null) + const dispatch = useDispatch() + + const [, drag] = useDrag({ + type: DND_TYPES.LABWARE, + item: { labwareOnDeck: null }, + }) + + const [{ draggedItem, itemType, isOver }, drop] = useDrop( + () => ({ + accept: DND_TYPES.LABWARE, + canDrop: (item: DroppedItem) => { + const draggedDef = item?.labwareOnDeck?.def + console.assert( + draggedDef, + 'no labware def of dragged item, expected it on drop' + ) + console.log('hello hit here', moduleType, draggedDef) + if (moduleType != null && draggedDef != null) { + // this is a module slot, prevent drop if the dragged labware is not compatible + const isCustomLabware = getLabwareIsCustom( + customLabwareDefs, + item.labwareOnDeck + ) + + return ( + getLabwareIsCompatible(draggedDef, moduleType) || isCustomLabware + ) + } + return true + }, + drop: (item: DroppedItem) => { + const droppedLabware = item + if (droppedLabware.labwareOnDeck != null) { + const droppedSlot = droppedLabware.labwareOnDeck.slot + dispatch(moveDeckItem(droppedSlot, slotId)) + } + }, + hover: () => { + if (handleDragHover != null) { + handleDragHover() + } + }, + collect: (monitor: DropTargetMonitor) => ({ + itemType: monitor.getItemType(), + isOver: !!monitor.isOver(), + draggedItem: monitor.getItem() as DroppedItem, + }), + }), + [] + ) + + if ( + (itemType !== DND_TYPES.LABWARE && itemType !== null) || + slotPosition == null + ) + return null + + const draggedDef = draggedItem?.labwareOnDeck?.def + console.log('dragged item', draggedItem) + const isCustomLabware = + draggedItem != null && draggedItem.labwareOnDeck != null + ? getLabwareIsCustom(customLabwareDefs, draggedItem.labwareOnDeck) + : false + + drag(drop(ref)) + + if (tab === 'protocolSteps' || slotPosition === null || isSelected) + return null + + const x = slotPosition[0] + const y = slotPosition[1] + const width = slotBoundingBox.xDimension + const height = slotBoundingBox.yDimension + + let slotBlocked: string | null = null + if ( + isOver && + moduleType != null && + draggedDef != null && + !getLabwareIsCompatible(draggedDef, moduleType) + ) { + slotBlocked = 'Labware incompatible with this module' + } + + return ( + + {slotBlocked ? ( + + ) : ( + { + setHover(itemId) + }, + onMouseLeave: () => { + setHover(null) + }, + onClick: () => { + setShowMenuListForId(itemId) + }, + }} + > + + + + {isOver + ? t('overlay.slot.place_here') + : t('starting_deck_state:edit_slot')} + + + + + )} + + ) +} diff --git a/protocol-designer/src/pages/Designer/DeckSetup/__tests__/DeckSetupContainer.test.tsx b/protocol-designer/src/pages/Designer/DeckSetup/__tests__/DeckSetupContainer.test.tsx index a5d0226472d..e2ea9b30a85 100644 --- a/protocol-designer/src/pages/Designer/DeckSetup/__tests__/DeckSetupContainer.test.tsx +++ b/protocol-designer/src/pages/Designer/DeckSetup/__tests__/DeckSetupContainer.test.tsx @@ -15,7 +15,7 @@ import { import { getSelectedTerminalItemId } from '../../../../ui/steps' import { getDisableModuleRestrictions } from '../../../../feature-flags/selectors' import { getRobotType } from '../../../../file-data/selectors' -import { DeckSetupDetails } from '../DeckSetupDetails' +import { DeckSetupDetails } from '../DeckSetupDetails.1' import { DeckSetupTools } from '../DeckSetupTools' import { DeckSetupContainer } from '../DeckSetupContainer' import type * as OpentronsComponents from '@opentrons/components' diff --git a/protocol-designer/src/pages/Designer/DeckSetup/utils.ts b/protocol-designer/src/pages/Designer/DeckSetup/utils.ts index 72b295b6464..31850a064a6 100644 --- a/protocol-designer/src/pages/Designer/DeckSetup/utils.ts +++ b/protocol-designer/src/pages/Designer/DeckSetup/utils.ts @@ -30,6 +30,7 @@ import type { DeckSlotId, LabwareDefinition2, ModuleModel, + ModuleType, RobotType, } from '@opentrons/shared-data' import type { LabwareDefByDefURI } from '../../../labware-defs' @@ -39,6 +40,10 @@ import type { LabwareOnDeck, } from '../../../step-forms' import type { Fixture } from './constants' +import { + getLabwareIsCompatible, + getLabwareIsCustom, +} from '../../../utils/labwareModuleCompatibility' const OT2_TC_SLOTS = ['7', '8', '10', '11'] const FLEX_TC_SLOTS = ['A1', 'B1'] @@ -336,3 +341,55 @@ export function useDeckSetupWindowBreakPoint(): BreakPoint { return size } + +export interface SwapBlockedArgs { + modulesById: InitialDeckSetup['modules'] + customLabwareDefs: LabwareDefByDefURI + hoveredLabware?: LabwareOnDeck | null + draggedLabware?: LabwareOnDeck | null +} + +export const getSwapBlocked = (args: SwapBlockedArgs): boolean => { + const { + hoveredLabware, + draggedLabware, + modulesById, + customLabwareDefs, + } = args + console.log( + 'swap', + hoveredLabware, + draggedLabware, + modulesById, + customLabwareDefs + ) + if (!hoveredLabware || !draggedLabware) { + return false + } + + const sourceModuleType: ModuleType | null = + modulesById[draggedLabware.slot]?.type || null + const destModuleType: ModuleType | null = + modulesById[hoveredLabware.slot]?.type || null + + const draggedLabwareIsCustom = getLabwareIsCustom( + customLabwareDefs, + draggedLabware + ) + const hoveredLabwareIsCustom = getLabwareIsCustom( + customLabwareDefs, + hoveredLabware + ) + + // dragging custom labware to module gives not compat error + const labwareSourceToDestBlocked = sourceModuleType + ? !getLabwareIsCompatible(hoveredLabware.def, sourceModuleType) && + !hoveredLabwareIsCustom + : false + const labwareDestToSourceBlocked = destModuleType + ? !getLabwareIsCompatible(draggedLabware.def, destModuleType) && + !draggedLabwareIsCustom + : false + + return labwareSourceToDestBlocked || labwareDestToSourceBlocked +} diff --git a/protocol-designer/src/pages/Designer/OffDeck/OffDeckDetails.tsx b/protocol-designer/src/pages/Designer/OffDeck/OffDeckDetails.tsx index b062915271c..965780070b6 100644 --- a/protocol-designer/src/pages/Designer/OffDeck/OffDeckDetails.tsx +++ b/protocol-designer/src/pages/Designer/OffDeck/OffDeckDetails.tsx @@ -166,7 +166,7 @@ export function OffDeckDetails(props: OffDeckDetailsProps): JSX.Element { )} /> - + /> */} )} diff --git a/protocol-designer/src/utils/labwareModuleCompatibility.ts b/protocol-designer/src/utils/labwareModuleCompatibility.ts index 5268f89f50a..c96be39c466 100644 --- a/protocol-designer/src/utils/labwareModuleCompatibility.ts +++ b/protocol-designer/src/utils/labwareModuleCompatibility.ts @@ -156,6 +156,7 @@ export const getLabwareIsCustom = ( customLabwares: LabwareDefByDefURI, labwareOnDeck: LabwareOnDeck ): boolean => { + console.log('labwareOnDeck', labwareOnDeck) return labwareOnDeck.labwareDefURI in customLabwares } From f687a3a52137d5a1df7f5315cd3bd685bfba5d09 Mon Sep 17 00:00:00 2001 From: Jethary Alcid <66035149+jerader@users.noreply.github.com> Date: Fri, 7 Feb 2025 16:21:17 -0500 Subject: [PATCH 099/150] feat(protocol-designer, step-generation, app): introduce pythonName to each entity (#17463) closes AUTH-1383 For python/pd interop, we want to add a `pythonName` to `liquidEntity`, `labwareEntity`, `moduleEntity`, and `pipetteEntity`. This PR does that by adding them in redux, that way, the `pythonName` is not polluting the JSON structure. For Quick Transfer, the `pythonName` is generated in `generateQuickTransferArgs`. The python name patterning is as follows: - modules: moduleType minus `Type` in snake case plus the number so `heater_shaker_module_1` and then `heater_shaker_module_2` for 2 heater-shaker modules - pipettes: `pipette_left` or `pipette_right` - labware: the labware displayCategory in snake case plus the number. So 2 well plates and 1 reservoir would be `well_plate_1`, `well_plate_2`, `reservoir_1` - liquids: just liquid with the number so `liquid_1`, `liquid_2`, etc. --- .../utils/createQuickTransferFile.ts | 2 +- .../utils/generateQuickTransferArgs.ts | 15 ++ .../protocol/8/doItAllV3MigratedToV8.json | 1 - .../protocol/8/doItAllV4MigratedToV8.json | 1 - .../protocol/8/doItAllV7MigratedToV8.json | 2 - .../fixtures/protocol/8/doItAllV8.json | 2 - .../protocol/8/example_1_1_0MigratedToV8.json | 2 - .../8/thermocyclerOnOt2V7MigratedToV8.json | 1 - .../__fixtures__/createFile/commonFields.ts | 4 + .../__fixtures__/createFile/engageMagnet.ts | 1 + .../file-data/__tests__/createFile.test.ts | 2 + .../src/file-data/__tests__/utils.test.tsx | 3 + .../src/file-data/selectors/fileCreator.ts | 26 ++- protocol-designer/src/file-types.ts | 4 +- .../labware-ingred/__tests__/actions.test.ts | 3 + .../src/labware-ingred/actions/actions.ts | 27 +-- .../src/labware-ingred/actions/thunks.ts | 82 ++++++++- .../src/labware-ingred/reducers/index.ts | 20 ++- .../src/labware-ingred/selectors.ts | 7 +- protocol-designer/src/labware-ingred/types.ts | 6 +- .../src/load-file/migration/8_5_0.ts | 7 +- .../src/modules/__tests__/moduleData.test.tsx | 2 + protocol-designer/src/modules/thunks.ts | 64 ++++++- .../organisms/DefineLiquidsModal/index.tsx | 12 +- .../__tests__/utils.test.ts | 2 + .../EditInstrumentsModal/editPipettes.ts | 2 +- .../__tests__/MaterialsListModal.test.tsx | 2 + .../__tests__/SelectWellsModal.test.tsx | 2 + .../pages/CreateNewProtocolWizard/index.tsx | 2 +- .../Designer/DeckSetup/DeckSetupTools.tsx | 4 +- .../Designer/DeckSetup/SlotOverflowMenu.tsx | 4 +- .../__tests__/DeckSetupTools.test.tsx | 7 +- .../DeckSetup/__tests__/LabwareTools.test.tsx | 1 + .../__tests__/SelectedHoveredItems.test.tsx | 3 + .../__tests__/SlotOverflowMenu.test.tsx | 9 +- .../DeckSetup/__tests__/utils.test.ts | 2 + .../Offdeck/__tests__/OffDeckDetails.test.tsx | 1 + .../StepTools/__tests__/MagnetTools.test.tsx | 3 + .../Timeline/__tests__/AddStepButton.test.tsx | 4 + .../__tests__/StepOverflowMenu.test.tsx | 2 + .../pages/Designer/__tests__/utils.test.ts | 8 + .../__tests__/DeckThumbnail.test.tsx | 1 + .../__tests__/OffdeckThumbnail.test.tsx | 1 + .../src/step-forms/actions/modules.ts | 6 - .../src/step-forms/reducers/index.ts | 168 ++++++++++++++---- .../src/step-forms/selectors/index.ts | 23 ++- .../src/step-forms/test/reducers.test.ts | 31 ++-- protocol-designer/src/step-forms/types.ts | 2 + .../src/step-forms/utils/index.ts | 5 +- .../getNextDefaultTemperatureModuleId.test.ts | 3 + ...getNextDefaultThermocyclerModuleId.test.ts | 5 + .../handleFormChange/test/moveLiquid.test.ts | 2 + .../steplist/formLevel/test/warnings.test.ts | 6 + protocol-designer/src/ui/modules/utils.ts | 6 +- .../__tests__/addAndSelectStep.test.ts | 10 ++ .../labwareModuleCompatibility.test.ts | 1 + protocol-designer/src/utils/index.ts | 22 +++ .../fixtureGeneration.test.ts.snap | 15 ++ .../absorbanceReaderCloseInitialize.test.ts | 1 + .../absorbanceReaderCloseLid.test.ts | 1 + .../absorbanceReaderCloseRead.test.ts | 1 + .../__tests__/absorbanceReaderOpenLid.test.ts | 1 + .../src/__tests__/disengageMagnet.test.ts | 1 + .../dispenseUpdateLiquidState.test.ts | 1 + .../src/__tests__/engageMagnet.test.ts | 1 + .../getIsSafePipetteMovement.test.ts | 7 + .../src/__tests__/heaterShaker.test.ts | 1 + .../__tests__/heaterShakerOpenLatch.test.ts | 1 + .../src/__tests__/heaterShakerUpdates.test.ts | 1 + .../__tests__/modulePipetteCollision.test.ts | 1 + .../src/__tests__/moveLabware.test.ts | 1 + .../src/__tests__/robotStateSelectors.test.ts | 1 + .../src/__tests__/thermocyclerUpdates.test.ts | 1 + .../__tests__/updateMagneticModule.test.ts | 1 + step-generation/src/__tests__/utils.test.ts | 10 ++ .../src/fixtures/robotStateFixtures.ts | 30 ++-- step-generation/src/types.ts | 8 + ...onstructInvariantContextFromRunCommands.ts | 4 + 78 files changed, 591 insertions(+), 144 deletions(-) diff --git a/app/src/organisms/ODD/QuickTransferFlow/utils/createQuickTransferFile.ts b/app/src/organisms/ODD/QuickTransferFlow/utils/createQuickTransferFile.ts index 09fa2348f39..614acb18753 100644 --- a/app/src/organisms/ODD/QuickTransferFlow/utils/createQuickTransferFile.ts +++ b/app/src/organisms/ODD/QuickTransferFlow/utils/createQuickTransferFile.ts @@ -204,7 +204,7 @@ export function createQuickTransferFile( }, designerApplication: { name: 'opentrons/quick-transfer', - version: '1.0.0', + version: '1.1.0', data: quickTransferState, }, } diff --git a/app/src/organisms/ODD/QuickTransferFlow/utils/generateQuickTransferArgs.ts b/app/src/organisms/ODD/QuickTransferFlow/utils/generateQuickTransferArgs.ts index c541a498e3e..75cb1d606d7 100644 --- a/app/src/organisms/ODD/QuickTransferFlow/utils/generateQuickTransferArgs.ts +++ b/app/src/organisms/ODD/QuickTransferFlow/utils/generateQuickTransferArgs.ts @@ -67,6 +67,7 @@ function getInvariantContextAndRobotState( tiprackDefURI: [tipRackDefURI], tiprackLabwareDef: [quickTransferState.tipRack], spec: quickTransferState.pipette, + pythonName: 'pipette_left', }, } const pipetteLocations: RobotState['pipettes'] = { @@ -88,6 +89,7 @@ function getInvariantContextAndRobotState( id: adapterId, labwareDefURI: adapter96ChannelDefUri, def: getAllDefinitions()[adapter96ChannelDefUri], + pythonName: 'adapter_1', }, } labwareLocations = { @@ -96,6 +98,14 @@ function getInvariantContextAndRobotState( }, } } + const sourceDisplayCategory = + quickTransferState.source.metadata.displayCategory + const destDisplayCategory = + quickTransferState.destination !== 'source' + ? quickTransferState.destination.metadata.displayCategory + : sourceDisplayCategory + + const isSameDisplayCategory = sourceDisplayCategory === destDisplayCategory labwareEntities = { ...labwareEntities, @@ -103,11 +113,13 @@ function getInvariantContextAndRobotState( id: tipRackId, labwareDefURI: tipRackDefURI, def: quickTransferState.tipRack, + pythonName: 'tip_rack_1', }, [sourceLabwareId]: { id: sourceLabwareId, labwareDefURI: sourceLabwareURI, def: quickTransferState.source, + pythonName: `${sourceDisplayCategory}_1`, }, } labwareLocations = { @@ -129,6 +141,9 @@ function getInvariantContextAndRobotState( id: destLabwareId, labwareDefURI: destLabwareURI, def: quickTransferState.destination, + pythonName: isSameDisplayCategory + ? `${destDisplayCategory}_2` + : `${destDisplayCategory}_1`, }, } labwareLocations = { diff --git a/protocol-designer/fixtures/protocol/8/doItAllV3MigratedToV8.json b/protocol-designer/fixtures/protocol/8/doItAllV3MigratedToV8.json index 48c933990a4..fccdb5ede4a 100644 --- a/protocol-designer/fixtures/protocol/8/doItAllV3MigratedToV8.json +++ b/protocol-designer/fixtures/protocol/8/doItAllV3MigratedToV8.json @@ -30,7 +30,6 @@ "displayName": "Water", "displayColor": "#b925ff", "description": null, - "pythonName": "liquid_1", "liquidGroupId": "0" } }, diff --git a/protocol-designer/fixtures/protocol/8/doItAllV4MigratedToV8.json b/protocol-designer/fixtures/protocol/8/doItAllV4MigratedToV8.json index ea1d1cb31f3..3edfb77be96 100644 --- a/protocol-designer/fixtures/protocol/8/doItAllV4MigratedToV8.json +++ b/protocol-designer/fixtures/protocol/8/doItAllV4MigratedToV8.json @@ -30,7 +30,6 @@ "displayName": "Water", "displayColor": "#b925ff", "description": null, - "pythonName": "liquid_1", "liquidGroupId": "0" } }, diff --git a/protocol-designer/fixtures/protocol/8/doItAllV7MigratedToV8.json b/protocol-designer/fixtures/protocol/8/doItAllV7MigratedToV8.json index 5ceb1bedabb..ed361a2ca8c 100644 --- a/protocol-designer/fixtures/protocol/8/doItAllV7MigratedToV8.json +++ b/protocol-designer/fixtures/protocol/8/doItAllV7MigratedToV8.json @@ -33,14 +33,12 @@ "displayName": "Water", "displayColor": "#b925ff", "description": null, - "pythonName": "liquid_1", "liquidGroupId": "0" }, "1": { "displayName": "Samples", "displayColor": "#ffd600", "description": null, - "pythonName": "liquid_2", "liquidGroupId": "1" } }, diff --git a/protocol-designer/fixtures/protocol/8/doItAllV8.json b/protocol-designer/fixtures/protocol/8/doItAllV8.json index 7015a8a0c94..048620440ac 100644 --- a/protocol-designer/fixtures/protocol/8/doItAllV8.json +++ b/protocol-designer/fixtures/protocol/8/doItAllV8.json @@ -30,14 +30,12 @@ "displayName": "h20", "description": null, "liquidGroupId": "0", - "pythonName": "liquid_1", "displayColor": "#b925ff" }, "1": { "displayName": "sample", "description": null, "liquidGroupId": "1", - "pythonName": "liquid_2", "displayColor": "#ffd600" } }, diff --git a/protocol-designer/fixtures/protocol/8/example_1_1_0MigratedToV8.json b/protocol-designer/fixtures/protocol/8/example_1_1_0MigratedToV8.json index dde560281b0..39c9fa91a5c 100644 --- a/protocol-designer/fixtures/protocol/8/example_1_1_0MigratedToV8.json +++ b/protocol-designer/fixtures/protocol/8/example_1_1_0MigratedToV8.json @@ -33,13 +33,11 @@ "displayName": "samples", "description": null, "displayColor": "#b925ff", - "pythonName": "liquid_1", "liquidGroupId": "0" }, "1": { "displayName": "dna", "description": null, - "pythonName": "liquid_2", "displayColor": "#ffd600", "liquidGroupId": "1" } diff --git a/protocol-designer/fixtures/protocol/8/thermocyclerOnOt2V7MigratedToV8.json b/protocol-designer/fixtures/protocol/8/thermocyclerOnOt2V7MigratedToV8.json index 0fdb37a057e..454f54396b1 100644 --- a/protocol-designer/fixtures/protocol/8/thermocyclerOnOt2V7MigratedToV8.json +++ b/protocol-designer/fixtures/protocol/8/thermocyclerOnOt2V7MigratedToV8.json @@ -30,7 +30,6 @@ "displayName": "123", "displayColor": "#b925ff", "description": null, - "pythonName": "liquid_1", "liquidGroupId": "0" } }, diff --git a/protocol-designer/src/file-data/__fixtures__/createFile/commonFields.ts b/protocol-designer/src/file-data/__fixtures__/createFile/commonFields.ts index 14ae24e1001..4e271ce146e 100644 --- a/protocol-designer/src/file-data/__fixtures__/createFile/commonFields.ts +++ b/protocol-designer/src/file-data/__fixtures__/createFile/commonFields.ts @@ -40,16 +40,19 @@ export const labwareEntities: LabwareEntities = { labwareDefURI: 'opentrons/opentrons_1_trash_1100ml_fixed/1', id: 'fixedTrash', def: fixtureTrash, + pythonName: 'mockPythonName', }, tiprackId: { labwareDefURI: 'opentrons/opentrons_96_tiprack_10ul/1', id: 'tiprackId', def: fixtureTiprack10ul, + pythonName: 'mockPythonName', }, plateId: { labwareDefURI: 'opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1', id: 'plateId', def: fixture96Plate, + pythonName: 'mockPythonName', }, } export const pipetteEntities: PipetteEntities = { @@ -59,6 +62,7 @@ export const pipetteEntities: PipetteEntities = { spec: fixtureP10SingleV2Specs, tiprackDefURI: ['opentrons/opentrons_96_tiprack_10ul/1'], tiprackLabwareDef: [fixtureTiprack10ul], + pythonName: 'mockPythonName', }, } export const labwareNicknamesById: Record = { diff --git a/protocol-designer/src/file-data/__fixtures__/createFile/engageMagnet.ts b/protocol-designer/src/file-data/__fixtures__/createFile/engageMagnet.ts index fc32b152c91..95589f0d774 100644 --- a/protocol-designer/src/file-data/__fixtures__/createFile/engageMagnet.ts +++ b/protocol-designer/src/file-data/__fixtures__/createFile/engageMagnet.ts @@ -87,5 +87,6 @@ export const moduleEntities: ModuleEntities = { id: 'magneticModuleId', type: 'magneticModuleType', model: 'magneticModuleV1', + pythonName: 'mockPythonName', }, } diff --git a/protocol-designer/src/file-data/__tests__/createFile.test.ts b/protocol-designer/src/file-data/__tests__/createFile.test.ts index 6c50a9f02df..34428f5c70b 100644 --- a/protocol-designer/src/file-data/__tests__/createFile.test.ts +++ b/protocol-designer/src/file-data/__tests__/createFile.test.ts @@ -132,11 +132,13 @@ describe('getLabwareDefinitionsInUse util', () => { id: 'someLabwareId', def: assignedTiprackOnDeckDef as LabwareDefinition2, labwareDefURI: 'assignedTiprackOnDeckURI', + pythonName: 'mockPythonName', }, otherLabwareId: { id: 'otherLabwareId', def: nonTiprackLabwareOnDeckDef as LabwareDefinition2, labwareDefURI: 'nonTiprackLabwareOnDeckURI', + pythonName: 'mockPythonName', }, } const allLabwareDefsByURI: LabwareDefByDefURI = { diff --git a/protocol-designer/src/file-data/__tests__/utils.test.tsx b/protocol-designer/src/file-data/__tests__/utils.test.tsx index 34d08ca6f4b..61d533414b5 100644 --- a/protocol-designer/src/file-data/__tests__/utils.test.tsx +++ b/protocol-designer/src/file-data/__tests__/utils.test.tsx @@ -26,6 +26,7 @@ describe('getPipettesLoadInfo', () => { name: fixtureP1000SingleV2Specs.displayName as PipetteName, id: pipId, tiprackDefURI: [], + pythonName: 'mockPythonName', }, }) ).toEqual(results) @@ -46,6 +47,7 @@ describe('getModuleLoadInfo', () => { id: moduleId, model: 'magneticModuleV2', type: 'magneticModuleType', + pythonName: 'mockPythonName', }, }) ).toEqual(results) @@ -73,6 +75,7 @@ describe('getLabwareLoadInfo', () => { id: labwareId, labwareDefURI: uri, def: fixture96Plate as LabwareDefinition2, + pythonName: 'mockPythonName', }, }, labwareNicknamesById diff --git a/protocol-designer/src/file-data/selectors/fileCreator.ts b/protocol-designer/src/file-data/selectors/fileCreator.ts index 2695cfbc58d..b990d367b64 100644 --- a/protocol-designer/src/file-data/selectors/fileCreator.ts +++ b/protocol-designer/src/file-data/selectors/fileCreator.ts @@ -33,6 +33,7 @@ import type { PipetteEntity, LabwareEntities, PipetteEntities, + Ingredients, } from '@opentrons/step-generation' import type { CommandAnnotationV1Mixin, @@ -140,6 +141,29 @@ export const createFile: Selector = createSelector( const savedOrderedStepIds = orderedStepIds.filter( stepId => savedStepForms[stepId] ) + + const ingredients: Ingredients = Object.entries(liquidEntities).reduce( + (acc: Ingredients, [liquidId, liquidData]) => { + const { + displayName, + description, + displayColor, + liquidGroupId, + liquidClass, + } = liquidData + + acc[liquidId] = { + displayName, + description, + displayColor, + liquidGroupId, + liquidClass, + } + return acc + }, + {} + ) + const designerApplication = { name: 'opentrons/protocol-designer', version: applicationVersion, @@ -151,7 +175,7 @@ export const createFile: Selector = createSelector( p.tiprackDefURI ), dismissedWarnings, - ingredients: liquidEntities, + ingredients, ingredLocations, savedStepForms, orderedStepIds: savedOrderedStepIds, diff --git a/protocol-designer/src/file-types.ts b/protocol-designer/src/file-types.ts index 41d7a9fe076..58923b3ef85 100644 --- a/protocol-designer/src/file-types.ts +++ b/protocol-designer/src/file-types.ts @@ -3,7 +3,7 @@ import type { PipetteName, ProtocolFile, } from '@opentrons/shared-data' -import type { LiquidEntities } from '@opentrons/step-generation' +import type { Ingredients } from '@opentrons/step-generation' import type { RootState as IngredRoot } from './labware-ingred/reducers' import type { RootState as StepformRoot } from './step-forms' import type { RootState as DismissRoot } from './dismiss' @@ -25,7 +25,7 @@ export interface PDMetadata { // pipetteId to tiprackModel pipetteTiprackAssignments: Record dismissedWarnings: DismissRoot['dismissedWarnings'] - ingredients: LiquidEntities + ingredients: Ingredients ingredLocations: IngredRoot['ingredLocations'] savedStepForms: StepformRoot['savedStepForms'] orderedStepIds: StepformRoot['orderedStepIds'] diff --git a/protocol-designer/src/labware-ingred/__tests__/actions.test.ts b/protocol-designer/src/labware-ingred/__tests__/actions.test.ts index 7610de0702f..be7b4953134 100644 --- a/protocol-designer/src/labware-ingred/__tests__/actions.test.ts +++ b/protocol-designer/src/labware-ingred/__tests__/actions.test.ts @@ -118,6 +118,7 @@ describe('createContainer', () => { id: 'fakeUuid:someLabwareDefURI', labwareDefURI: 'someLabwareDefURI', slot: '4', + displayCategory: 'wellPlate', }, }, ] @@ -163,6 +164,7 @@ describe('createContainer', () => { id: 'fakeUuid:someLabwareDefURI', labwareDefURI: 'someLabwareDefURI', slot: '3', + displayCategory: 'wellPlate', }, }, ] @@ -254,6 +256,7 @@ describe('createContainer', () => { id: 'fakeUuid:someLabwareDefURI', labwareDefURI: 'someLabwareDefURI', slot: '4', + displayCategory: 'tipRack', }, }, { diff --git a/protocol-designer/src/labware-ingred/actions/actions.ts b/protocol-designer/src/labware-ingred/actions/actions.ts index ea6e606415a..12f8b93b6a4 100644 --- a/protocol-designer/src/labware-ingred/actions/actions.ts +++ b/protocol-designer/src/labware-ingred/actions/actions.ts @@ -4,7 +4,12 @@ import { selectors } from '../selectors' import type { StepFieldName } from '../../form-types' import type { DeckSlot, ThunkAction } from '../../types' import type { Fixture, IngredInputs } from '../types' -import type { CutoutId, ModuleModel } from '@opentrons/shared-data' +import type { + CutoutId, + LabwareDisplayCategory, + ModuleModel, +} from '@opentrons/shared-data' +import type { LiquidEntities, LiquidEntity } from '@opentrons/step-generation' // ===== Labware selector actions ===== export interface OpenAddLabwareModalAction { @@ -69,6 +74,7 @@ export interface CreateContainerAction { payload: CreateContainerArgs & { slot: DeckSlot id: string + displayCategory: LabwareDisplayCategory } } export interface DeleteContainerAction { @@ -77,10 +83,6 @@ export interface DeleteContainerAction { labwareId: string } } -// @ts-expect-error(sa, 2021-6-20): creatActions doesn't return exact actions -export const deleteContainer: (payload: { - labwareId: string -}) => DeleteContainerAction = createAction('DELETE_CONTAINER') // =========== export interface SwapSlotContentsAction { type: 'MOVE_DECK_ITEM' @@ -108,6 +110,7 @@ export interface DuplicateLabwareAction { duplicateLabwareId: string duplicateLabwareNickname: string slot: DeckSlot + displayCategory: LabwareDisplayCategory } } @@ -128,7 +131,7 @@ export const removeWellsContents: ( export interface EditMultipleLiquidGroupsAction { type: 'EDIT_MULTIPLE_LIQUID_GROUPS_PYTHON_NAME' - payload: Record // Updated liquid group pythonName + payload: LiquidEntities // Updated liquid group pythonName } export interface DeleteLiquidGroupAction { @@ -163,7 +166,7 @@ export const deleteLiquidGroup: ( const updatedLiquidGroupPythonName = Object.keys(remainingLiquidEntities) .sort() // sort to ensure correct order - .reduce>((acc, oldId, index) => { + .reduce>((acc, oldId, index) => { acc[oldId] = { ...remainingLiquidEntities[oldId], pythonName: `liquid_${index + 1}`, @@ -227,20 +230,22 @@ export interface EditLiquidGroupAction { type: 'EDIT_LIQUID_GROUP' payload: IngredInputs & { liquidGroupId: string + pythonName: string } } // NOTE: with no ID, a new one is assigned export const editLiquidGroup: ( args: IngredInputs ) => ThunkAction = args => (dispatch, getState) => { - const { liquidGroupId, ...payloadArgs } = args // NOTE: separate liquidGroupId for flow to understand unpacking :/ - + const { liquidGroupId: liquidGroupIdFromArg, ...payloadArgs } = args + const liquidGroupId = + liquidGroupIdFromArg || selectors.getNextLiquidGroupId(getState()) dispatch({ type: 'EDIT_LIQUID_GROUP', payload: { ...payloadArgs, - liquidGroupId: - args.liquidGroupId || selectors.getNextLiquidGroupId(getState()), + liquidGroupId, + pythonName: `liquid_${parseInt(liquidGroupId) + 1}`, }, }) } diff --git a/protocol-designer/src/labware-ingred/actions/thunks.ts b/protocol-designer/src/labware-ingred/actions/thunks.ts index 38cccb252fb..02ed71678e8 100644 --- a/protocol-designer/src/labware-ingred/actions/thunks.ts +++ b/protocol-designer/src/labware-ingred/actions/thunks.ts @@ -1,17 +1,24 @@ import { getIsTiprack } from '@opentrons/shared-data' -import { uuid } from '../../utils' +import { getLabwarePythonName, uuid } from '../../utils' +import { getLabwareEntities } from '../../step-forms/selectors' import { selectors as labwareDefSelectors } from '../../labware-defs' import { selectors as stepFormSelectors } from '../../step-forms' import { selectors as uiLabwareSelectors } from '../../ui/labware' import { getNextAvailableDeckSlot, getNextNickname } from '../utils' import { getRobotType } from '../../file-data/selectors' +import type { LabwareEntities } from '@opentrons/step-generation' import { selectNestedLabware, selectLabware, selectModule, selectFixture, } from './actions' -import type { LabwareOnDeck, ModuleOnDeck } from '../../step-forms' +import type { + LabwareOnDeck, + ModuleOnDeck, + NormalizedLabware, + NormalizedLabwareById, +} from '../../step-forms' import type { CreateContainerArgs, CreateContainerAction, @@ -20,6 +27,7 @@ import type { SelectLabwareAction, SelectModuleAction, SelectFixtureAction, + DeleteContainerAction, } from './actions' import type { ThunkAction } from '../../types' import type { Fixture } from '../types' @@ -69,6 +77,7 @@ export const createContainer: ( const labwareDef = labwareDefSelectors.getLabwareDefsByURI(state)[ args.labwareDefURI ] + const displayCategory = labwareDef.metadata.displayCategory const slot = args.slot || getNextAvailableDeckSlot(initialDeckSetup, robotType, labwareDef) @@ -88,6 +97,7 @@ export const createContainer: ( labwareDefURI: args.adapterUnderLabwareDefURI, id: adapterId, slot, + displayCategory, }, }) dispatch({ @@ -96,12 +106,13 @@ export const createContainer: ( ...args, id, slot: adapterId, + displayCategory, }, }) } else { dispatch({ type: 'CREATE_CONTAINER', - payload: { ...args, id, slot }, + payload: { ...args, id, slot, displayCategory }, }) } if (isTiprack) { @@ -138,6 +149,7 @@ export const duplicateLabware: ( const labwareDef = labwareDefSelectors.getLabwareDefsByURI(state)[ templateLabwareDefURI ] + const displayCategory = labwareDef.metadata.displayCategory const duplicateSlot = getNextAvailableDeckSlot( initialDeckSetup, robotType, @@ -163,6 +175,7 @@ export const duplicateLabware: ( templateLabwareId, duplicateLabwareId, slot: 'offDeck', + displayCategory, }, }) } @@ -175,6 +188,7 @@ export const duplicateLabware: ( templateLabwareId, duplicateLabwareId, slot: duplicateSlot, + displayCategory, }, }) } @@ -215,3 +229,65 @@ export const editSlotInfo: ( dispatch(selectModule({ moduleModel: createdModuleForSlot?.model ?? null })) dispatch(selectFixture({ fixture: preSelectedFixture ?? null })) } + +export interface EditMultipleLabwareAction { + type: 'EDIT_MULTIPLE_LABWARE_PYTHON_NAME' + payload: NormalizedLabwareById +} + +interface DeleteContainerArgs { + labwareId: string +} +export const deleteContainer: ( + args: DeleteContainerArgs +) => ThunkAction = args => ( + dispatch, + getState +) => { + const { labwareId } = args + const state = getState() + const labwareEntities = getLabwareEntities(state) + const displayCategory = + labwareEntities[labwareId].def.metadata.displayCategory + const labwareOfSameCategory: LabwareEntities = Object.fromEntries( + Object.entries(labwareEntities).filter( + ([_, labware]) => labware.def.metadata.displayCategory === displayCategory + ) + ) + const typeCount = Object.keys(labwareOfSameCategory).length + + dispatch({ + type: 'DELETE_CONTAINER', + payload: { + labwareId, + }, + }) + + if (typeCount > 1) { + const { + [labwareId]: _, + ...remainingLabwareEntities + } = labwareOfSameCategory + + const updatedLabwarePythonName: NormalizedLabwareById = Object.keys( + remainingLabwareEntities + ) + .sort() + .reduce>( + (acc: NormalizedLabwareById, oldId, index) => { + acc[oldId] = { + ...remainingLabwareEntities[oldId], + pythonName: getLabwarePythonName(displayCategory, index + 1), + displayCategory, + } + return acc + }, + {} + ) + + dispatch({ + type: 'EDIT_MULTIPLE_LABWARE_PYTHON_NAME', + payload: updatedLabwarePythonName, + }) + } +} diff --git a/protocol-designer/src/labware-ingred/reducers/index.ts b/protocol-designer/src/labware-ingred/reducers/index.ts index ad7db0864da..e2fb4db914f 100644 --- a/protocol-designer/src/labware-ingred/reducers/index.ts +++ b/protocol-designer/src/labware-ingred/reducers/index.ts @@ -9,11 +9,12 @@ import type { SingleLabwareLiquidState, LocationLiquidState, LabwareLiquidState, + LiquidEntities, + LiquidEntity, } from '@opentrons/step-generation' import type { LoadLabwareCreateCommand } from '@opentrons/shared-data' import type { Action, DeckSlot } from '../../types' import type { - LiquidGroupsById, DisplayLabware, ZoomedIntoSlotInfoState, GenerateNewProtocolState, @@ -272,7 +273,7 @@ export const savedLabware: Reducer = handleActions( }, {} ) -export type IngredientsState = LiquidGroupsById +export type IngredientsState = LiquidEntities // @ts-expect-error(sa, 2021-6-20): cannot use string literals as action type // TODO IMMEDIATELY: refactor this to the old fashioned way if we cannot have type safety: https://github.com/redux-utilities/redux-actions/issues/282#issuecomment-595163081 export const ingredients: Reducer = handleActions( @@ -306,7 +307,20 @@ export const ingredients: Reducer = handleActions( LOAD_FILE: ( state: IngredientsState, action: LoadFileAction - ): IngredientsState => getPDMetadata(action.payload.file).ingredients, + ): IngredientsState => { + const ingredients = getPDMetadata(action.payload.file).ingredients + + return Object.entries(ingredients).reduce>( + (acc, [key, ingredient]) => { + acc[key] = { + ...ingredient, + pythonName: `liquid_${parseInt(key) + 1}`, + } + return acc + }, + {} + ) + }, }, {} ) diff --git a/protocol-designer/src/labware-ingred/selectors.ts b/protocol-designer/src/labware-ingred/selectors.ts index a9c674a293b..0124262fede 100644 --- a/protocol-designer/src/labware-ingred/selectors.ts +++ b/protocol-designer/src/labware-ingred/selectors.ts @@ -5,10 +5,7 @@ import max from 'lodash/max' import reduce from 'lodash/reduce' import type { Selector } from 'reselect' import type { DropdownOption } from '@opentrons/components' -import type { - LabwareLiquidState, - LiquidEntity, -} from '@opentrons/step-generation' +import type { Ingredient, LabwareLiquidState } from '@opentrons/step-generation' import type { CutoutId } from '@opentrons/shared-data' import type { RootState, @@ -57,7 +54,7 @@ const getLiquidNamesById: Selector< ingredGroups => mapValues( ingredGroups, - (ingred: LiquidEntity) => ingred.displayName + (ingred: Ingredient) => ingred.displayName ) as Record ) const getLiquidSelectionOptions: Selector< diff --git a/protocol-designer/src/labware-ingred/types.ts b/protocol-designer/src/labware-ingred/types.ts index aaa86cf4b2f..dbe6f56f752 100644 --- a/protocol-designer/src/labware-ingred/types.ts +++ b/protocol-designer/src/labware-ingred/types.ts @@ -1,7 +1,7 @@ import type { CutoutId, ModuleModel } from '@opentrons/shared-data' import type { DeckSlot, - LiquidEntity, + Ingredient, LocationLiquidState, } from '@opentrons/step-generation' // TODO Ian 2018-02-19 make these shared in component library, standardize with Run App @@ -25,10 +25,10 @@ export interface WellContents { } export type ContentsByWell = Record | null export type WellContentsByLabware = Record -export type IngredInputs = LiquidEntity & { +export type IngredInputs = Ingredient & { volume?: number | null } -export type LiquidGroupsById = Record +export type LiquidGroupsById = Record export type AllIngredGroupFields = Record export type Fixture = diff --git a/protocol-designer/src/load-file/migration/8_5_0.ts b/protocol-designer/src/load-file/migration/8_5_0.ts index bbf2fda4c62..f75d6df2c0e 100644 --- a/protocol-designer/src/load-file/migration/8_5_0.ts +++ b/protocol-designer/src/load-file/migration/8_5_0.ts @@ -7,7 +7,7 @@ import type { LoadLabwareCreateCommand, ProtocolFile, } from '@opentrons/shared-data' -import type { LiquidEntities } from '@opentrons/step-generation' +import type { Ingredients } from '@opentrons/step-generation' import type { DesignerApplicationData } from './utils/getLoadLiquidCommands' import type { PDMetadata } from '../../file-types' @@ -30,15 +30,14 @@ export const migrateFile = ( const ingredients = designerApplication.data.ingredients - const migratedIngredients: LiquidEntities = Object.entries( + const migratedIngredients: Ingredients = Object.entries( ingredients - ).reduce((acc, [id, ingredient]) => { + ).reduce((acc, [id, ingredient]) => { acc[id] = { displayName: ingredient.name ?? '', liquidClass: ingredient.liquidClass, description: ingredient.description ?? null, liquidGroupId: id, - pythonName: `liquid_${parseInt(id) + 1}`, displayColor: liquids[id].displayColor ?? swatchColors(id), } return acc diff --git a/protocol-designer/src/modules/__tests__/moduleData.test.tsx b/protocol-designer/src/modules/__tests__/moduleData.test.tsx index 1cc180156df..d8950671c08 100644 --- a/protocol-designer/src/modules/__tests__/moduleData.test.tsx +++ b/protocol-designer/src/modules/__tests__/moduleData.test.tsx @@ -53,6 +53,7 @@ describe('getNextAvailableModuleSlot', () => { type: 'thermocyclerModuleType', slot: 'B1', moduleState: {} as any, + pythonName: 'mockPythonName', }, temperature: { model: 'temperatureModuleV2', @@ -60,6 +61,7 @@ describe('getNextAvailableModuleSlot', () => { type: 'temperatureModuleType', slot: 'C1', moduleState: {} as any, + pythonName: 'mockPythonName', }, }, labware: {}, diff --git a/protocol-designer/src/modules/thunks.ts b/protocol-designer/src/modules/thunks.ts index 9998a2d29b1..cf807bf683c 100644 --- a/protocol-designer/src/modules/thunks.ts +++ b/protocol-designer/src/modules/thunks.ts @@ -1,8 +1,14 @@ import { selectors as stepFormSelectors } from '../step-forms' -import { uuid } from '../utils' +import { getModulePythonName, uuid } from '../utils' +import { getModuleEntities } from '../step-forms/selectors' import { getNextAvailableModuleSlot } from './moduleData' +import type { ModuleEntity } from '@opentrons/step-generation' import type { ModuleModel, ModuleType } from '@opentrons/shared-data' -import type { CreateModuleAction } from '../step-forms/actions' +import type { ModuleEntities } from '../step-forms' +import type { + CreateModuleAction, + DeleteModuleAction, +} from '../step-forms/actions' import type { ThunkAction } from '../types' interface CreateModuleWithNoSloArgs { @@ -31,3 +37,57 @@ export const createModuleWithNoSlot: ( }, }) } + +export interface EditMultipleModulesAction { + type: 'EDIT_MULTIPLE_MODULES_PYTHON_NAME' + payload: ModuleEntities +} + +interface DeleteModuleArgs { + moduleId: string +} +export const deleteModule: ( + args: DeleteModuleArgs +) => ThunkAction = args => ( + dispatch, + getState +) => { + const { moduleId } = args + const state = getState() + const moduleEntities = getModuleEntities(state) + const moduleType = moduleEntities[moduleId].type + const modulesOfSameType: ModuleEntities = Object.fromEntries( + Object.entries(moduleEntities).filter( + ([_, module]) => module.type === moduleType + ) + ) + const typeCount = Object.keys(modulesOfSameType).length + + dispatch({ + type: 'DELETE_MODULE', + payload: { + id: moduleId, + }, + }) + + if (typeCount > 1) { + const { [moduleId]: _, ...remainingModuleEntities } = modulesOfSameType + + const updatedModulePythonName: ModuleEntities = Object.keys( + remainingModuleEntities + ) + .sort() + .reduce>((acc, oldId, index) => { + acc[oldId] = { + ...remainingModuleEntities[oldId], + pythonName: getModulePythonName(moduleType, index + 1), + } + return acc + }, {}) + + dispatch({ + type: 'EDIT_MULTIPLE_MODULES_PYTHON_NAME', + payload: updatedModulePythonName, + }) + } +} diff --git a/protocol-designer/src/organisms/DefineLiquidsModal/index.tsx b/protocol-designer/src/organisms/DefineLiquidsModal/index.tsx index d925560cbf1..2e25ec3a73b 100644 --- a/protocol-designer/src/organisms/DefineLiquidsModal/index.tsx +++ b/protocol-designer/src/organisms/DefineLiquidsModal/index.tsx @@ -40,7 +40,7 @@ import { swatchColors } from './swatchColors' import type { ColorResult, RGBColor } from 'react-color' import type { ThunkDispatch } from 'redux-thunk' import type { BaseState } from '../../types' -import type { LiquidEntity } from '@opentrons/step-generation' +import type { Ingredient } from '@opentrons/step-generation' const liquidEditFormSchema: any = Yup.object().shape({ displayName: Yup.string().required('liquid name is required'), @@ -90,7 +90,7 @@ export function DefineLiquidsModal( onClose() } - const saveForm = (formData: LiquidEntity): void => { + const saveForm = (formData: Ingredient): void => { dispatch( labwareIngredActions.editLiquidGroup({ ...formData, @@ -103,12 +103,11 @@ export function DefineLiquidsModal( liquidGroupId != null ? allIngredientGroupFields[liquidGroupId] : null const liquidId = selectedLiquid.liquidGroupId ?? nextGroupId - const initialValues: LiquidEntity = { + const initialValues: Ingredient = { displayName: selectedIngredFields?.displayName ?? '', displayColor: selectedIngredFields?.displayColor ?? swatchColors(liquidId), liquidClass: selectedIngredFields?.liquidClass ?? '', description: selectedIngredFields?.description ?? '', - pythonName: `liquid_${parseInt(liquidGroupId ?? nextGroupId) + 1}`, liquidGroupId: liquidGroupId ?? nextGroupId, } @@ -119,7 +118,7 @@ export function DefineLiquidsModal( watch, setValue, register, - } = useForm({ + } = useForm({ defaultValues: initialValues, // eslint-disable-next-line @typescript-eslint/no-unsafe-argument resolver: yupResolver(liquidEditFormSchema), @@ -129,14 +128,13 @@ export function DefineLiquidsModal( const liquidClass = watch('liquidClass') const { errors, touchedFields } = formState - const handleLiquidEdits = (values: LiquidEntity): void => { + const handleLiquidEdits = (values: Ingredient): void => { saveForm({ displayName: values.displayName, displayColor: values.displayColor, liquidClass: values.liquidClass !== '' ? values.liquidClass ?? undefined : undefined, description: values.description !== '' ? values.description : null, - pythonName: values.pythonName, liquidGroupId: values.liquidGroupId, }) } diff --git a/protocol-designer/src/organisms/EditInstrumentsModal/__tests__/utils.test.ts b/protocol-designer/src/organisms/EditInstrumentsModal/__tests__/utils.test.ts index e46af101944..b9088cdf819 100644 --- a/protocol-designer/src/organisms/EditInstrumentsModal/__tests__/utils.test.ts +++ b/protocol-designer/src/organisms/EditInstrumentsModal/__tests__/utils.test.ts @@ -5,11 +5,13 @@ const mockLeftPipette = { mount: 'left', id: 'mockLeft', name: 'p50_single_flex', + pythonName: 'mockPythonName', } as any const mockRightPiette = { mount: 'right', id: 'mockRight', name: 'p50_multi_flex', + pythonName: 'mockPythonName', } as any describe('getShouldShowPipetteType', () => { diff --git a/protocol-designer/src/organisms/EditInstrumentsModal/editPipettes.ts b/protocol-designer/src/organisms/EditInstrumentsModal/editPipettes.ts index a92e6717d33..5041b4bd9c1 100644 --- a/protocol-designer/src/organisms/EditInstrumentsModal/editPipettes.ts +++ b/protocol-designer/src/organisms/EditInstrumentsModal/editPipettes.ts @@ -19,7 +19,7 @@ const adapter96ChannelDefUri = 'opentrons/opentrons_flex_96_tiprack_adapter/1' type PipetteFieldsData = Omit< PipetteOnDeck, - 'id' | 'spec' | 'tiprackLabwareDef' + 'id' | 'spec' | 'tiprackLabwareDef' | 'pythonName' > export const editPipettes = ( diff --git a/protocol-designer/src/organisms/MaterialsListModal/__tests__/MaterialsListModal.test.tsx b/protocol-designer/src/organisms/MaterialsListModal/__tests__/MaterialsListModal.test.tsx index 842227c85a7..59b19ce260c 100644 --- a/protocol-designer/src/organisms/MaterialsListModal/__tests__/MaterialsListModal.test.tsx +++ b/protocol-designer/src/organisms/MaterialsListModal/__tests__/MaterialsListModal.test.tsx @@ -60,6 +60,7 @@ const mockLabware = [ id: 'mockLabware', labwareDefURI: 'opentrons/opentrons_flex_96_filtertiprack_50ul/1', slot: 'D3', + pythonName: 'mockPythonName', }, ] as LabwareOnDeck[] @@ -139,6 +140,7 @@ describe('MaterialsListModal', () => { }, slot: '7', type: 'thermocyclerModuleType', + pythonName: 'mockPythonName', }, ] as ModuleOnDeck[] props = { diff --git a/protocol-designer/src/organisms/SelectWellsModal/__tests__/SelectWellsModal.test.tsx b/protocol-designer/src/organisms/SelectWellsModal/__tests__/SelectWellsModal.test.tsx index 104022625c4..4faf6647467 100644 --- a/protocol-designer/src/organisms/SelectWellsModal/__tests__/SelectWellsModal.test.tsx +++ b/protocol-designer/src/organisms/SelectWellsModal/__tests__/SelectWellsModal.test.tsx @@ -55,6 +55,7 @@ describe('SelectWellsModal', () => { id: labwareId, labwareDefURI: 'mockUri', def: fixture96Plate as LabwareDefinition2, + pythonName: 'mockPythonName', }, }) vi.mocked(getPipetteEntities).mockReturnValue({ @@ -64,6 +65,7 @@ describe('SelectWellsModal', () => { name: fixtureP1000SingleV2Specs.displayName as PipetteName, id: pipId, tiprackDefURI: [], + pythonName: 'mockPythonName', }, }) }) diff --git a/protocol-designer/src/pages/CreateNewProtocolWizard/index.tsx b/protocol-designer/src/pages/CreateNewProtocolWizard/index.tsx index 2e29273b9ac..1202abaa7f8 100644 --- a/protocol-designer/src/pages/CreateNewProtocolWizard/index.tsx +++ b/protocol-designer/src/pages/CreateNewProtocolWizard/index.tsx @@ -90,7 +90,7 @@ const adapter96ChannelDefUri = 'opentrons/opentrons_flex_96_tiprack_adapter/1' type PipetteFieldsData = Omit< PipetteOnDeck, - 'id' | 'spec' | 'tiprackLabwareDef' + 'id' | 'spec' | 'tiprackLabwareDef' | 'pythonName' > interface ModuleCreationArgs { diff --git a/protocol-designer/src/pages/Designer/DeckSetup/DeckSetupTools.tsx b/protocol-designer/src/pages/Designer/DeckSetup/DeckSetupTools.tsx index d997835e831..c8df84d50bc 100644 --- a/protocol-designer/src/pages/Designer/DeckSetup/DeckSetupTools.tsx +++ b/protocol-designer/src/pages/Designer/DeckSetup/DeckSetupTools.tsx @@ -37,7 +37,7 @@ import { deleteDeckFixture, } from '../../../step-forms/actions/additionalItems' import { getSavedStepForms } from '../../../step-forms/selectors' -import { deleteModule } from '../../../step-forms/actions' +import { deleteModule } from '../../../modules' import { getDeckSetupForActiveItem } from '../../../top-selectors/labware-locations' import { createContainer, @@ -292,7 +292,7 @@ export function DeckSetupTools(props: DeckSetupToolsProps): JSX.Element | null { if (slot !== 'offDeck') { // clear module from slot if (createdModuleForSlot != null) { - dispatch(deleteModule(createdModuleForSlot.id)) + dispatch(deleteModule({ moduleId: createdModuleForSlot.id })) } // clear labware from slot if ( diff --git a/protocol-designer/src/pages/Designer/DeckSetup/SlotOverflowMenu.tsx b/protocol-designer/src/pages/Designer/DeckSetup/SlotOverflowMenu.tsx index 6cf595a0d97..22a43c816b5 100644 --- a/protocol-designer/src/pages/Designer/DeckSetup/SlotOverflowMenu.tsx +++ b/protocol-designer/src/pages/Designer/DeckSetup/SlotOverflowMenu.tsx @@ -29,7 +29,7 @@ import { openIngredientSelector, } from '../../../labware-ingred/actions' import { getNextAvailableDeckSlot } from '../../../labware-ingred/utils' -import { deleteModule } from '../../../step-forms/actions' +import { deleteModule } from '../../../modules' import { ConfirmDeleteStagingAreaModal, EditNickNameModal, @@ -193,7 +193,7 @@ export function SlotOverflowMenu( const handleClear = (): void => { // clear module from slot if (moduleOnSlot != null) { - dispatch(deleteModule(moduleOnSlot.id)) + dispatch(deleteModule({ moduleId: moduleOnSlot.id })) } // clear fixture(s) from slot if (fixturesOnSlot.length > 0) { diff --git a/protocol-designer/src/pages/Designer/DeckSetup/__tests__/DeckSetupTools.test.tsx b/protocol-designer/src/pages/Designer/DeckSetup/__tests__/DeckSetupTools.test.tsx index cfc366baf85..c8bf4218473 100644 --- a/protocol-designer/src/pages/Designer/DeckSetup/__tests__/DeckSetupTools.test.tsx +++ b/protocol-designer/src/pages/Designer/DeckSetup/__tests__/DeckSetupTools.test.tsx @@ -11,7 +11,7 @@ import { i18n } from '../../../../assets/localization' import { renderWithProviders } from '../../../../__testing-utils__' import { deleteContainer } from '../../../../labware-ingred/actions' import { useKitchen } from '../../../../organisms/Kitchen/hooks' -import { deleteModule } from '../../../../step-forms/actions' +import { deleteModule } from '../../../../modules' import { getAdditionalEquipment, getSavedStepForms, @@ -32,7 +32,7 @@ vi.mock('../../../../feature-flags/selectors') vi.mock('../../../../file-data/selectors') vi.mock('../../../../top-selectors/labware-locations') vi.mock('../../../../labware-ingred/actions') -vi.mock('../../../../step-forms/actions') +vi.mock('../../../../modules') vi.mock('../../../../step-forms/actions/additionalItems') vi.mock('../../../../labware-ingred/selectors') vi.mock('../../../../tutorial/selectors') @@ -126,12 +126,14 @@ describe('DeckSetupTools', () => { id: 'labId', labwareDefURI: 'mockUri', def: fixture96Plate as LabwareDefinition2, + pythonName: 'mockPythonName', }, lab2: { slot: 'labId', id: 'labId2', labwareDefURI: 'mockUri', def: fixture96Plate as LabwareDefinition2, + pythonName: 'mockPythonName', }, }, pipettes: {}, @@ -142,6 +144,7 @@ describe('DeckSetupTools', () => { id: 'modId', slot: 'D3', moduleState: {} as any, + pythonName: 'mockPythonName', }, }, additionalEquipmentOnDeck: { diff --git a/protocol-designer/src/pages/Designer/DeckSetup/__tests__/LabwareTools.test.tsx b/protocol-designer/src/pages/Designer/DeckSetup/__tests__/LabwareTools.test.tsx index ce41f0e9210..90be7da2235 100644 --- a/protocol-designer/src/pages/Designer/DeckSetup/__tests__/LabwareTools.test.tsx +++ b/protocol-designer/src/pages/Designer/DeckSetup/__tests__/LabwareTools.test.tsx @@ -62,6 +62,7 @@ describe('LabwareTools', () => { name: 'p1000_single_flex', id: 'mockPipId', tiprackLabwareDef: [fixtureTiprack1000ul as LabwareDefinition2], + pythonName: 'mockPythonName', }, }) vi.mocked(selectors.getZoomedInSlotInfo).mockReturnValue({ diff --git a/protocol-designer/src/pages/Designer/DeckSetup/__tests__/SelectedHoveredItems.test.tsx b/protocol-designer/src/pages/Designer/DeckSetup/__tests__/SelectedHoveredItems.test.tsx index 9c6dccdbb4f..21ad9848363 100644 --- a/protocol-designer/src/pages/Designer/DeckSetup/__tests__/SelectedHoveredItems.test.tsx +++ b/protocol-designer/src/pages/Designer/DeckSetup/__tests__/SelectedHoveredItems.test.tsx @@ -62,6 +62,7 @@ describe('SelectedHoveredItems', () => { def: fixture24Tuberack as LabwareDefinition2, labwareDefURI: 'fixture/fixture_universal_flat_bottom_adapter/1', slot: 'D3', + pythonName: 'mockPythonName', }, }, }) @@ -134,12 +135,14 @@ describe('SelectedHoveredItems', () => { def: fixture24Tuberack as LabwareDefinition2, labwareDefURI: 'fixture/fixture_universal_flat_bottom_adapter/1', slot: 'D3', + pythonName: 'mockPythonName', }, labware2: { id: 'mockId2', def: fixture24Tuberack as LabwareDefinition2, labwareDefURI: 'fixture/fixture_universal_flat_bottom_adapter/1', slot: 'mockId', + pythonName: 'mockPythonName', }, }, }) diff --git a/protocol-designer/src/pages/Designer/DeckSetup/__tests__/SlotOverflowMenu.test.tsx b/protocol-designer/src/pages/Designer/DeckSetup/__tests__/SlotOverflowMenu.test.tsx index 1924ac7c961..565ac6d6176 100644 --- a/protocol-designer/src/pages/Designer/DeckSetup/__tests__/SlotOverflowMenu.test.tsx +++ b/protocol-designer/src/pages/Designer/DeckSetup/__tests__/SlotOverflowMenu.test.tsx @@ -9,9 +9,9 @@ import { duplicateLabware, openIngredientSelector, } from '../../../../labware-ingred/actions' +import { deleteModule } from '../../../../modules' import { EditNickNameModal } from '../../../../organisms' import { useKitchen } from '../../../../organisms/Kitchen/hooks' -import { deleteModule } from '../../../../step-forms/actions' import { deleteDeckFixture } from '../../../../step-forms/actions/additionalItems' import { getDeckSetupForActiveItem } from '../../../../top-selectors/labware-locations' import { selectors as labwareIngredSelectors } from '../../../../labware-ingred/selectors' @@ -25,7 +25,6 @@ import type { LabwareDefinition2 } from '@opentrons/shared-data' const mockNavigate = vi.fn() vi.mock('../../../../top-selectors/labware-locations') -vi.mock('../../../../step-forms/actions') vi.mock('../../../../labware-ingred/actions') vi.mock('../../../../labware-ingred/selectors') vi.mock('../../../../step-forms/actions/additionalItems') @@ -33,6 +32,7 @@ vi.mock('../../../../organisms') vi.mock('../../../../file-data/selectors') vi.mock('../../../../labware-ingred/utils') vi.mock('../../../../organisms/Kitchen/hooks') +vi.mock('../../../../modules') vi.mock('react-router-dom', async importOriginal => { const actual = await importOriginal() return { @@ -67,12 +67,14 @@ describe('SlotOverflowMenu', () => { id: 'labId', labwareDefURI: 'mockUri', def: fixture96Plate as LabwareDefinition2, + pythonName: 'mockPythonName', }, lab2: { slot: 'labId', id: 'labId2', labwareDefURI: 'mockUri', def: fixture96Plate as LabwareDefinition2, + pythonName: 'mockPythonName', }, }, pipettes: {}, @@ -83,6 +85,7 @@ describe('SlotOverflowMenu', () => { id: 'modId', slot: 'D3', moduleState: {} as any, + pythonName: 'mockPythonName', }, }, additionalEquipmentOnDeck: { @@ -175,7 +178,7 @@ describe('SlotOverflowMenu', () => { labwareId: 'labId2', }) expect(vi.mocked(deleteModule)).toHaveBeenCalledOnce() - expect(vi.mocked(deleteModule)).toHaveBeenCalledWith('modId') + expect(vi.mocked(deleteModule)).toHaveBeenCalledWith({ moduleId: 'modId' }) }) it('renders snackbar if duplicate is clicked and the deck is full', () => { diff --git a/protocol-designer/src/pages/Designer/DeckSetup/__tests__/utils.test.ts b/protocol-designer/src/pages/Designer/DeckSetup/__tests__/utils.test.ts index c2925185923..36f39d27f3a 100644 --- a/protocol-designer/src/pages/Designer/DeckSetup/__tests__/utils.test.ts +++ b/protocol-designer/src/pages/Designer/DeckSetup/__tests__/utils.test.ts @@ -80,6 +80,7 @@ describe('getDeckErrors', () => { id: 'mockId', slot: '4', moduleState: {} as any, + pythonName: 'mockPythonName', }, }, selectedSlot: '1', @@ -99,6 +100,7 @@ describe('getDeckErrors', () => { id: 'mockId', slot: '4', moduleState: {} as any, + pythonName: 'mockPythonName', }, }, selectedSlot: '1', diff --git a/protocol-designer/src/pages/Designer/Offdeck/__tests__/OffDeckDetails.test.tsx b/protocol-designer/src/pages/Designer/Offdeck/__tests__/OffDeckDetails.test.tsx index 51c2ccd0f1b..52b59a08040 100644 --- a/protocol-designer/src/pages/Designer/Offdeck/__tests__/OffDeckDetails.test.tsx +++ b/protocol-designer/src/pages/Designer/Offdeck/__tests__/OffDeckDetails.test.tsx @@ -58,6 +58,7 @@ describe('OffDeckDetails', () => { def: fixture12Trough as LabwareDefinition2, labwareDefURI: 'mockDefUri', slot: 'offDeck', + pythonName: 'mockPythonName', }, }, }) diff --git a/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/StepTools/__tests__/MagnetTools.test.tsx b/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/StepTools/__tests__/MagnetTools.test.tsx index 7d5c250462e..78e47ee2d92 100644 --- a/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/StepTools/__tests__/MagnetTools.test.tsx +++ b/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/StepTools/__tests__/MagnetTools.test.tsx @@ -81,6 +81,7 @@ describe('MagnetTools', () => { id: 'magnetId', model: 'magneticModuleV2', type: 'magneticModuleType', + pythonName: 'mockPythonName', }, }) vi.mocked(getMagnetLabwareEngageHeight).mockReturnValue(null) @@ -93,6 +94,7 @@ describe('MagnetTools', () => { type: 'magneticModuleType', moduleState: { engaged: false, type: 'magneticModuleType' }, model: 'magneticModuleV1', + pythonName: 'mockPythonName', }, }, additionalEquipmentOnDeck: {}, @@ -118,6 +120,7 @@ describe('MagnetTools', () => { id: 'magnetId', model: 'magneticModuleV1', type: 'magneticModuleType', + pythonName: 'mockPythonName', }, }) render(props) diff --git a/protocol-designer/src/pages/Designer/ProtocolSteps/Timeline/__tests__/AddStepButton.test.tsx b/protocol-designer/src/pages/Designer/ProtocolSteps/Timeline/__tests__/AddStepButton.test.tsx index a2fcea0a7e2..bbccfe5447f 100644 --- a/protocol-designer/src/pages/Designer/ProtocolSteps/Timeline/__tests__/AddStepButton.test.tsx +++ b/protocol-designer/src/pages/Designer/ProtocolSteps/Timeline/__tests__/AddStepButton.test.tsx @@ -50,6 +50,7 @@ describe('AddStepButton', () => { id: 'mockId', moduleState: {} as any, slot: 'A1', + pythonName: 'mockPythonName', }, tc: { model: THERMOCYCLER_MODULE_V1, @@ -57,6 +58,7 @@ describe('AddStepButton', () => { id: 'mockId', moduleState: {} as any, slot: 'B1', + pythonName: 'mockPythonName', }, temp: { model: TEMPERATURE_MODULE_V1, @@ -64,6 +66,7 @@ describe('AddStepButton', () => { id: 'mockId', moduleState: {} as any, slot: 'C1', + pythonName: 'mockPythonName', }, mag: { model: MAGNETIC_MODULE_V1, @@ -71,6 +74,7 @@ describe('AddStepButton', () => { id: 'mockId', moduleState: {} as any, slot: 'D1', + pythonName: 'mockPythonName', }, }, labware: {}, diff --git a/protocol-designer/src/pages/Designer/ProtocolSteps/Timeline/__tests__/StepOverflowMenu.test.tsx b/protocol-designer/src/pages/Designer/ProtocolSteps/Timeline/__tests__/StepOverflowMenu.test.tsx index 55197e85ed4..e9a9d8fda63 100644 --- a/protocol-designer/src/pages/Designer/ProtocolSteps/Timeline/__tests__/StepOverflowMenu.test.tsx +++ b/protocol-designer/src/pages/Designer/ProtocolSteps/Timeline/__tests__/StepOverflowMenu.test.tsx @@ -86,6 +86,7 @@ describe('StepOverflowMenu', () => { id: mockId, tiprackLabwareDef: [], tiprackDefURI: ['mockDefURI1', 'mockDefURI2'], + pythonName: 'mockPythonName', }, }) }) @@ -124,6 +125,7 @@ describe('StepOverflowMenu', () => { id: mockId96, tiprackLabwareDef: [], tiprackDefURI: ['mockDefURI1_96'], + pythonName: 'mockPythonName', }, }) render(props) diff --git a/protocol-designer/src/pages/Designer/__tests__/utils.test.ts b/protocol-designer/src/pages/Designer/__tests__/utils.test.ts index 2e22a095b24..d9ed087626d 100644 --- a/protocol-designer/src/pages/Designer/__tests__/utils.test.ts +++ b/protocol-designer/src/pages/Designer/__tests__/utils.test.ts @@ -17,18 +17,21 @@ const mockLabOnDeck1 = { id: 'labId', labwareDefURI: 'mockUri', def: fixture96Plate as LabwareDefinition2, + pythonName: 'mockPythonName', } const mockLabOnDeck2 = { slot: 'labId', id: 'labId2', labwareDefURI: 'mockUri2', def: fixture96Plate as LabwareDefinition2, + pythonName: 'mockPythonName', } const mockLabOnDeck3 = { slot: '2', id: 'labId3', labwareDefURI: 'mockUri3', def: fixture96Plate as LabwareDefinition2, + pythonName: 'mockPythonName', } const mockHS = { id: 'mockHsId', @@ -36,6 +39,7 @@ const mockHS = { type: HEATERSHAKER_MODULE_TYPE, slot: '1', moduleState: {} as any, + pythonName: 'mockPythonName', } const mockOt2DeckSetup: AllTemporalPropertiesForTimelineFrame = { @@ -53,6 +57,7 @@ const mockOt2DeckSetup: AllTemporalPropertiesForTimelineFrame = { type: TEMPERATURE_MODULE_TYPE, slot: '3', moduleState: {} as any, + pythonName: 'mockPythonName', }, }, additionalEquipmentOnDeck: { @@ -65,6 +70,7 @@ const mockLabOnStagingArea = { id: 'labId3', labwareDefURI: 'mockUri3', def: fixture96Plate as LabwareDefinition2, + pythonName: 'mockPythonName', } const mockHSFlex = { id: 'mockHsId', @@ -72,6 +78,7 @@ const mockHSFlex = { type: HEATERSHAKER_MODULE_TYPE, slot: 'D1', moduleState: {} as any, + pythonName: 'mockPythonName', } const mockTrash = { name: 'trashBin' as AdditionalEquipmentName, @@ -103,6 +110,7 @@ const mockFlex2DeckSetup: AllTemporalPropertiesForTimelineFrame = { type: TEMPERATURE_MODULE_TYPE, slot: 'C1', moduleState: {} as any, + pythonName: 'mockPythonName', }, }, additionalEquipmentOnDeck: { diff --git a/protocol-designer/src/pages/ProtocolOverview/__tests__/DeckThumbnail.test.tsx b/protocol-designer/src/pages/ProtocolOverview/__tests__/DeckThumbnail.test.tsx index bdae73a3e8f..55be5e09519 100644 --- a/protocol-designer/src/pages/ProtocolOverview/__tests__/DeckThumbnail.test.tsx +++ b/protocol-designer/src/pages/ProtocolOverview/__tests__/DeckThumbnail.test.tsx @@ -48,6 +48,7 @@ describe('DeckThumbnail', () => { def: fixture12Trough as LabwareDefinition2, labwareDefURI: 'mockDefUri', slot: 'A1', + pythonName: 'mockPythonName', }, }, }) diff --git a/protocol-designer/src/pages/ProtocolOverview/__tests__/OffdeckThumbnail.test.tsx b/protocol-designer/src/pages/ProtocolOverview/__tests__/OffdeckThumbnail.test.tsx index 027eaaab2a8..c4fc2775c18 100644 --- a/protocol-designer/src/pages/ProtocolOverview/__tests__/OffdeckThumbnail.test.tsx +++ b/protocol-designer/src/pages/ProtocolOverview/__tests__/OffdeckThumbnail.test.tsx @@ -51,6 +51,7 @@ describe('OffDeckThumbnail', () => { def: fixture12Trough as LabwareDefinition2, labwareDefURI: 'mockDefUri', slot: 'offDeck', + pythonName: 'mockPythonName', }, }, }) diff --git a/protocol-designer/src/step-forms/actions/modules.ts b/protocol-designer/src/step-forms/actions/modules.ts index f405d2773d3..6f378aaec49 100644 --- a/protocol-designer/src/step-forms/actions/modules.ts +++ b/protocol-designer/src/step-forms/actions/modules.ts @@ -36,9 +36,3 @@ export interface DeleteModuleAction { id: string } } -export const deleteModule = (id: string): DeleteModuleAction => ({ - type: 'DELETE_MODULE', - payload: { - id, - }, -}) diff --git a/protocol-designer/src/step-forms/reducers/index.ts b/protocol-designer/src/step-forms/reducers/index.ts index ef2b30ed303..669ea55e8ec 100644 --- a/protocol-designer/src/step-forms/reducers/index.ts +++ b/protocol-designer/src/step-forms/reducers/index.ts @@ -13,11 +13,7 @@ import { THERMOCYCLER_MODULE_TYPE, } from '@opentrons/shared-data' import { rootReducer as labwareDefsRootReducer } from '../../labware-defs' -import { - GRIPPER_LOCATION, - INITIAL_DECK_SETUP_STEP_ID, - SPAN7_8_10_11_SLOT, -} from '../../constants' +import { GRIPPER_LOCATION, INITIAL_DECK_SETUP_STEP_ID } from '../../constants' import { getPDMetadata } from '../../file-types' import { getDefaultsForStepType, @@ -26,6 +22,7 @@ import { import { PRESAVED_STEP_ID } from '../../steplist/types' import { getLabwareIsCompatible } from '../../utils/labwareModuleCompatibility' import { getLabwareOnModule } from '../../ui/modules/utils' +import { getLabwarePythonName, getModulePythonName } from '../../utils' import { nestedCombineReducers } from './nestedCombineReducers' import { _getPipetteEntitiesRootState, @@ -82,6 +79,7 @@ import type { CreateContainerAction, DeleteContainerAction, DuplicateLabwareAction, + EditMultipleLabwareAction, RenameStepAction, SwapSlotContentsAction, } from '../../labware-ingred/actions' @@ -95,7 +93,7 @@ import type { SelectMultipleStepsAction, } from '../../ui/steps/actions/types' import type { Action } from '../../types' -import type { ModuleLoadInfo, PipetteLoadInfo } from '../../file-types' +import type { PipetteLoadInfo } from '../../file-types' import type { AdditionalEquipmentLocationUpdate, LocationUpdate, @@ -105,6 +103,7 @@ import type { NormalizedLabwareById, ModuleEntities, } from '../types' +import type { EditMultipleModulesAction } from '../../modules' type FormState = FormData | null const unsavedFormInitialState = null @@ -702,22 +701,17 @@ export const savedStepForms = ( const moduleId = action.payload.id return mapValues(savedStepForms, (form: FormData) => { if (form.stepType === 'manualIntervention') { - // TODO: Ian 2019-10-28 when we have multiple manualIntervention steps, this should look backwards - // for the latest location update for the module, not just the initial deck setup - const _deletedModuleSlot = + const deletedModuleSlot = savedStepForms[INITIAL_DECK_SETUP_STEP_ID].moduleLocationUpdate[ moduleId ] - // handle special spanning slots that are intended for modules & not for labware - const labwareFallbackSlot = - _deletedModuleSlot === SPAN7_8_10_11_SLOT ? '7' : _deletedModuleSlot return { ...form, moduleLocationUpdate: omit(form.moduleLocationUpdate, moduleId), labwareLocationUpdate: mapValues( form.labwareLocationUpdate, labwareSlot => - labwareSlot === moduleId ? labwareFallbackSlot : labwareSlot + labwareSlot === moduleId ? deletedModuleSlot : labwareSlot ), } } else if ( @@ -949,6 +943,7 @@ export const batchEditFormChanges = ( } } } + const initialLabwareState: NormalizedLabwareById = {} // MIGRATION NOTE: copied from `containers` reducer. Slot + UI stuff stripped out. export const labwareInvariantProperties: Reducer< @@ -962,10 +957,22 @@ export const labwareInvariantProperties: Reducer< state: NormalizedLabwareById, action: CreateContainerAction ) => { + const { payload } = action + const { labwareDefURI, id, displayCategory } = payload + + const categoryLength = Object.values(state).filter( + labware => labware.displayCategory === displayCategory + ).length + return { ...state, - [action.payload.id]: { - labwareDefURI: action.payload.labwareDefURI, + [id]: { + labwareDefURI, + displayCategory, + pythonName: `${getLabwarePythonName( + displayCategory, + categoryLength + 1 + )}`, }, } }, @@ -973,10 +980,22 @@ export const labwareInvariantProperties: Reducer< state: NormalizedLabwareById, action: DuplicateLabwareAction ) => { + const { payload } = action + const { duplicateLabwareId, templateLabwareId, displayCategory } = payload + + const categoryLength = Object.values(state).filter( + labware => labware.displayCategory === displayCategory + ).length + return { ...state, - [action.payload.duplicateLabwareId]: { - labwareDefURI: state[action.payload.templateLabwareId].labwareDefURI, + [duplicateLabwareId]: { + labwareDefURI: state[templateLabwareId].labwareDefURI, + displayCategory, + pythonName: `${getLabwarePythonName( + displayCategory, + categoryLength + 1 + )}`, }, } }, @@ -992,22 +1011,75 @@ export const labwareInvariantProperties: Reducer< ): NormalizedLabwareById => { const { file } = action.payload const metadata = getPDMetadata(file) - return { ...metadata.labware, ...state } + const labwareDefinitions = file.labwareDefinitions + + const labware: NormalizedLabwareById = Object.entries( + metadata.labware + ).reduce((acc: NormalizedLabwareById, [id, labwareLoadInfo]) => { + if (labwareDefinitions[labwareLoadInfo.labwareDefURI] == null) { + console.error( + `expected to find matching labware definiton with labwareDefURI ${labwareLoadInfo.labwareDefURI} but could not` + ) + } + const displayCategory = + labwareDefinitions[labwareLoadInfo.labwareDefURI]?.metadata + .displayCategory ?? 'otherLabware' + + const displayCategoryCount = Object.values(acc).filter( + lw => lw.displayCategory === displayCategory + ).length + + acc[id] = { + labwareDefURI: labwareLoadInfo.labwareDefURI, + pythonName: getLabwarePythonName( + displayCategory, + displayCategoryCount + 1 + ), + displayCategory, + } + + return acc + }, {}) + + return { ...labware, ...state } + }, + EDIT_MULTIPLE_LABWARE_PYTHON_NAME: ( + state: NormalizedLabwareById, + action: EditMultipleLabwareAction + ): NormalizedLabwareById => { + return { + ...state, + ...action.payload, + } }, REPLACE_CUSTOM_LABWARE_DEF: ( state: NormalizedLabwareById, action: ReplaceCustomLabwareDef - ): NormalizedLabwareById => - mapValues( + ): NormalizedLabwareById => { + const { payload } = action + const { newDef, defURIToOverwrite } = payload + const displayCategory = newDef.metadata.displayCategory + const categoryLength = Object.values(state).filter( + labware => labware.displayCategory === displayCategory + ).length + + const mappedLabware = mapValues( state, (prev: NormalizedLabware): NormalizedLabware => - action.payload.defURIToOverwrite === prev.labwareDefURI + defURIToOverwrite === prev.labwareDefURI ? { ...prev, - labwareDefURI: getLabwareDefURI(action.payload.newDef), + labwareDefURI: getLabwareDefURI(newDef), + pythonName: getLabwarePythonName( + displayCategory, + categoryLength + 1 + ), + displayCategory, } : prev - ), + ) + return mappedLabware + }, }, initialLabwareState ) @@ -1021,14 +1093,23 @@ export const moduleInvariantProperties: Reducer< CREATE_MODULE: ( state: ModuleEntities, action: CreateModuleAction - ): ModuleEntities => ({ - ...state, - [action.payload.id]: { - id: action.payload.id, - type: action.payload.type, - model: action.payload.model, - }, - }), + ): ModuleEntities => { + const type = action.payload.type + const typeCount = Object.values(state).filter( + module => module.type === type + ).length + + return { + ...state, + [action.payload.id]: { + id: action.payload.id, + type, + model: action.payload.model, + pythonName: getModulePythonName(type, typeCount + 1), + }, + } + }, + EDIT_MODULE: ( state: ModuleEntities, action: EditModuleAction @@ -1043,6 +1124,15 @@ export const moduleInvariantProperties: Reducer< state: ModuleEntities, action: DeleteModuleAction ): ModuleEntities => omit(state, action.payload.id), + EDIT_MULTIPLE_MODULES_PYTHON_NAME: ( + state: ModuleEntities, + action: EditMultipleModulesAction + ): ModuleEntities => { + return { + ...state, + ...action.payload, + } + }, LOAD_FILE: ( state: ModuleEntities, action: LoadFileAction @@ -1050,15 +1140,19 @@ export const moduleInvariantProperties: Reducer< const { file } = action.payload const metadata = getPDMetadata(file) const modules: ModuleEntities = Object.entries(metadata.modules).reduce( - ( - acc: ModuleEntities, - [id, moduleLoadInfo]: [string, ModuleLoadInfo] - ) => { + (acc: ModuleEntities, [id, moduleLoadInfo]) => { + const moduleType = getModuleType(moduleLoadInfo.model) + const typeCount = Object.values(acc).filter( + module => module.type === moduleType + ).length + acc[id] = { - id: id, - type: getModuleType(moduleLoadInfo.model), + id, + type: moduleType, model: moduleLoadInfo.model, + pythonName: getModulePythonName(moduleType, typeCount + 1), } + return acc }, {} diff --git a/protocol-designer/src/step-forms/selectors/index.ts b/protocol-designer/src/step-forms/selectors/index.ts index 6cd3c2ec76e..ba0cc210add 100644 --- a/protocol-designer/src/step-forms/selectors/index.ts +++ b/protocol-designer/src/step-forms/selectors/index.ts @@ -100,6 +100,10 @@ const rootSelector = (state: BaseState): RootState => state.stepForms const labwareIngredRootSelector = (state: BaseState): LabwareIngredRootState => state.labwareIngred +const _getInitialDeckSetupStepFormRootState: ( + arg: RootState +) => FormData = rs => rs.savedStepForms[INITIAL_DECK_SETUP_STEP_ID] + export const getPresavedStepForm = (state: BaseState): PresavedStepFormState => rootSelector(state).presavedStepForm export const getCurrentFormIsPresaved: Selector< @@ -181,8 +185,15 @@ export const _getPipetteEntitiesRootState: ( ) => PipetteEntities = createSelector( rs => rs.pipetteInvariantProperties, labwareDefSelectors._getLabwareDefsByIdRootState, - denormalizePipetteEntities + _getInitialDeckSetupStepFormRootState, + (pipetteInvariantProperties, labwareDefs, initialDeckSetupStepForm) => + denormalizePipetteEntities( + pipetteInvariantProperties, + labwareDefs, + initialDeckSetupStepForm.pipetteLocationUpdate as Record + ) ) + // Special version of `getAdditionalEquipmentEntities` selector for use in step-forms reducers export const _getAdditionalEquipmentEntitiesRootState: ( arg: RootState @@ -208,10 +219,6 @@ export const getAdditionalEquipment: Selector< NormalizedAdditionalEquipmentById > = createSelector(rootSelector, _getAdditionalEquipmentRootState) -const _getInitialDeckSetupStepFormRootState: ( - arg: RootState -) => FormData = rs => rs.savedStepForms[INITIAL_DECK_SETUP_STEP_ID] - export const getInitialDeckSetupStepForm: Selector< BaseState, FormData @@ -300,6 +307,7 @@ const _getInitialDeckSetup = ( type: MAGNETIC_MODULE_TYPE, slot, moduleState: MAGNETIC_MODULE_INITIAL_STATE, + pythonName: moduleEntity.pythonName, } case TEMPERATURE_MODULE_TYPE: return { @@ -308,6 +316,7 @@ const _getInitialDeckSetup = ( type: TEMPERATURE_MODULE_TYPE, slot, moduleState: TEMPERATURE_MODULE_INITIAL_STATE, + pythonName: moduleEntity.pythonName, } case THERMOCYCLER_MODULE_TYPE: return { @@ -316,6 +325,7 @@ const _getInitialDeckSetup = ( type: THERMOCYCLER_MODULE_TYPE, slot, moduleState: THERMOCYCLER_MODULE_INITIAL_STATE, + pythonName: moduleEntity.pythonName, } case HEATERSHAKER_MODULE_TYPE: return { @@ -324,6 +334,7 @@ const _getInitialDeckSetup = ( type: HEATERSHAKER_MODULE_TYPE, slot, moduleState: HEATERSHAKER_MODULE_INITIAL_STATE, + pythonName: moduleEntity.pythonName, } case MAGNETIC_BLOCK_TYPE: return { @@ -332,6 +343,7 @@ const _getInitialDeckSetup = ( type: MAGNETIC_BLOCK_TYPE, slot, moduleState: MAGNETIC_BLOCK_INITIAL_STATE, + pythonName: moduleEntity.pythonName, } case ABSORBANCE_READER_TYPE: return { @@ -340,6 +352,7 @@ const _getInitialDeckSetup = ( type: ABSORBANCE_READER_TYPE, slot, moduleState: ABSORBANCE_READER_INITIAL_STATE, + pythonName: moduleEntity.pythonName, } } } diff --git a/protocol-designer/src/step-forms/test/reducers.test.ts b/protocol-designer/src/step-forms/test/reducers.test.ts index ba7e16d12dd..545a4f4165e 100644 --- a/protocol-designer/src/step-forms/test/reducers.test.ts +++ b/protocol-designer/src/step-forms/test/reducers.test.ts @@ -274,12 +274,18 @@ describe('labwareInvariantProperties reducer', () => { const prevState = { labwareIdA1: { labwareDefURI: 'foo/a/1', + pythonName: 'mockPythonName', + displayCategory: 'wellPlate', }, labwareIdA2: { labwareDefURI: 'foo/a/1', + pythonName: 'mockPythonName', + displayCategory: 'wellPlate', }, labwareIdB: { labwareDefURI: 'foo/b/1', + pythonName: 'mockPythonName', + displayCategory: 'wellPlate', }, } const result = labwareInvariantProperties(prevState, { @@ -292,6 +298,9 @@ describe('labwareInvariantProperties reducer', () => { }, version: 2, namespace: 'foo', + metadata: { + displayCategory: 'wellPlate', + }, }, isOverwriteMismatched: false, }, @@ -300,13 +309,17 @@ describe('labwareInvariantProperties reducer', () => { // changed labwareIdA1: { labwareDefURI: 'foo/a/2', + displayCategory: 'wellPlate', }, labwareIdA2: { labwareDefURI: 'foo/a/2', + displayCategory: 'wellPlate', }, // unchanged labwareIdB: { labwareDefURI: 'foo/b/1', + displayCategory: 'wellPlate', + pythonName: 'mockPythonName', }, }) }) @@ -412,6 +425,7 @@ describe('savedStepForms reducer: initial deck setup step', () => { duplicateLabwareId: newLabwareId, duplicateLabwareNickname: 'new labware nickname', slot: newSlot, + displayCategory: 'wellPlate', }, }, }, @@ -423,6 +437,7 @@ describe('savedStepForms reducer: initial deck setup step', () => { slot: newSlot, labwareDefURI: 'fixtures/foo/1', id: newLabwareId, + displayCategory: 'adapter', }, }, }, @@ -1089,22 +1104,6 @@ describe('savedStepForms reducer: initial deck setup step', () => { }, expectedModuleLocations: {}, }, - { - testName: - 'delete occupied module in span7_8_10_11 slot -> labware goes into slot 7', - makeStateArgs: { - labwareLocationUpdate: { - [labwareOnModuleId]: moduleId, - }, - moduleLocationUpdate: { - [moduleId]: SPAN7_8_10_11_SLOT, - }, - }, - expectedLabwareLocations: { - [labwareOnModuleId]: '7', - }, - expectedModuleLocations: {}, - }, ] testCases.forEach( ({ diff --git a/protocol-designer/src/step-forms/types.ts b/protocol-designer/src/step-forms/types.ts index d5a66114276..6e116643262 100644 --- a/protocol-designer/src/step-forms/types.ts +++ b/protocol-designer/src/step-forms/types.ts @@ -94,6 +94,8 @@ export type NormalizedLabwareById = Record< string, { labwareDefURI: string + pythonName: string + displayCategory: string } > export type NormalizedLabware = NormalizedLabwareById[keyof NormalizedLabwareById] diff --git a/protocol-designer/src/step-forms/utils/index.ts b/protocol-designer/src/step-forms/utils/index.ts index 4090598868b..12db9d4839c 100644 --- a/protocol-designer/src/step-forms/utils/index.ts +++ b/protocol-designer/src/step-forms/utils/index.ts @@ -132,14 +132,14 @@ export function getDeckItemIdInSlot( } export function denormalizePipetteEntities( pipetteInvariantProperties: NormalizedPipetteById, - labwareDefs: LabwareDefByDefURI + labwareDefs: LabwareDefByDefURI, + pipetteLocationUpdate: Record ): PipetteEntities { return reduce( pipetteInvariantProperties, (acc: PipetteEntities, pipette: NormalizedPipette): PipetteEntities => { const pipetteId = pipette.id const spec = getPipetteSpecsV2(pipette.name) - if (!spec) { throw new Error( `no pipette spec for pipette id "${pipetteId}", name "${pipette.name}"` @@ -149,6 +149,7 @@ export function denormalizePipetteEntities( ...pipette, spec, tiprackLabwareDef: pipette.tiprackDefURI.map(def => labwareDefs[def]), + pythonName: `pipette_${pipetteLocationUpdate[pipetteId]}`, } return { ...acc, [pipetteId]: pipetteEntity } }, diff --git a/protocol-designer/src/steplist/formLevel/getNextDefaultModuleId/__tests__/getNextDefaultTemperatureModuleId.test.ts b/protocol-designer/src/steplist/formLevel/getNextDefaultModuleId/__tests__/getNextDefaultTemperatureModuleId.test.ts index f87507dfabd..1b855e80edc 100644 --- a/protocol-designer/src/steplist/formLevel/getNextDefaultModuleId/__tests__/getNextDefaultTemperatureModuleId.test.ts +++ b/protocol-designer/src/steplist/formLevel/getNextDefaultModuleId/__tests__/getNextDefaultTemperatureModuleId.test.ts @@ -23,6 +23,7 @@ const getThermocycler = () => ({ lidTargetTemp: null, lidOpen: null, }, + pythonName: 'mockPythonName', }) const getMag = () => ({ @@ -34,6 +35,7 @@ const getMag = () => ({ type: MAGNETIC_MODULE_TYPE, engaged: false, }, + pythonName: 'mockPythonName', }) const getTemp = () => ({ @@ -46,6 +48,7 @@ const getTemp = () => ({ status: TEMPERATURE_DEACTIVATED, targetTemperature: null, }, + pythonName: 'mockPythonName', }) describe('getNextDefaultTemperatureModuleId', () => { diff --git a/protocol-designer/src/steplist/formLevel/getNextDefaultModuleId/__tests__/getNextDefaultThermocyclerModuleId.test.ts b/protocol-designer/src/steplist/formLevel/getNextDefaultModuleId/__tests__/getNextDefaultThermocyclerModuleId.test.ts index 78ae0f4a2fd..479197bb039 100644 --- a/protocol-designer/src/steplist/formLevel/getNextDefaultModuleId/__tests__/getNextDefaultThermocyclerModuleId.test.ts +++ b/protocol-designer/src/steplist/formLevel/getNextDefaultModuleId/__tests__/getNextDefaultThermocyclerModuleId.test.ts @@ -22,6 +22,7 @@ const getThermocycler = () => ({ lidTargetTemp: null, lidOpen: null, }, + pythonName: 'mockPythonName', }) const getMag = () => ({ @@ -33,6 +34,7 @@ const getMag = () => ({ type: MAGNETIC_MODULE_TYPE, engaged: false, }, + pythonName: 'mockPythonName', }) const getTemp = () => ({ @@ -45,6 +47,7 @@ const getTemp = () => ({ status: TEMPERATURE_DEACTIVATED, targetTemperature: null, }, + pythonName: 'mockPythonName', }) describe('getNextDefaultThermocyclerModuleId', () => { @@ -110,6 +113,7 @@ describe('getNextDefaultThermocyclerModuleId', () => { type: MAGNETIC_MODULE_TYPE, engaged: false, }, + pythonName: 'mockPythonName', }, tempId: { id: 'tempId', @@ -121,6 +125,7 @@ describe('getNextDefaultThermocyclerModuleId', () => { status: TEMPERATURE_DEACTIVATED, targetTemperature: null, }, + pythonName: 'mockPythonName', }, }, expected: null, diff --git a/protocol-designer/src/steplist/formLevel/handleFormChange/test/moveLiquid.test.ts b/protocol-designer/src/steplist/formLevel/handleFormChange/test/moveLiquid.test.ts index 68244e1cb80..89f46acdc77 100644 --- a/protocol-designer/src/steplist/formLevel/handleFormChange/test/moveLiquid.test.ts +++ b/protocol-designer/src/steplist/formLevel/handleFormChange/test/moveLiquid.test.ts @@ -37,6 +37,7 @@ beforeEach(() => { // @ts-expect-error(sa, 2021-6-15): tiprackModel does not exist on PipetteEntity tiprackModel: ['tiprack-10ul'], tiprackLabwareDef: [fixtureTiprack10ul], + pythonName: 'mockPythonName', }, otherPipetteId: { name: 'p300_single_gen2', @@ -44,6 +45,7 @@ beforeEach(() => { // @ts-expect-error(sa, 2021-6-15): tiprackModel does not exist on PipetteEntity tiprackModel: ['tiprack-300ul'], tiprackLabwareDef: [fixtureTiprack300ul], + pythonName: 'mockPythonName', }, } labwareEntities = {} diff --git a/protocol-designer/src/steplist/formLevel/test/warnings.test.ts b/protocol-designer/src/steplist/formLevel/test/warnings.test.ts index 04c8cfe93db..a02e3eb84fb 100644 --- a/protocol-designer/src/steplist/formLevel/test/warnings.test.ts +++ b/protocol-designer/src/steplist/formLevel/test/warnings.test.ts @@ -277,18 +277,21 @@ describe('Max dispense well volume', () => { def: fixture24Tuberack as LabwareDefinition2, id: 'mockId', labwareDefURI: 'mockURI', + pythonName: 'mockPythonName', }, aspirate_mmFromBottom: null, labware: { def: fixture24Tuberack as LabwareDefinition2, id: 'mockId', labwareDefURI: 'mockURI', + pythonName: 'mockPythonName', }, mix_mmFromBottom: 0.5, dispense_labware: { def: fixture24Tuberack as LabwareDefinition2, id: 'mockId', labwareDefURI: 'mockURI', + pythonName: 'mockPythonName', }, dispense_mmFromBottom: null, } @@ -311,16 +314,19 @@ describe('Max dispense well volume', () => { def: fixture96Plate as LabwareDefinition2, id: 'mockId', labwareDefURI: 'mockURI', + pythonName: 'mockPythonName', } fields.labware = { def: fixture96Plate as LabwareDefinition2, id: 'mockId', labwareDefURI: 'mockURI', + pythonName: 'mockPythonName', } fields.dispense_labware = { def: fixture96Plate as LabwareDefinition2, id: 'mockId', labwareDefURI: 'mockURI', + pythonName: 'mockPythonName', } expect(tipPositionInTube(fields)).toBe(null) expect(mixTipPositionInTube(fields)).toBe(null) diff --git a/protocol-designer/src/ui/modules/utils.ts b/protocol-designer/src/ui/modules/utils.ts index 2ff7fb406d9..f6f673072c8 100644 --- a/protocol-designer/src/ui/modules/utils.ts +++ b/protocol-designer/src/ui/modules/utils.ts @@ -79,7 +79,6 @@ export function getModuleUnderLabware( return location === moduleOnDeck.id }) } -// @ts-expect-error Flex stacker not yet supported in PD export const getModuleShortNames = (type: ModuleType): string => { switch (type) { case HEATERSHAKER_MODULE_TYPE: @@ -94,6 +93,11 @@ export const getModuleShortNames = (type: ModuleType): string => { return 'Thermocycler' case ABSORBANCE_READER_TYPE: return 'Absorbance Plate Reader' + default: + console.warn( + `unsupported module ${type} - need to add to getModuleShortNames` + ) + return 'unsupported module' } } diff --git a/protocol-designer/src/ui/steps/actions/__tests__/addAndSelectStep.test.ts b/protocol-designer/src/ui/steps/actions/__tests__/addAndSelectStep.test.ts index c19e9f56483..a4139421d65 100644 --- a/protocol-designer/src/ui/steps/actions/__tests__/addAndSelectStep.test.ts +++ b/protocol-designer/src/ui/steps/actions/__tests__/addAndSelectStep.test.ts @@ -62,6 +62,7 @@ describe('addAndSelectStep', () => { slot: 'B2', model: 'thermocyclerModuleV1', moduleState: {} as any, + pythonName: 'mockPythonName', }, }, labware: {}, @@ -106,6 +107,7 @@ describe('addAndSelectStep', () => { slot: '1', model: 'magneticModuleV1', moduleState: {} as any, + pythonName: 'mockPythonName', }, }, labware: {}, @@ -150,6 +152,7 @@ describe('addAndSelectStep', () => { slot: 'B2', model: 'temperatureModuleV1', moduleState: {} as any, + pythonName: 'mockPythonName', }, }, labware: {}, @@ -194,6 +197,7 @@ describe('addAndSelectStep', () => { slot: 'B2', model: 'heaterShakerModuleV1', moduleState: {} as any, + pythonName: 'mockPythonName', }, modId2: { type: 'heaterShakerModuleType', @@ -201,6 +205,7 @@ describe('addAndSelectStep', () => { slot: 'A1', model: 'heaterShakerModuleV1', moduleState: {} as any, + pythonName: 'mockPythonName', }, }, labware: {}, @@ -236,12 +241,14 @@ describe('addAndSelectStep', () => { def: fixture12Trough as LabwareDefinition2, labwareDefURI: 'mockDefUri', slot: 'A1', + pythonName: 'mockPythonName', }, labware2: { id: 'labware2', def: fixtureTiprack1000ul as LabwareDefinition2, labwareDefURI: 'mockDefUri', slot: 'B1', + pythonName: 'mockPythonName', }, }, pipettes: {}, @@ -285,12 +292,14 @@ describe('addAndSelectStep', () => { def: fixture12Trough as LabwareDefinition2, labwareDefURI: 'mockDefUri', slot: 'A1', + pythonName: 'mockPythonName', }, labware2: { id: 'labware2', def: fixture12Trough as LabwareDefinition2, labwareDefURI: 'mockDefUri', slot: 'B1', + pythonName: 'mockPythonName', }, }, pipettes: {}, @@ -325,6 +334,7 @@ describe('addAndSelectStep', () => { def: fixtureTiprack1000ul as LabwareDefinition2, labwareDefURI: 'mockDefUri', slot: 'B1', + pythonName: 'mockPythonName', }, }, pipettes: {}, diff --git a/protocol-designer/src/utils/__tests__/labwareModuleCompatibility.test.ts b/protocol-designer/src/utils/__tests__/labwareModuleCompatibility.test.ts index 007cf595c38..423d67cebb5 100644 --- a/protocol-designer/src/utils/__tests__/labwareModuleCompatibility.test.ts +++ b/protocol-designer/src/utils/__tests__/labwareModuleCompatibility.test.ts @@ -9,6 +9,7 @@ describe('labwareModuleCompatibility', () => { id: 'abcef123', slot: '3', def: fixture_96_plate as LabwareDefinition2, + pythonName: 'mockPythonName', } it('returns true when labware is inside custom labwares obj', () => { const customLabwares = { diff --git a/protocol-designer/src/utils/index.ts b/protocol-designer/src/utils/index.ts index 8f4c9397066..61ac7e437e7 100644 --- a/protocol-designer/src/utils/index.ts +++ b/protocol-designer/src/utils/index.ts @@ -1,4 +1,5 @@ import uuidv1 from 'uuid/v4' +import snakeCase from 'lodash/snakeCase' import { makeWellSetHelpers, getDeckDefFromRobotType, @@ -21,6 +22,8 @@ import type { CutoutFixtureId, RobotType, SupportedTip, + ModuleType, + LabwareDisplayCategory, } from '@opentrons/shared-data' import type { WellGroup } from '@opentrons/components' import type { BoundingRect, GenericRect } from '../collision-types' @@ -279,3 +282,22 @@ export const removeOpentronsPhrases = (input: string): string => { return updatedText.trim() } + +const getModuleShortnameForPython = (type: ModuleType): string => { + const shortName = type.split('Type')[0] + return snakeCase(shortName) +} + +export const getModulePythonName = ( + type: ModuleType, + typeCount: number +): string => { + return `${getModuleShortnameForPython(type)}_${typeCount}` +} + +export const getLabwarePythonName = ( + labwareDisplayCategory: LabwareDisplayCategory, + typeCount: number +): string => { + return `${snakeCase(labwareDisplayCategory)}_${typeCount}` +} diff --git a/step-generation/src/__tests__/__snapshots__/fixtureGeneration.test.ts.snap b/step-generation/src/__tests__/__snapshots__/fixtureGeneration.test.ts.snap index 8440670ca4e..23b9a0ccbeb 100644 --- a/step-generation/src/__tests__/__snapshots__/fixtureGeneration.test.ts.snap +++ b/step-generation/src/__tests__/__snapshots__/fixtureGeneration.test.ts.snap @@ -1983,6 +1983,7 @@ exports[`snapshot tests > makeContext 1`] = ` }, "id": "destPlateId", "labwareDefURI": "fixture/fixture_96_plate/1", + "pythonName": "mockPythonName", }, "sourcePlateId": { "def": { @@ -3116,6 +3117,7 @@ exports[`snapshot tests > makeContext 1`] = ` }, "id": "sourcePlateId", "labwareDefURI": "fixture/fixture_96_plate/1", + "pythonName": "mockPythonName", }, "tiprack1Id": { "def": { @@ -4242,6 +4244,7 @@ exports[`snapshot tests > makeContext 1`] = ` }, "id": "tiprack1Id", "labwareDefURI": "fixture/fixture_tiprack_300_ul/1", + "pythonName": "mockPythonName", }, "tiprack2Id": { "def": { @@ -5368,6 +5371,7 @@ exports[`snapshot tests > makeContext 1`] = ` }, "id": "tiprack2Id", "labwareDefURI": "fixture/fixture_tiprack_300_ul/1", + "pythonName": "mockPythonName", }, "tiprack3Id": { "def": { @@ -6494,6 +6498,7 @@ exports[`snapshot tests > makeContext 1`] = ` }, "id": "tiprack3Id", "labwareDefURI": "fixture/fixture_tiprack_300_ul/1", + "pythonName": "mockPythonName", }, "tiprack4AdapterId": { "def": { @@ -6541,6 +6546,7 @@ exports[`snapshot tests > makeContext 1`] = ` }, "id": "tiprack4AdapterId", "labwareDefURI": "fixture/fixture_flex_96_tiprack_adapter/1", + "pythonName": "mockPythonName", }, "tiprack4Id": { "def": { @@ -7679,6 +7685,7 @@ exports[`snapshot tests > makeContext 1`] = ` }, "id": "tiprack4Id", "labwareDefURI": "fixture/fixture_flex_96_tiprack_1000ul/1", + "pythonName": "mockPythonName", }, "tiprack5AdapterId": { "def": { @@ -7726,6 +7733,7 @@ exports[`snapshot tests > makeContext 1`] = ` }, "id": "tiprack5AdapterId", "labwareDefURI": "fixture/fixture_flex_96_tiprack_adapter/1", + "pythonName": "mockPythonName", }, "tiprack5Id": { "def": { @@ -8864,6 +8872,7 @@ exports[`snapshot tests > makeContext 1`] = ` }, "id": "tiprack5Id", "labwareDefURI": "fixture/fixture_flex_96_tiprack_1000ul/1", + "pythonName": "mockPythonName", }, "troughId": { "def": { @@ -9085,6 +9094,7 @@ exports[`snapshot tests > makeContext 1`] = ` }, "id": "troughId", "labwareDefURI": "fixture/fixture_12_trough/1", + "pythonName": "mockPythonName", }, }, "liquidEntities": {}, @@ -9093,6 +9103,7 @@ exports[`snapshot tests > makeContext 1`] = ` "p100096Id": { "id": "p100096Id", "name": "p1000_96", + "pythonName": "mockPythonName", "spec": { "$otSharedSchema": "#/pipette/schemas/2/pipetteGeometrySchema.json", "availableSensors": { @@ -12286,6 +12297,7 @@ exports[`snapshot tests > makeContext 1`] = ` "p10MultiId": { "id": "p10MultiId", "name": "p10_multi", + "pythonName": "mockPythonName", "spec": { "$otSharedSchema": "#/pipette/schemas/2/pipetteGeometrySchema.json", "availableSensors": { @@ -13919,6 +13931,7 @@ exports[`snapshot tests > makeContext 1`] = ` "p10SingleId": { "id": "p10SingleId", "name": "p10_single", + "pythonName": "mockPythonName", "spec": { "$otSharedSchema": "#/pipette/schemas/2/pipetteGeometrySchema.json", "availableSensors": { @@ -15284,6 +15297,7 @@ exports[`snapshot tests > makeContext 1`] = ` "p300MultiId": { "id": "p300MultiId", "name": "p300_multi", + "pythonName": "mockPythonName", "spec": { "$otSharedSchema": "#/pipette/schemas/2/pipetteGeometrySchema.json", "availableSensors": { @@ -16906,6 +16920,7 @@ exports[`snapshot tests > makeContext 1`] = ` "p300SingleId": { "id": "p300SingleId", "name": "p300_single", + "pythonName": "mockPythonName", "spec": { "$otSharedSchema": "#/pipette/schemas/2/pipetteGeometrySchema.json", "availableSensors": { diff --git a/step-generation/src/__tests__/absorbanceReaderCloseInitialize.test.ts b/step-generation/src/__tests__/absorbanceReaderCloseInitialize.test.ts index 9b14cf80e5e..86ccd4ba537 100644 --- a/step-generation/src/__tests__/absorbanceReaderCloseInitialize.test.ts +++ b/step-generation/src/__tests__/absorbanceReaderCloseInitialize.test.ts @@ -43,6 +43,7 @@ describe('absorbanceReaderCloseInitialize compound command creator', () => { id: ABSORBANCE_READER_MODULE_ID, type: ABSORBANCE_READER_TYPE, model: ABSORBANCE_READER_V1, + pythonName: 'mockPythonName', }, }, additionalEquipmentEntities: { diff --git a/step-generation/src/__tests__/absorbanceReaderCloseLid.test.ts b/step-generation/src/__tests__/absorbanceReaderCloseLid.test.ts index eb96cc9e20a..ed4c297dc44 100644 --- a/step-generation/src/__tests__/absorbanceReaderCloseLid.test.ts +++ b/step-generation/src/__tests__/absorbanceReaderCloseLid.test.ts @@ -28,6 +28,7 @@ describe('absorbanceReaderCloseLid', () => { id: moduleId, type: ABSORBANCE_READER_TYPE, model: ABSORBANCE_READER_V1, + pythonName: 'mockPythonName', } invariantContext.additionalEquipmentEntities = { gripperId: { diff --git a/step-generation/src/__tests__/absorbanceReaderCloseRead.test.ts b/step-generation/src/__tests__/absorbanceReaderCloseRead.test.ts index 59c27f227c1..641d262f68c 100644 --- a/step-generation/src/__tests__/absorbanceReaderCloseRead.test.ts +++ b/step-generation/src/__tests__/absorbanceReaderCloseRead.test.ts @@ -43,6 +43,7 @@ describe('absorbanceReaderCloseRead compound command creator', () => { id: ABSORBANCE_READER_MODULE_ID, type: ABSORBANCE_READER_TYPE, model: ABSORBANCE_READER_V1, + pythonName: 'mockPythonName', }, }, additionalEquipmentEntities: { diff --git a/step-generation/src/__tests__/absorbanceReaderOpenLid.test.ts b/step-generation/src/__tests__/absorbanceReaderOpenLid.test.ts index 43bb8238b4f..673d2d7236f 100644 --- a/step-generation/src/__tests__/absorbanceReaderOpenLid.test.ts +++ b/step-generation/src/__tests__/absorbanceReaderOpenLid.test.ts @@ -28,6 +28,7 @@ describe('absorbanceReaderOpenLid', () => { id: moduleId, type: ABSORBANCE_READER_TYPE, model: ABSORBANCE_READER_V1, + pythonName: 'mockPythonName', } invariantContext.additionalEquipmentEntities = { gripperId: { diff --git a/step-generation/src/__tests__/disengageMagnet.test.ts b/step-generation/src/__tests__/disengageMagnet.test.ts index cac187dce6f..fc688df0696 100644 --- a/step-generation/src/__tests__/disengageMagnet.test.ts +++ b/step-generation/src/__tests__/disengageMagnet.test.ts @@ -17,6 +17,7 @@ describe('disengageMagnet', () => { id: moduleId, type: MAGNETIC_MODULE_TYPE, model: MAGNETIC_MODULE_V1, + pythonName: 'mockPythonName', } robotState = getInitialRobotStateStandard(invariantContext) robotState.modules[moduleId] = { diff --git a/step-generation/src/__tests__/dispenseUpdateLiquidState.test.ts b/step-generation/src/__tests__/dispenseUpdateLiquidState.test.ts index 5eacb77b483..17ab12ebacb 100644 --- a/step-generation/src/__tests__/dispenseUpdateLiquidState.test.ts +++ b/step-generation/src/__tests__/dispenseUpdateLiquidState.test.ts @@ -372,6 +372,7 @@ describe('...8-channel pipette', () => { id: SOURCE_LABWARE, labwareDefURI: labwareType, def, + pythonName: 'mockPythonName', } const blankLiquidState = createEmptyLiquidState(customInvariantContext) const initialLiquidState = merge({}, blankLiquidState, { diff --git a/step-generation/src/__tests__/engageMagnet.test.ts b/step-generation/src/__tests__/engageMagnet.test.ts index 654c4891c1e..a3c7f6bfe8c 100644 --- a/step-generation/src/__tests__/engageMagnet.test.ts +++ b/step-generation/src/__tests__/engageMagnet.test.ts @@ -17,6 +17,7 @@ describe('engageMagnet', () => { id: moduleId, type: MAGNETIC_MODULE_TYPE, model: MAGNETIC_MODULE_V1, + pythonName: 'mockPythonName', } robotState = getInitialRobotStateStandard(invariantContext) robotState.modules[moduleId] = { diff --git a/step-generation/src/__tests__/getIsSafePipetteMovement.test.ts b/step-generation/src/__tests__/getIsSafePipetteMovement.test.ts index 7f7ee9cdfac..c376544c5d9 100644 --- a/step-generation/src/__tests__/getIsSafePipetteMovement.test.ts +++ b/step-generation/src/__tests__/getIsSafePipetteMovement.test.ts @@ -32,6 +32,7 @@ describe('getIsSafePipetteMovement', () => { tiprackDefURI: ['mockDefUri'], tiprackLabwareDef: [fixtureTiprack1000ul as LabwareDefinition2], spec: fixtureP100096V2Specs, + pythonName: 'mockPythonName', }, }, labwareEntities: { @@ -39,21 +40,25 @@ describe('getIsSafePipetteMovement', () => { id: mockLabwareId, labwareDefURI: 'mockDefUri', def: fixture96Plate as LabwareDefinition2, + pythonName: 'mockPythonName', }, [mockTiprackId]: { id: mockTiprackId, labwareDefURI: mockTipUri, def: fixtureTiprack1000ul as LabwareDefinition2, + pythonName: 'mockPythonName', }, [mockAdapter]: { id: mockAdapter, labwareDefURI: 'mockAdapterUri', def: fixtureTiprackAdapter as LabwareDefinition2, + pythonName: 'mockPythonName', }, [mockLabware2]: { id: mockLabware2, labwareDefURI: 'mockDefUri', def: fixture96Plate as LabwareDefinition2, + pythonName: 'mockPythonName', }, }, moduleEntities: {}, @@ -122,6 +127,7 @@ describe('getIsSafePipetteMovement', () => { id: mockModule, type: TEMPERATURE_MODULE_TYPE, model: TEMPERATURE_MODULE_V2, + pythonName: 'mockPythonName', }, } const result = getIsSafePipetteMovement( @@ -170,6 +176,7 @@ describe('getIsSafePipetteMovement', () => { id: mockModule, type: TEMPERATURE_MODULE_TYPE, model: TEMPERATURE_MODULE_V2, + pythonName: 'mockPythonName', }, } const result = getIsSafePipetteMovement( diff --git a/step-generation/src/__tests__/heaterShaker.test.ts b/step-generation/src/__tests__/heaterShaker.test.ts index 8ce3c47c804..4eb3f1d7c0f 100644 --- a/step-generation/src/__tests__/heaterShaker.test.ts +++ b/step-generation/src/__tests__/heaterShaker.test.ts @@ -39,6 +39,7 @@ describe('heaterShaker compound command creator', () => { id: HEATER_SHAKER_ID, type: HEATERSHAKER_MODULE_TYPE, model: HEATERSHAKER_MODULE_V1, + pythonName: 'mockPythonName', }, }, } diff --git a/step-generation/src/__tests__/heaterShakerOpenLatch.test.ts b/step-generation/src/__tests__/heaterShakerOpenLatch.test.ts index 441a19e8057..2428fbe097e 100644 --- a/step-generation/src/__tests__/heaterShakerOpenLatch.test.ts +++ b/step-generation/src/__tests__/heaterShakerOpenLatch.test.ts @@ -38,6 +38,7 @@ describe('heaterShakerOpenLatch', () => { // this tiprack is tall enough to trigger the latch open warning labwareDefURI: getLabwareDefURI(fixtureTiprack1000ul), def: fixtureTiprack1000ul, + pythonName: 'mockPythonName', }, }, } diff --git a/step-generation/src/__tests__/heaterShakerUpdates.test.ts b/step-generation/src/__tests__/heaterShakerUpdates.test.ts index e92393d45b0..7965131efa0 100644 --- a/step-generation/src/__tests__/heaterShakerUpdates.test.ts +++ b/step-generation/src/__tests__/heaterShakerUpdates.test.ts @@ -62,6 +62,7 @@ beforeEach(() => { id: moduleId, type: HEATERSHAKER_MODULE_TYPE, model: HEATERSHAKER_MODULE_V1, + pythonName: 'mockPythonName', } startRobotState = getInitialRobotStateStandard(invariantContext) startRobotState.modules[moduleId] = { diff --git a/step-generation/src/__tests__/modulePipetteCollision.test.ts b/step-generation/src/__tests__/modulePipetteCollision.test.ts index 0401f1c2880..266a7e5e058 100644 --- a/step-generation/src/__tests__/modulePipetteCollision.test.ts +++ b/step-generation/src/__tests__/modulePipetteCollision.test.ts @@ -21,6 +21,7 @@ beforeEach(() => { id: 'magDeckId', type: MAGNETIC_MODULE_TYPE, model: MAGNETIC_MODULE_V1, + pythonName: 'mockPythonName', } robotState = getInitialRobotStateStandard(invariantContext) robotState.labware.destPlateId.slot = '4' diff --git a/step-generation/src/__tests__/moveLabware.test.ts b/step-generation/src/__tests__/moveLabware.test.ts index c48f6b38f87..1fa1cb388de 100644 --- a/step-generation/src/__tests__/moveLabware.test.ts +++ b/step-generation/src/__tests__/moveLabware.test.ts @@ -185,6 +185,7 @@ describe('moveLabware', () => { id: 'labwareid', labwareDefURI: 'mockDefUri', def: aluminumBlockDef, + pythonName: 'mockPythonName', }, }, } diff --git a/step-generation/src/__tests__/robotStateSelectors.test.ts b/step-generation/src/__tests__/robotStateSelectors.test.ts index 792c277651e..07e01f5ff0b 100644 --- a/step-generation/src/__tests__/robotStateSelectors.test.ts +++ b/step-generation/src/__tests__/robotStateSelectors.test.ts @@ -73,6 +73,7 @@ describe('_getNextTip', () => { id: tiprackId, labwareDefURI: getLabwareDefURI(fixtureTiprack300ul), def: fixtureTiprack300ul, + pythonName: 'mockPythonName', } const robotState = makeState({ invariantContext: _invariantContext, diff --git a/step-generation/src/__tests__/thermocyclerUpdates.test.ts b/step-generation/src/__tests__/thermocyclerUpdates.test.ts index 19f690e38c2..1c8c52c58e1 100644 --- a/step-generation/src/__tests__/thermocyclerUpdates.test.ts +++ b/step-generation/src/__tests__/thermocyclerUpdates.test.ts @@ -65,6 +65,7 @@ beforeEach(() => { id: moduleId, type: THERMOCYCLER_MODULE_TYPE, model: THERMOCYCLER_MODULE_V1, + pythonName: 'mockPythonName', } lidOpenRobotState = getInitialRobotStateStandard(invariantContext) lidOpenRobotState.modules[moduleId] = { diff --git a/step-generation/src/__tests__/updateMagneticModule.test.ts b/step-generation/src/__tests__/updateMagneticModule.test.ts index ba13dc5a2ac..1fd9885f80e 100644 --- a/step-generation/src/__tests__/updateMagneticModule.test.ts +++ b/step-generation/src/__tests__/updateMagneticModule.test.ts @@ -23,6 +23,7 @@ beforeEach(() => { id: moduleId, type: MAGNETIC_MODULE_TYPE, model: MAGNETIC_MODULE_V1, + pythonName: 'mockPythonName', } disengagedRobotState = getInitialRobotStateStandard(invariantContext) disengagedRobotState.modules[moduleId] = { diff --git a/step-generation/src/__tests__/utils.test.ts b/step-generation/src/__tests__/utils.test.ts index 9b4df262e93..99c66984de7 100644 --- a/step-generation/src/__tests__/utils.test.ts +++ b/step-generation/src/__tests__/utils.test.ts @@ -279,6 +279,7 @@ describe('makeInitialRobotState', () => { spec: fixtureP10SingleV2Specs, tiprackDefURI: [getLabwareDefURI(fixtureTiprack10ul)], tiprackLabwareDef: [fixtureTiprack10ul], + pythonName: 'mockPythonName', }, p300MultiId: { id: 'p300MultiId', @@ -286,6 +287,7 @@ describe('makeInitialRobotState', () => { spec: fixtureP300MultiV2Specs, tiprackDefURI: [getLabwareDefURI(fixtureTiprack300ul)], tiprackLabwareDef: [fixtureTiprack300ul], + pythonName: 'mockPythonName', }, }, moduleEntities: { @@ -293,6 +295,7 @@ describe('makeInitialRobotState', () => { id: 'someTempModuleId', model: TEMPERATURE_MODULE_V1, type: TEMPERATURE_MODULE_TYPE, + pythonName: 'mockPythonName', }, }, labwareEntities: { @@ -300,21 +303,25 @@ describe('makeInitialRobotState', () => { id: 'somePlateId', labwareDefURI: getLabwareDefURI(fixture96Plate), def: fixture96Plate, + pythonName: 'mockPythonName', }, tiprack10Id: { id: 'tiprack10Id', labwareDefURI: getLabwareDefURI(fixtureTiprack10ul), def: fixtureTiprack10ul, + pythonName: 'mockPythonName', }, tiprack300Id: { id: 'tiprack300Id', labwareDefURI: getLabwareDefURI(fixtureTiprack300ul), def: fixtureTiprack300ul, + pythonName: 'mockPythonName', }, fixedTrash: { id: FIXED_TRASH_ID, labwareDefURI: getLabwareDefURI(fixtureTrash), def: fixtureTrash, + pythonName: 'mockPythonName', }, }, additionalEquipmentEntities: {}, @@ -804,6 +811,7 @@ describe('getIsTallLabwareEastWestOfHeaterShaker', () => { id: 'labwareId', labwareDefURI: 'some_uri', def: fakeLabwareDef, + pythonName: 'mockPythonName', }, } }) @@ -938,6 +946,7 @@ describe('getIsHeaterShakerNorthSouthOfNonTiprackWithMultiChannelPipette', () => id: 'fixture96PlateId', labwareDefURI: getLabwareDefURI(fixture96Plate), def: fixture96Plate, + pythonName: 'mockPythonName', } }) @@ -956,6 +965,7 @@ describe('getIsHeaterShakerNorthSouthOfNonTiprackWithMultiChannelPipette', () => id: 'fixtureTiprack10ulId', labwareDefURI: getLabwareDefURI(fixtureTiprack10ul), def: fixtureTiprack10ul, + pythonName: 'mockPythonName', } expect( getIsHeaterShakerNorthSouthOfNonTiprackWithMultiChannelPipette( diff --git a/step-generation/src/fixtures/robotStateFixtures.ts b/step-generation/src/fixtures/robotStateFixtures.ts index 298f5aa6636..db4878aa8be 100644 --- a/step-generation/src/fixtures/robotStateFixtures.ts +++ b/step-generation/src/fixtures/robotStateFixtures.ts @@ -77,61 +77,61 @@ export function makeContext(): InvariantContext { const labwareEntities = { [SOURCE_LABWARE]: { id: SOURCE_LABWARE, - + pythonName: 'mockPythonName', labwareDefURI: getLabwareDefURI(fixture96Plate), def: fixture96Plate, }, [DEST_LABWARE]: { id: DEST_LABWARE, - + pythonName: 'mockPythonName', labwareDefURI: getLabwareDefURI(fixture96Plate), def: fixture96Plate, }, [TROUGH_LABWARE]: { id: TROUGH_LABWARE, - + pythonName: 'mockPythonName', labwareDefURI: getLabwareDefURI(fixture12Trough), def: fixture12Trough, }, tiprack1Id: { id: 'tiprack1Id', - + pythonName: 'mockPythonName', labwareDefURI: getLabwareDefURI(fixtureTiprack300ul), def: fixtureTiprack300ul, }, tiprack2Id: { id: 'tiprack2Id', - + pythonName: 'mockPythonName', labwareDefURI: getLabwareDefURI(fixtureTiprack300ul), def: fixtureTiprack300ul, }, tiprack3Id: { id: 'tiprack3Id', - + pythonName: 'mockPythonName', labwareDefURI: getLabwareDefURI(fixtureTiprack300ul), def: fixtureTiprack300ul, }, tiprack4AdapterId: { id: 'tiprack4AdapterId', - + pythonName: 'mockPythonName', labwareDefURI: getLabwareDefURI(fixtureTiprackAdapter), def: fixtureTiprackAdapter, }, tiprack5AdapterId: { id: 'tiprack5AdapterId', - + pythonName: 'mockPythonName', labwareDefURI: getLabwareDefURI(fixtureTiprackAdapter), def: fixtureTiprackAdapter, }, tiprack4Id: { id: 'tiprack4Id', - + pythonName: 'mockPythonName', labwareDefURI: getLabwareDefURI(fixtureTiprack1000ul), def: fixtureTiprack1000ul, }, tiprack5Id: { id: 'tiprack5Id', - + pythonName: 'mockPythonName', labwareDefURI: getLabwareDefURI(fixtureTiprack1000ul), def: fixtureTiprack1000ul, }, @@ -148,7 +148,7 @@ export function makeContext(): InvariantContext { p10SingleId: { name: 'p10_single', id: 'p10SingleId', - + pythonName: 'mockPythonName', tiprackDefURI: [getLabwareDefURI(fixtureTiprack10ul)], tiprackLabwareDef: [fixtureTiprack10ul], spec: fixtureP10SingleV2Specs, @@ -156,34 +156,34 @@ export function makeContext(): InvariantContext { p10MultiId: { name: 'p10_multi', id: 'p10MultiId', - tiprackDefURI: [getLabwareDefURI(fixtureTiprack10ul)], tiprackLabwareDef: [fixtureTiprack10ul], spec: fixtureP10MultiV2Specs, + pythonName: 'mockPythonName', }, [DEFAULT_PIPETTE]: { name: 'p300_single', id: DEFAULT_PIPETTE, - tiprackDefURI: [getLabwareDefURI(fixtureTiprack300ul)], tiprackLabwareDef: [fixtureTiprack300ul], spec: fixtureP300SingleV2Specs, + pythonName: 'mockPythonName', }, [MULTI_PIPETTE]: { name: 'p300_multi', id: MULTI_PIPETTE, - tiprackDefURI: [getLabwareDefURI(fixtureTiprack300ul)], tiprackLabwareDef: [fixtureTiprack300ul], spec: fixtureP300MultiV2Specs, + pythonName: 'mockPythonName', }, [PIPETTE_96]: { name: 'p1000_96', id: PIPETTE_96, - tiprackDefURI: [getLabwareDefURI(fixtureTiprack1000ul)], tiprackLabwareDef: [fixtureTiprack1000ul], spec: fixtureP100096V2Specs, + pythonName: 'mockPythonName', }, } diff --git a/step-generation/src/types.ts b/step-generation/src/types.ts index 9198cbf2686..90b40e0c3d0 100644 --- a/step-generation/src/types.ts +++ b/step-generation/src/types.ts @@ -97,6 +97,7 @@ export interface LabwareEntity { id: string labwareDefURI: string def: LabwareDefinition2 + pythonName: string } export interface LabwareEntities { [labwareId: string]: LabwareEntity @@ -106,6 +107,7 @@ export interface ModuleEntity { id: string type: ModuleType model: ModuleModel + pythonName: string } export interface ModuleEntities { @@ -133,6 +135,11 @@ export interface LiquidEntities { [liquidId: string]: LiquidEntity } +export type Ingredient = Omit +export interface Ingredients { + [liquidId: string]: Ingredient +} + export type AdditionalEquipmentName = | 'gripper' | 'wasteChute' @@ -159,6 +166,7 @@ export type NormalizedPipette = NormalizedPipetteById[keyof NormalizedPipetteByI export type PipetteEntity = NormalizedPipette & { tiprackLabwareDef: LabwareDefinition2[] spec: PipetteV2Specs + pythonName: string } export interface PipetteEntities { diff --git a/step-generation/src/utils/constructInvariantContextFromRunCommands.ts b/step-generation/src/utils/constructInvariantContextFromRunCommands.ts index ea1899b5316..a30fa958320 100644 --- a/step-generation/src/utils/constructInvariantContextFromRunCommands.ts +++ b/step-generation/src/utils/constructInvariantContextFromRunCommands.ts @@ -31,6 +31,8 @@ export function constructInvariantContextFromRunCommands( id: result.labwareId, labwareDefURI: getLabwareDefURI(result.definition), def: result.definition, + // ProtocolTimelineScrubber won't need access to pythonNames + pythonName: 'n/a', }, } return { @@ -48,6 +50,7 @@ export function constructInvariantContextFromRunCommands( id: result.moduleId, type: getModuleType(command.params.model), model: command.params.model, + pythonName: 'n/a', }, } return { @@ -91,6 +94,7 @@ export function constructInvariantContextFromRunCommands( ? [getLabwareDefURI(tiprackLabwareDef)] : [], spec: specs, + pythonName: 'n/a', }, } return { From f8473bfa113499738f173ebd200e04d6a4da8f09 Mon Sep 17 00:00:00 2001 From: Max Marrone Date: Fri, 7 Feb 2025 16:22:51 -0500 Subject: [PATCH 100/150] =?UTF-8?q?refactor(shared-data):=20Normalize=20"\?= =?UTF-8?q?u00b5"=20to=20"=C2=B5"=20(#17469)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../3/appliedbiosystemsmicroamp_384_wellplate_40ul/2.json | 4 ++-- .../3/armadillo_96_wellplate_200ul_pcr_full_skirt/3.json | 4 ++-- .../labware/definitions/3/biorad_384_wellplate_50ul/3.json | 4 ++-- .../definitions/3/biorad_96_wellplate_200ul_pcr/3.json | 4 ++-- .../definitions/3/corning_384_wellplate_112ul_flat/3.json | 4 ++-- .../definitions/3/corning_96_wellplate_360ul_flat/3.json | 4 ++-- .../definitions/3/evotips_flex_96_tiprack_adapter/1.json | 2 +- .../3/nest_96_wellplate_100ul_pcr_full_skirt/3.json | 4 ++-- .../definitions/3/nest_96_wellplate_200ul_flat/3.json | 4 ++-- .../labware/definitions/3/nest_96_wellplate_2ml_deep/3.json | 2 +- .../2.json | 6 +++--- .../3.json | 4 ++-- .../opentrons_96_aluminumblock_nest_wellplate_100ul/2.json | 6 +++--- .../2.json | 2 +- .../2.json | 6 +++--- .../2.json | 6 +++--- .../2.json | 6 +++--- .../3/opentrons_96_wellplate_200ul_pcr_full_skirt/3.json | 4 ++-- .../labware/definitions/3/opentrons_flex_tiprack_lid/1.json | 2 +- .../3/opentrons_tough_pcr_auto_sealing_lid/1.json | 2 +- .../2.json | 6 +++--- .../definitions/3/protocol_engine_lid_stack_object/1.json | 2 +- .../3/thermoscientificnunc_96_wellplate_1300ul/2.json | 4 ++-- .../3/thermoscientificnunc_96_wellplate_2000ul/2.json | 4 ++-- 24 files changed, 48 insertions(+), 48 deletions(-) diff --git a/shared-data/labware/definitions/3/appliedbiosystemsmicroamp_384_wellplate_40ul/2.json b/shared-data/labware/definitions/3/appliedbiosystemsmicroamp_384_wellplate_40ul/2.json index e2ff42a3a3c..cac26bcfe51 100644 --- a/shared-data/labware/definitions/3/appliedbiosystemsmicroamp_384_wellplate_40ul/2.json +++ b/shared-data/labware/definitions/3/appliedbiosystemsmicroamp_384_wellplate_40ul/2.json @@ -441,9 +441,9 @@ ] }, "metadata": { - "displayName": "Applied Biosystems MicroAmp 384 Well Plate 40 \u00b5L", + "displayName": "Applied Biosystems MicroAmp 384 Well Plate 40 µL", "displayCategory": "wellPlate", - "displayVolumeUnits": "\u00b5L", + "displayVolumeUnits": "µL", "tags": [] }, "dimensions": { diff --git a/shared-data/labware/definitions/3/armadillo_96_wellplate_200ul_pcr_full_skirt/3.json b/shared-data/labware/definitions/3/armadillo_96_wellplate_200ul_pcr_full_skirt/3.json index 292fe779e73..12240df9fb6 100644 --- a/shared-data/labware/definitions/3/armadillo_96_wellplate_200ul_pcr_full_skirt/3.json +++ b/shared-data/labware/definitions/3/armadillo_96_wellplate_200ul_pcr_full_skirt/3.json @@ -9,9 +9,9 @@ "isMagneticModuleCompatible": true }, "metadata": { - "displayName": "Armadillo 96 Well Plate 200 \u00b5L PCR Full Skirt", + "displayName": "Armadillo 96 Well Plate 200 µL PCR Full Skirt", "displayCategory": "wellPlate", - "displayVolumeUnits": "\u00b5L", + "displayVolumeUnits": "µL", "tags": [] }, "brand": { diff --git a/shared-data/labware/definitions/3/biorad_384_wellplate_50ul/3.json b/shared-data/labware/definitions/3/biorad_384_wellplate_50ul/3.json index 5f6c47fb290..d4350e11468 100644 --- a/shared-data/labware/definitions/3/biorad_384_wellplate_50ul/3.json +++ b/shared-data/labware/definitions/3/biorad_384_wellplate_50ul/3.json @@ -450,9 +450,9 @@ ] }, "metadata": { - "displayName": "Bio-Rad 384 Well Plate 50 \u00b5L", + "displayName": "Bio-Rad 384 Well Plate 50 µL", "displayCategory": "wellPlate", - "displayVolumeUnits": "\u00b5L", + "displayVolumeUnits": "µL", "tags": [] }, "dimensions": { diff --git a/shared-data/labware/definitions/3/biorad_96_wellplate_200ul_pcr/3.json b/shared-data/labware/definitions/3/biorad_96_wellplate_200ul_pcr/3.json index 58a914c225d..ff83414818c 100644 --- a/shared-data/labware/definitions/3/biorad_96_wellplate_200ul_pcr/3.json +++ b/shared-data/labware/definitions/3/biorad_96_wellplate_200ul_pcr/3.json @@ -17,9 +17,9 @@ "version": 3, "namespace": "opentrons", "metadata": { - "displayName": "Bio-Rad 96 Well Plate 200 \u00b5L PCR", + "displayName": "Bio-Rad 96 Well Plate 200 µL PCR", "displayCategory": "wellPlate", - "displayVolumeUnits": "\u00b5L", + "displayVolumeUnits": "µL", "tags": [] }, "dimensions": { diff --git a/shared-data/labware/definitions/3/corning_384_wellplate_112ul_flat/3.json b/shared-data/labware/definitions/3/corning_384_wellplate_112ul_flat/3.json index 69a3b324063..b973af8bdb9 100644 --- a/shared-data/labware/definitions/3/corning_384_wellplate_112ul_flat/3.json +++ b/shared-data/labware/definitions/3/corning_384_wellplate_112ul_flat/3.json @@ -437,8 +437,8 @@ ] ], "metadata": { - "displayName": "Corning 384 Well Plate 112 \u00b5L Flat", - "displayVolumeUnits": "\u00b5L", + "displayName": "Corning 384 Well Plate 112 µL Flat", + "displayVolumeUnits": "µL", "displayCategory": "wellPlate", "tags": [] }, diff --git a/shared-data/labware/definitions/3/corning_96_wellplate_360ul_flat/3.json b/shared-data/labware/definitions/3/corning_96_wellplate_360ul_flat/3.json index e085eb05d0e..fdc7b2ec2ac 100644 --- a/shared-data/labware/definitions/3/corning_96_wellplate_360ul_flat/3.json +++ b/shared-data/labware/definitions/3/corning_96_wellplate_360ul_flat/3.json @@ -51,9 +51,9 @@ ] }, "metadata": { - "displayName": "Corning 96 Well Plate 360 \u00b5L Flat", + "displayName": "Corning 96 Well Plate 360 µL Flat", "displayCategory": "wellPlate", - "displayVolumeUnits": "\u00b5L", + "displayVolumeUnits": "µL", "tags": [] }, "dimensions": { diff --git a/shared-data/labware/definitions/3/evotips_flex_96_tiprack_adapter/1.json b/shared-data/labware/definitions/3/evotips_flex_96_tiprack_adapter/1.json index 36125856ad3..c7ec727eb47 100644 --- a/shared-data/labware/definitions/3/evotips_flex_96_tiprack_adapter/1.json +++ b/shared-data/labware/definitions/3/evotips_flex_96_tiprack_adapter/1.json @@ -7,7 +7,7 @@ "metadata": { "displayName": "Evotips adapter", "displayCategory": "adapter", - "displayVolumeUnits": "\u00b5L", + "displayVolumeUnits": "µL", "tags": [] }, "dimensions": { diff --git a/shared-data/labware/definitions/3/nest_96_wellplate_100ul_pcr_full_skirt/3.json b/shared-data/labware/definitions/3/nest_96_wellplate_100ul_pcr_full_skirt/3.json index 04bc8501f42..5b685fddf65 100644 --- a/shared-data/labware/definitions/3/nest_96_wellplate_100ul_pcr_full_skirt/3.json +++ b/shared-data/labware/definitions/3/nest_96_wellplate_100ul_pcr_full_skirt/3.json @@ -19,9 +19,9 @@ "links": ["https://www.nest-biotech.com/pcr-plates/58773587.html"] }, "metadata": { - "displayName": "NEST 96 Well Plate 100 \u00b5L PCR Full Skirt", + "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", "displayCategory": "wellPlate", - "displayVolumeUnits": "\u00b5L", + "displayVolumeUnits": "µL", "tags": [] }, "dimensions": { diff --git a/shared-data/labware/definitions/3/nest_96_wellplate_200ul_flat/3.json b/shared-data/labware/definitions/3/nest_96_wellplate_200ul_flat/3.json index f8315ed040c..874bc2d508d 100644 --- a/shared-data/labware/definitions/3/nest_96_wellplate_200ul_flat/3.json +++ b/shared-data/labware/definitions/3/nest_96_wellplate_200ul_flat/3.json @@ -19,9 +19,9 @@ "links": ["https://www.nest-biotech.com/cell-culture-plates/59415537.html"] }, "metadata": { - "displayName": "NEST 96 Well Plate 200 \u00b5L Flat", + "displayName": "NEST 96 Well Plate 200 µL Flat", "displayCategory": "wellPlate", - "displayVolumeUnits": "\u00b5L", + "displayVolumeUnits": "µL", "tags": [] }, "dimensions": { diff --git a/shared-data/labware/definitions/3/nest_96_wellplate_2ml_deep/3.json b/shared-data/labware/definitions/3/nest_96_wellplate_2ml_deep/3.json index cb30a8b93de..0cddc313929 100644 --- a/shared-data/labware/definitions/3/nest_96_wellplate_2ml_deep/3.json +++ b/shared-data/labware/definitions/3/nest_96_wellplate_2ml_deep/3.json @@ -21,7 +21,7 @@ "metadata": { "displayName": "NEST 96 Deep Well Plate 2mL", "displayCategory": "wellPlate", - "displayVolumeUnits": "\u00b5L", + "displayVolumeUnits": "µL", "tags": [] }, "dimensions": { diff --git a/shared-data/labware/definitions/3/opentrons_96_aluminumblock_biorad_wellplate_200ul/2.json b/shared-data/labware/definitions/3/opentrons_96_aluminumblock_biorad_wellplate_200ul/2.json index ff19a886e26..a20005dacc9 100644 --- a/shared-data/labware/definitions/3/opentrons_96_aluminumblock_biorad_wellplate_200ul/2.json +++ b/shared-data/labware/definitions/3/opentrons_96_aluminumblock_biorad_wellplate_200ul/2.json @@ -17,8 +17,8 @@ "version": 2, "namespace": "opentrons", "metadata": { - "displayName": "Opentrons 96 Well Aluminum Block with Bio-Rad Well Plate 200 \u00b5L", - "displayVolumeUnits": "\u00b5L", + "displayName": "Opentrons 96 Well Aluminum Block with Bio-Rad Well Plate 200 µL", + "displayVolumeUnits": "µL", "displayCategory": "aluminumBlock", "tags": [] }, @@ -1104,7 +1104,7 @@ "H12" ], "metadata": { - "displayName": "Bio-Rad 96 Well Plate 200 \u00b5L", + "displayName": "Bio-Rad 96 Well Plate 200 µL", "displayCategory": "wellPlate", "wellBottomShape": "v" }, diff --git a/shared-data/labware/definitions/3/opentrons_96_aluminumblock_generic_pcr_strip_200ul/3.json b/shared-data/labware/definitions/3/opentrons_96_aluminumblock_generic_pcr_strip_200ul/3.json index 7563adaab85..00bb44d427b 100644 --- a/shared-data/labware/definitions/3/opentrons_96_aluminumblock_generic_pcr_strip_200ul/3.json +++ b/shared-data/labware/definitions/3/opentrons_96_aluminumblock_generic_pcr_strip_200ul/3.json @@ -17,8 +17,8 @@ "version": 3, "namespace": "opentrons", "metadata": { - "displayName": "Opentrons 96 Well Aluminum Block with Generic PCR Strip 200 \u00b5L", - "displayVolumeUnits": "\u00b5L", + "displayName": "Opentrons 96 Well Aluminum Block with Generic PCR Strip 200 µL", + "displayVolumeUnits": "µL", "displayCategory": "aluminumBlock", "tags": [] }, diff --git a/shared-data/labware/definitions/3/opentrons_96_aluminumblock_nest_wellplate_100ul/2.json b/shared-data/labware/definitions/3/opentrons_96_aluminumblock_nest_wellplate_100ul/2.json index 7feac27841f..fe63aa6dd74 100644 --- a/shared-data/labware/definitions/3/opentrons_96_aluminumblock_nest_wellplate_100ul/2.json +++ b/shared-data/labware/definitions/3/opentrons_96_aluminumblock_nest_wellplate_100ul/2.json @@ -21,9 +21,9 @@ ] }, "metadata": { - "displayName": "Opentrons 96 Well Aluminum Block with NEST Well Plate 100 \u00b5L", + "displayName": "Opentrons 96 Well Aluminum Block with NEST Well Plate 100 µL", "displayCategory": "aluminumBlock", - "displayVolumeUnits": "\u00b5L", + "displayVolumeUnits": "µL", "tags": [] }, "dimensions": { @@ -996,7 +996,7 @@ "groups": [ { "metadata": { - "displayName": "NEST 96 Well Plate 100 \u00b5L", + "displayName": "NEST 96 Well Plate 100 µL", "displayCategory": "wellPlate", "wellBottomShape": "v" }, diff --git a/shared-data/labware/definitions/3/opentrons_96_deep_well_adapter_nest_wellplate_2ml_deep/2.json b/shared-data/labware/definitions/3/opentrons_96_deep_well_adapter_nest_wellplate_2ml_deep/2.json index 10c63d8ad4a..8d34c16858b 100644 --- a/shared-data/labware/definitions/3/opentrons_96_deep_well_adapter_nest_wellplate_2ml_deep/2.json +++ b/shared-data/labware/definitions/3/opentrons_96_deep_well_adapter_nest_wellplate_2ml_deep/2.json @@ -21,7 +21,7 @@ "metadata": { "displayName": "Opentrons 96 Deep Well Heater-Shaker Adapter with NEST Deep Well Plate 2 mL", "displayCategory": "adapter", - "displayVolumeUnits": "\u00b5L", + "displayVolumeUnits": "µL", "tags": [] }, "dimensions": { diff --git a/shared-data/labware/definitions/3/opentrons_96_flat_bottom_adapter_nest_wellplate_200ul_flat/2.json b/shared-data/labware/definitions/3/opentrons_96_flat_bottom_adapter_nest_wellplate_200ul_flat/2.json index 3cb7a8de52a..28fdb7e62a3 100644 --- a/shared-data/labware/definitions/3/opentrons_96_flat_bottom_adapter_nest_wellplate_200ul_flat/2.json +++ b/shared-data/labware/definitions/3/opentrons_96_flat_bottom_adapter_nest_wellplate_200ul_flat/2.json @@ -19,9 +19,9 @@ "links": [] }, "metadata": { - "displayName": "Opentrons 96 Flat Bottom Heater-Shaker Adapter with NEST 96 Well Plate 200 \u00b5L Flat", + "displayName": "Opentrons 96 Flat Bottom Heater-Shaker Adapter with NEST 96 Well Plate 200 µL Flat", "displayCategory": "adapter", - "displayVolumeUnits": "\u00b5L", + "displayVolumeUnits": "µL", "tags": [] }, "dimensions": { @@ -994,7 +994,7 @@ "groups": [ { "metadata": { - "displayName": "NEST 96 Well Plate 200 \u00b5L Flat", + "displayName": "NEST 96 Well Plate 200 µL Flat", "displayCategory": "wellPlate", "wellBottomShape": "flat" }, diff --git a/shared-data/labware/definitions/3/opentrons_96_pcr_adapter_armadillo_wellplate_200ul/2.json b/shared-data/labware/definitions/3/opentrons_96_pcr_adapter_armadillo_wellplate_200ul/2.json index a21f759a713..a5e5d1a912b 100644 --- a/shared-data/labware/definitions/3/opentrons_96_pcr_adapter_armadillo_wellplate_200ul/2.json +++ b/shared-data/labware/definitions/3/opentrons_96_pcr_adapter_armadillo_wellplate_200ul/2.json @@ -10,9 +10,9 @@ "isMagneticModuleCompatible": false }, "metadata": { - "displayName": "Opentrons 96 PCR Heater-Shaker Adapter with Armadillo Well Plate 200 \u00b5l", + "displayName": "Opentrons 96 PCR Heater-Shaker Adapter with Armadillo Well Plate 200 µl", "displayCategory": "aluminumBlock", - "displayVolumeUnits": "\u00b5L", + "displayVolumeUnits": "µL", "tags": [] }, "brand": { @@ -1009,7 +1009,7 @@ "groups": [ { "metadata": { - "displayName": "Armadillo 96 Well Plate 200 \u00b5L PCR Full Skirt", + "displayName": "Armadillo 96 Well Plate 200 µL PCR Full Skirt", "displayCategory": "wellPlate", "wellBottomShape": "v" }, diff --git a/shared-data/labware/definitions/3/opentrons_96_pcr_adapter_nest_wellplate_100ul_pcr_full_skirt/2.json b/shared-data/labware/definitions/3/opentrons_96_pcr_adapter_nest_wellplate_100ul_pcr_full_skirt/2.json index b5a3891c396..1db6b0911bc 100644 --- a/shared-data/labware/definitions/3/opentrons_96_pcr_adapter_nest_wellplate_100ul_pcr_full_skirt/2.json +++ b/shared-data/labware/definitions/3/opentrons_96_pcr_adapter_nest_wellplate_100ul_pcr_full_skirt/2.json @@ -19,9 +19,9 @@ "links": [] }, "metadata": { - "displayName": "Opentrons 96 PCR Heater-Shaker Adapter with NEST Well Plate 100 \u00b5l", + "displayName": "Opentrons 96 PCR Heater-Shaker Adapter with NEST Well Plate 100 µl", "displayCategory": "adapter", - "displayVolumeUnits": "\u00b5L", + "displayVolumeUnits": "µL", "tags": [] }, "dimensions": { @@ -994,7 +994,7 @@ "groups": [ { "metadata": { - "displayName": "NEST 96 Well Plate 100 \u00b5L PCR Full Skirt", + "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", "displayCategory": "wellPlate", "wellBottomShape": "v" }, diff --git a/shared-data/labware/definitions/3/opentrons_96_wellplate_200ul_pcr_full_skirt/3.json b/shared-data/labware/definitions/3/opentrons_96_wellplate_200ul_pcr_full_skirt/3.json index 2cfa376d741..ebcb0d94ef2 100644 --- a/shared-data/labware/definitions/3/opentrons_96_wellplate_200ul_pcr_full_skirt/3.json +++ b/shared-data/labware/definitions/3/opentrons_96_wellplate_200ul_pcr_full_skirt/3.json @@ -9,9 +9,9 @@ "isMagneticModuleCompatible": true }, "metadata": { - "displayName": "Opentrons Tough 96 Well Plate 200 \u00b5L PCR Full Skirt", + "displayName": "Opentrons Tough 96 Well Plate 200 µL PCR Full Skirt", "displayCategory": "wellPlate", - "displayVolumeUnits": "\u00b5L", + "displayVolumeUnits": "µL", "tags": [] }, "brand": { diff --git a/shared-data/labware/definitions/3/opentrons_flex_tiprack_lid/1.json b/shared-data/labware/definitions/3/opentrons_flex_tiprack_lid/1.json index 88e3b604921..2b6d7a5b2eb 100644 --- a/shared-data/labware/definitions/3/opentrons_flex_tiprack_lid/1.json +++ b/shared-data/labware/definitions/3/opentrons_flex_tiprack_lid/1.json @@ -8,7 +8,7 @@ "metadata": { "displayName": "Opentrons Flex Tiprack Lid", "displayCategory": "lid", - "displayVolumeUnits": "\u00b5L", + "displayVolumeUnits": "µL", "tags": [] }, "dimensions": { diff --git a/shared-data/labware/definitions/3/opentrons_tough_pcr_auto_sealing_lid/1.json b/shared-data/labware/definitions/3/opentrons_tough_pcr_auto_sealing_lid/1.json index 95a55074c61..5783916f7de 100644 --- a/shared-data/labware/definitions/3/opentrons_tough_pcr_auto_sealing_lid/1.json +++ b/shared-data/labware/definitions/3/opentrons_tough_pcr_auto_sealing_lid/1.json @@ -8,7 +8,7 @@ "metadata": { "displayName": "Opentrons Tough PCR Auto-Sealing Lid", "displayCategory": "lid", - "displayVolumeUnits": "\u00b5L", + "displayVolumeUnits": "µL", "tags": [] }, "dimensions": { diff --git a/shared-data/labware/definitions/3/opentrons_universal_flat_adapter_corning_384_wellplate_112ul_flat/2.json b/shared-data/labware/definitions/3/opentrons_universal_flat_adapter_corning_384_wellplate_112ul_flat/2.json index e851c913660..94dca74b40a 100644 --- a/shared-data/labware/definitions/3/opentrons_universal_flat_adapter_corning_384_wellplate_112ul_flat/2.json +++ b/shared-data/labware/definitions/3/opentrons_universal_flat_adapter_corning_384_wellplate_112ul_flat/2.json @@ -438,9 +438,9 @@ "brandId": [] }, "metadata": { - "displayName": "Opentrons Universal Flat Heater-Shaker Adapter with Corning 384 Well Plate 112 \u00b5l Flat", + "displayName": "Opentrons Universal Flat Heater-Shaker Adapter with Corning 384 Well Plate 112 µl Flat", "displayCategory": "adapter", - "displayVolumeUnits": "\u00b5L", + "displayVolumeUnits": "µL", "tags": [] }, "dimensions": { @@ -4677,7 +4677,7 @@ "groups": [ { "metadata": { - "displayName": "Corning 384 Well Plate 112 \u00b5L Flat", + "displayName": "Corning 384 Well Plate 112 µL Flat", "displayCategory": "wellPlate", "wellBottomShape": "flat" }, diff --git a/shared-data/labware/definitions/3/protocol_engine_lid_stack_object/1.json b/shared-data/labware/definitions/3/protocol_engine_lid_stack_object/1.json index 134b90bf13f..7e0e50da7a4 100644 --- a/shared-data/labware/definitions/3/protocol_engine_lid_stack_object/1.json +++ b/shared-data/labware/definitions/3/protocol_engine_lid_stack_object/1.json @@ -8,7 +8,7 @@ "metadata": { "displayName": "Protocol Engine Lid Stack", "displayCategory": "system", - "displayVolumeUnits": "\u00b5L", + "displayVolumeUnits": "µL", "tags": [] }, "dimensions": { diff --git a/shared-data/labware/definitions/3/thermoscientificnunc_96_wellplate_1300ul/2.json b/shared-data/labware/definitions/3/thermoscientificnunc_96_wellplate_1300ul/2.json index a022cc88192..4ab68b82630 100644 --- a/shared-data/labware/definitions/3/thermoscientificnunc_96_wellplate_1300ul/2.json +++ b/shared-data/labware/definitions/3/thermoscientificnunc_96_wellplate_1300ul/2.json @@ -19,9 +19,9 @@ "links": ["https://www.thermofisher.com/order/catalog/product/260251"] }, "metadata": { - "displayName": "Thermo Scientific Nunc 96 Well Plate 1300 \u00b5L", + "displayName": "Thermo Scientific Nunc 96 Well Plate 1300 µL", "displayCategory": "wellPlate", - "displayVolumeUnits": "\u00b5L", + "displayVolumeUnits": "µL", "tags": [] }, "dimensions": { diff --git a/shared-data/labware/definitions/3/thermoscientificnunc_96_wellplate_2000ul/2.json b/shared-data/labware/definitions/3/thermoscientificnunc_96_wellplate_2000ul/2.json index dfa3f26f224..8d02526f07f 100644 --- a/shared-data/labware/definitions/3/thermoscientificnunc_96_wellplate_2000ul/2.json +++ b/shared-data/labware/definitions/3/thermoscientificnunc_96_wellplate_2000ul/2.json @@ -19,9 +19,9 @@ "links": ["https://www.thermofisher.com/order/catalog/product/278743"] }, "metadata": { - "displayName": "Thermo Scientific Nunc 96 Well Plate 2000 \u00b5L", + "displayName": "Thermo Scientific Nunc 96 Well Plate 2000 µL", "displayCategory": "wellPlate", - "displayVolumeUnits": "\u00b5L", + "displayVolumeUnits": "µL", "tags": [] }, "dimensions": { From d16cbafc635f61aeabf6902916f580947b8636d5 Mon Sep 17 00:00:00 2001 From: Sarah Breen Date: Fri, 7 Feb 2025 16:37:07 -0500 Subject: [PATCH 101/150] fix(app): translate close button text for ODD toasts (#17459) fix RQA-3946 --- app/src/App/hooks.ts | 4 ++-- .../organisms/ErrorRecoveryFlows/hooks/useRecoveryToasts.ts | 5 +++++ app/src/organisms/ODD/QuickTransferFlow/SelectDestWells.tsx | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/app/src/App/hooks.ts b/app/src/App/hooks.ts index d01082d8dc1..737393f7a99 100644 --- a/app/src/App/hooks.ts +++ b/app/src/App/hooks.ts @@ -31,7 +31,7 @@ export function useSoftwareUpdatePoll(): void { export function useProtocolReceiptToast(): void { const host = useHost() - const { t } = useTranslation('protocol_info') + const { t, i18n } = useTranslation(['protocol_info', 'shared']) const { makeToast } = useToaster() const queryClient = useQueryClient() const protocolIdsQuery = useAllProtocolIdsQuery( @@ -83,7 +83,7 @@ export function useProtocolReceiptToast(): void { }) as string, 'success', { - closeButton: true, + buttonText: i18n.format(t('shared:close'), 'capitalize'), disableTimeout: true, displayType: 'odd', } diff --git a/app/src/organisms/ErrorRecoveryFlows/hooks/useRecoveryToasts.ts b/app/src/organisms/ErrorRecoveryFlows/hooks/useRecoveryToasts.ts index 533b9877f72..a722e6d566d 100644 --- a/app/src/organisms/ErrorRecoveryFlows/hooks/useRecoveryToasts.ts +++ b/app/src/organisms/ErrorRecoveryFlows/hooks/useRecoveryToasts.ts @@ -27,6 +27,7 @@ export function useRecoveryToasts({ ...rest }: BuildToast): RecoveryToasts { const { currentStepNumber, hasRunDiverged } = stepCounts + const { i18n, t } = useTranslation('shared') const { makeToast } = useToaster() const displayType = isOnDevice ? 'odd' : 'desktop' @@ -53,6 +54,10 @@ export function useRecoveryToasts({ const makeSuccessToast = (): void => { if (selectedRecoveryOption !== RECOVERY_MAP.CANCEL_RUN.ROUTE) { makeToast(bodyText, 'success', { + buttonText: + displayType === 'odd' + ? i18n.format(t('shared:close'), 'capitalize') + : undefined, closeButton: true, disableTimeout: true, displayType, diff --git a/app/src/organisms/ODD/QuickTransferFlow/SelectDestWells.tsx b/app/src/organisms/ODD/QuickTransferFlow/SelectDestWells.tsx index 41dcf155fb7..16102451ebc 100644 --- a/app/src/organisms/ODD/QuickTransferFlow/SelectDestWells.tsx +++ b/app/src/organisms/ODD/QuickTransferFlow/SelectDestWells.tsx @@ -123,7 +123,7 @@ export function SelectDestWells(props: SelectDestWellsProps): JSX.Element { }) as string, 'error', { - closeButton: true, + buttonText: i18n.format(t('shared:close'), 'capitalize'), disableTimeout: true, displayType: 'odd', linkText: t('learn_more'), From 26125dd4a7312e97c817c27911d18a1df942e4fb Mon Sep 17 00:00:00 2001 From: David Chau <46395074+ddcc4@users.noreply.github.com> Date: Fri, 7 Feb 2025 16:41:41 -0500 Subject: [PATCH 102/150] fix(protocol-designer): fix createFile() test and delete unused `ot2Robot` constant (#17472) # Overview In `createFile(..., robotType=...)`, the `robotType` needs to be a string, but the test was incorrectly calling the function with an object instead. We previously defined a constant object `ot2Robot = { model: OT2_ROBOT_TYPE, deckId: OT2_STANDARD_DECKID }` for tests, but nothing uses it anymore, so we can just delete it. ## Test Plan and Hands on Testing Updated unit tests and confirmed that they pass. ## Risk assessment Low, this just fixes an incorrect unit test. --- .../src/file-data/__fixtures__/createFile/commonFields.ts | 8 +------- .../src/file-data/__tests__/createFile.test.ts | 4 ++-- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/protocol-designer/src/file-data/__fixtures__/createFile/commonFields.ts b/protocol-designer/src/file-data/__fixtures__/createFile/commonFields.ts index 4e271ce146e..37b9ef5812b 100644 --- a/protocol-designer/src/file-data/__fixtures__/createFile/commonFields.ts +++ b/protocol-designer/src/file-data/__fixtures__/createFile/commonFields.ts @@ -4,11 +4,7 @@ import { fixture_tiprack_10_ul, fixture_trash, } from '@opentrons/shared-data/labware/fixtures/2' -import { - OT2_ROBOT_TYPE, - OT2_STANDARD_DECKID, - fixtureP10SingleV2Specs, -} from '@opentrons/shared-data' +import { fixtureP10SingleV2Specs } from '@opentrons/shared-data' import type { LabwareDefinition2 } from '@opentrons/shared-data' import type { LabwareLiquidState, @@ -75,5 +71,3 @@ export const labwareDefsByURI: LabwareDefByDefURI = { 'opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1': fixture96Plate, 'opentrons/opentrons_1_trash_1100ml_fixed/1': fixtureTrash, } - -export const ot2Robot = { model: OT2_ROBOT_TYPE, deckId: OT2_STANDARD_DECKID } diff --git a/protocol-designer/src/file-data/__tests__/createFile.test.ts b/protocol-designer/src/file-data/__tests__/createFile.test.ts index 34428f5c70b..4a594e1c143 100644 --- a/protocol-designer/src/file-data/__tests__/createFile.test.ts +++ b/protocol-designer/src/file-data/__tests__/createFile.test.ts @@ -6,6 +6,7 @@ import { fixtureP300SingleV2Specs, labwareSchemaV2, protocolSchemaV8, + OT2_ROBOT_TYPE, } from '@opentrons/shared-data' import { fixture_12_trough, @@ -28,7 +29,6 @@ import { labwareNicknamesById, labwareDefsByURI, pipetteEntities, - ot2Robot, } from '../__fixtures__/createFile/commonFields' import * as v7Fixture from '../__fixtures__/createFile/v7Fixture' import type { LabwareDefinition2 } from '@opentrons/shared-data' @@ -76,7 +76,7 @@ describe('createFile selector', () => { fileMetadata, v7Fixture.initialRobotState, v7Fixture.robotStateTimeline, - ot2Robot, + OT2_ROBOT_TYPE, dismissedWarnings, ingredients, ingredLocations, From 2ec42e10d01dc06bc8efb4f604fcacae3b8189cb Mon Sep 17 00:00:00 2001 From: David Chau <46395074+ddcc4@users.noreply.github.com> Date: Fri, 7 Feb 2025 17:01:07 -0500 Subject: [PATCH 103/150] feat(protocol-designer): generate `requirements` section of Python file (#17474) # Overview Add the `requirements=` section to the Python file export. AUTH-1091 ## Test Plan and Hands on Testing Added unit tests for the Flex and OT-2. ## Risk assessment Low: Python export is hidden behind a feature flag, and no one is using it yet. --- .../file-data/__tests__/createFile.test.ts | 7 +++++- .../file-data/__tests__/pythonFile.test.ts | 23 ++++++++++++++++++- .../src/file-data/selectors/fileCreator.ts | 6 +++-- .../src/file-data/selectors/pythonFile.ts | 17 ++++++++++++++ 4 files changed, 49 insertions(+), 4 deletions(-) diff --git a/protocol-designer/src/file-data/__tests__/createFile.test.ts b/protocol-designer/src/file-data/__tests__/createFile.test.ts index 4a594e1c143..613f0e52f6a 100644 --- a/protocol-designer/src/file-data/__tests__/createFile.test.ts +++ b/protocol-designer/src/file-data/__tests__/createFile.test.ts @@ -99,7 +99,7 @@ describe('createFile selector', () => { it('should return a valid Python protocol file', () => { // @ts-expect-error(sa, 2021-6-15): resultFunc not part of Selector type - const result = createPythonFile.resultFunc(fileMetadata, {}) + const result = createPythonFile.resultFunc(fileMetadata, OT2_ROBOT_TYPE, {}) // This is just a quick smoke test to make sure createPythonFile() produces // something that looks like a Python file. The individual sections of the // generated Python will be tested in separate unit tests. @@ -114,6 +114,11 @@ metadata = { "description": "Protocol description", "created": "2020-02-25T21:48:32.515Z", } + +requirements = { + "robotType": "OT-2", + "apiLevel": "2.23", +} `.trimStart() ) }) diff --git a/protocol-designer/src/file-data/__tests__/pythonFile.test.ts b/protocol-designer/src/file-data/__tests__/pythonFile.test.ts index aab11d116c4..cb7f526606f 100644 --- a/protocol-designer/src/file-data/__tests__/pythonFile.test.ts +++ b/protocol-designer/src/file-data/__tests__/pythonFile.test.ts @@ -1,5 +1,6 @@ import { describe, it, expect } from 'vitest' -import { pythonMetadata } from '../selectors/pythonFile' +import { FLEX_ROBOT_TYPE, OT2_ROBOT_TYPE } from '@opentrons/shared-data' +import { pythonMetadata, pythonRequirements } from '../selectors/pythonFile' describe('pythonMetadata', () => { it('should generate metadata section', () => { @@ -29,3 +30,23 @@ metadata = { ) }) }) + +describe('pythonRequirements', () => { + it('should generate requirements section', () => { + expect(pythonRequirements(OT2_ROBOT_TYPE)).toBe( + ` +requirements = { + "robotType": "OT-2", + "apiLevel": "2.23", +}`.trimStart() + ) + + expect(pythonRequirements(FLEX_ROBOT_TYPE)).toBe( + ` +requirements = { + "robotType": "Flex", + "apiLevel": "2.23", +}`.trimStart() + ) + }) +}) diff --git a/protocol-designer/src/file-data/selectors/fileCreator.ts b/protocol-designer/src/file-data/selectors/fileCreator.ts index b990d367b64..9850b802dc7 100644 --- a/protocol-designer/src/file-data/selectors/fileCreator.ts +++ b/protocol-designer/src/file-data/selectors/fileCreator.ts @@ -26,7 +26,7 @@ import { getModulesLoadInfo, getPipettesLoadInfo, } from './utils' -import { pythonImports, pythonMetadata } from './pythonFile' +import { pythonImports, pythonMetadata, pythonRequirements } from './pythonFile' import type { SecondOrderCommandAnnotation } from '@opentrons/shared-data/commandAnnotation/types' import type { @@ -302,12 +302,14 @@ export const createFile: Selector = createSelector( export const createPythonFile: Selector = createSelector( getFileMetadata, - fileMetadata => { + getRobotType, + (fileMetadata, robotType) => { return ( [ // Here are the sections of the Python file: pythonImports(), pythonMetadata(fileMetadata), + pythonRequirements(robotType), ] .filter(section => section) // skip any blank sections .join('\n\n') + '\n' diff --git a/protocol-designer/src/file-data/selectors/pythonFile.ts b/protocol-designer/src/file-data/selectors/pythonFile.ts index 8af7707dc08..dbf5e9c3bf9 100644 --- a/protocol-designer/src/file-data/selectors/pythonFile.ts +++ b/protocol-designer/src/file-data/selectors/pythonFile.ts @@ -1,7 +1,11 @@ /** Generate sections of the Python file for fileCreator.ts */ +import { FLEX_ROBOT_TYPE, OT2_ROBOT_TYPE } from '@opentrons/shared-data' import { formatPyDict } from '@opentrons/step-generation' import type { FileMetadataFields } from '../types' +import type { RobotType } from '@opentrons/shared-data' + +const PAPI_VERSION = '2.23' // latest version from api/src/opentrons/protocols/api_support/definitions.py export function pythonImports(): string { return [ @@ -29,3 +33,16 @@ export function pythonMetadata(fileMetadata: FileMetadataFields): string { ) return `metadata = ${formatPyDict(stringifiedMetadata)}` } + +export function pythonRequirements(robotType: RobotType): string { + const ROBOTTYPE_TO_PAPI_NAME = { + // values from api/src/opentrons/protocols/parse.py + [OT2_ROBOT_TYPE]: 'OT-2', + [FLEX_ROBOT_TYPE]: 'Flex', + } + const requirements = { + robotType: ROBOTTYPE_TO_PAPI_NAME[robotType], + apiLevel: PAPI_VERSION, + } + return `requirements = ${formatPyDict(requirements)}` +} From 2799f8e4609462e3cb7b9a0ddf5b20bed6fcc5d0 Mon Sep 17 00:00:00 2001 From: Jethary Date: Sat, 8 Feb 2025 13:09:31 -0500 Subject: [PATCH 104/150] add back adapter, labware, slot controls --- .../Designer/DeckSetup/AdapterControls.tsx | 144 +++++----- .../pages/Designer/DeckSetup/BlockedSlot.tsx | 26 +- .../Designer/DeckSetup/DeckItemHover.tsx | 207 -------------- .../Designer/DeckSetup/DeckSetupDetails.tsx | 252 ++++++++++-------- .../Designer/DeckSetup/LabwareControls.tsx | 162 +++++++++++ .../pages/Designer/DeckSetup/SlotControls.tsx | 116 +++----- .../__tests__/DeckSetupContainer.test.tsx | 2 +- .../src/pages/Designer/DeckSetup/constants.ts | 31 ++- .../src/pages/Designer/DeckSetup/types.ts | 13 + .../src/pages/Designer/DeckSetup/utils.ts | 8 +- .../Designer/OffDeck/OffDeckControls.tsx | 96 +++++++ .../pages/Designer/OffDeck/OffDeckDetails.tsx | 8 +- .../formLevel/moveLabwareFormErrors.ts | 17 +- .../src/utils/labwareModuleCompatibility.ts | 141 +--------- 14 files changed, 572 insertions(+), 651 deletions(-) delete mode 100644 protocol-designer/src/pages/Designer/DeckSetup/DeckItemHover.tsx create mode 100644 protocol-designer/src/pages/Designer/DeckSetup/LabwareControls.tsx create mode 100644 protocol-designer/src/pages/Designer/DeckSetup/types.ts create mode 100644 protocol-designer/src/pages/Designer/OffDeck/OffDeckControls.tsx diff --git a/protocol-designer/src/pages/Designer/DeckSetup/AdapterControls.tsx b/protocol-designer/src/pages/Designer/DeckSetup/AdapterControls.tsx index 8e4a8c2aea5..fc38fdcc58e 100644 --- a/protocol-designer/src/pages/Designer/DeckSetup/AdapterControls.tsx +++ b/protocol-designer/src/pages/Designer/DeckSetup/AdapterControls.tsx @@ -1,38 +1,32 @@ -import * as React from 'react' import { useDispatch, useSelector } from 'react-redux' +import { useRef } from 'react' import { useDrop } from 'react-dnd' -import cx from 'classnames' -import noop from 'lodash/noop' -import { Icon, RobotCoordsForeignDiv } from '@opentrons/components' -import { DND_TYPES } from '../../../constants' -import { - getAdapterLabwareIsAMatch, - getLabwareIsCustom, -} from '../../../utils/labwareModuleCompatibility' import { - deleteContainer, - moveDeckItem, - openAddLabwareModal, -} from '../../../labware-ingred/actions' + ALIGN_CENTER, + Flex, + JUSTIFY_CENTER, + Link, + RobotCoordsForeignDiv, + StyledText, +} from '@opentrons/components' +import { getLabwareEntities } from '../../../step-forms/selectors' +import { DND_TYPES } from '../../../constants' +import { getLabwareIsCustom } from '../../../utils/labwareModuleCompatibility' +import { moveDeckItem } from '../../../labware-ingred/actions' import { selectors as labwareDefSelectors } from '../../../labware-defs' -// import { START_TERMINAL_ITEM_ID } from '../../../steplist' import { BlockedSlot } from './BlockedSlot' +import { DECK_CONTROLS_STYLE } from './constants' import type { DropTargetMonitor } from 'react-dnd' -import type { CoordinateTuple, Dimensions } from '@opentrons/shared-data' -import type { TerminalItemId } from '../../../steplist' +import type { Dimensions } from '@opentrons/shared-data' import type { LabwareOnDeck } from '../../../step-forms' +import type { SharedControlsType } from './types' -// import styles from './LabwareOverlays.module.css' - -interface AdapterControlsProps { - slotPosition: CoordinateTuple +interface AdapterControlsProps extends SharedControlsType { slotBoundingBox: Dimensions - // labwareId is the adapter's labwareId + // the adapter's labwareId labwareId: string - allLabware: LabwareOnDeck[] onDeck: boolean - // selectedTerminalItemId?: TerminalItemId | null handleDragHover?: () => void } @@ -49,17 +43,21 @@ export const AdapterControls = ( labwareId, onDeck, handleDragHover, - allLabware, + hover, + setHover, + setShowMenuListForId, + itemId, + isSelected, + tab, } = props const customLabwareDefs = useSelector( labwareDefSelectors.getCustomLabwareDefsByURI ) - const ref = React.useRef(null) - const dispatch = useDispatch() + const labwareEntities = useSelector(getLabwareEntities) + const adapterLoadName = labwareEntities[labwareId].def.parameters.loadName - const adapterName = - allLabware.find(labware => labware.id === labwareId)?.def.metadata - .displayName ?? '' + const ref = useRef(null) + const dispatch = useDispatch() const [{ itemType, draggedItem, isOver }, drop] = useDrop( () => ({ @@ -76,13 +74,10 @@ export const AdapterControls = ( customLabwareDefs, item.labwareOnDeck ) - return ( - getAdapterLabwareIsAMatch( - labwareId, - allLabware, - draggedDef.parameters.loadName - ) || isCustomLabware - ) + const adapterLabwareIsMatch = + draggedDef.stackingOffsetWithLabware?.[adapterLoadName] != null + + return adapterLabwareIsMatch || isCustomLabware } return true }, @@ -107,33 +102,33 @@ export const AdapterControls = ( [] ) - if (itemType !== DND_TYPES.LABWARE && itemType !== null) return null + if ( + (itemType !== DND_TYPES.LABWARE && itemType !== null) || + tab === 'protocolSteps' || + isSelected || + slotPosition == null + ) { + return null + } + const draggedDef = draggedItem?.labwareOnDeck?.def const isCustomLabware = draggedItem ? getLabwareIsCustom(customLabwareDefs, draggedItem.labwareOnDeck) : false - let slotBlocked: string | null = null - - if (isOver && draggedDef != null && isCustomLabware) { - slotBlocked = 'Custom Labware incompatible with this adapter' - } else if ( + const isSlotBlocked = isOver && draggedDef != null && - !getAdapterLabwareIsAMatch( - labwareId, - allLabware, - draggedDef.parameters.loadName - ) - ) { - slotBlocked = 'Labware incompatible with this adapter' - } + draggedDef.stackingOffsetWithLabware?.[adapterLoadName] == null && + !isCustomLabware drop(ref) + const hoverOpacity = (hover != null && hover === itemId) || isOver ? '1' : '0' + return ( - {slotBlocked ? ( + {isSlotBlocked ? ( { + setHover(itemId) + }, + onMouseLeave: () => { + setHover(null) + }, + onClick: () => { + if (!isOver) { + setShowMenuListForId(itemId) + } + }, }} > - dispatch(openAddLabwareModal({ slot: labwareId }))} - > - {!isOver && } - {isOver ? 'Place Here' : 'Add Labware'} - - { - window.confirm( - `"Are you sure you want to remove this ${adapterName}?` - ) && dispatch(deleteContainer({ labwareId: labwareId })) - }} + - {!isOver && } - {'Delete'} - + + + {isOver ? 'Place Here' : 'Edit Labware'} + + + )} diff --git a/protocol-designer/src/pages/Designer/DeckSetup/BlockedSlot.tsx b/protocol-designer/src/pages/Designer/DeckSetup/BlockedSlot.tsx index 2ae193d26b9..786af31674a 100644 --- a/protocol-designer/src/pages/Designer/DeckSetup/BlockedSlot.tsx +++ b/protocol-designer/src/pages/Designer/DeckSetup/BlockedSlot.tsx @@ -1,14 +1,13 @@ -import * as React from 'react' import { useTranslation } from 'react-i18next' -import { RobotCoordsForeignDiv } from '@opentrons/components' import { css } from 'styled-components' +import { RobotCoordsForeignDiv } from '@opentrons/components' type BlockedSlotMessage = | 'MODULE_INCOMPATIBLE_SINGLE_LABWARE' | 'MODULE_INCOMPATIBLE_LABWARE_SWAP' | 'LABWARE_INCOMPATIBLE_WITH_ADAPTER' -interface Props { +interface BlockedSlotProps { x: number y: number width: number @@ -16,9 +15,10 @@ interface Props { message: BlockedSlotMessage } -export const BlockedSlot = (props: Props): JSX.Element => { +export const BlockedSlot = (props: BlockedSlotProps): JSX.Element => { const { t } = useTranslation('deck') const { x, y, width, height, message } = props + // TODO: get design feedback on this return ( { innerDivProps={{ style: { height: '100%', - fontSize: '15px', + fontSize: '12px', color: 'white', margin: '-1.5rem 0.5rem', + transform: 'rotate(180deg) scaleX(-1)', }, }} > @@ -51,18 +52,3 @@ export const BlockedSlot = (props: Props): JSX.Element => { ) } - -// .blocked_slot_background { -// fill: rgba(200, 115, 0, 0.75); -// stroke: var(--c-red); -// rx: 6; -// } - -// .blocked_slot_content { -// height: 100%; -// margin: -1.5rem 0.5rem; -// color: var(--c-white); -// font-size: var(--fs-caption); -// text-align: center; -// line-height: 1.5; -// } diff --git a/protocol-designer/src/pages/Designer/DeckSetup/DeckItemHover.tsx b/protocol-designer/src/pages/Designer/DeckSetup/DeckItemHover.tsx deleted file mode 100644 index 99db89b1cbc..00000000000 --- a/protocol-designer/src/pages/Designer/DeckSetup/DeckItemHover.tsx +++ /dev/null @@ -1,207 +0,0 @@ -import { useTranslation } from 'react-i18next' -import { DropTargetMonitor, useDrag, useDrop } from 'react-dnd' -import { useDispatch, useSelector } from 'react-redux' -import { useRef, useEffect } from 'react' -import { css } from 'styled-components' -import { - ALIGN_CENTER, - BORDERS, - COLORS, - CURSOR_POINTER, - DISPLAY_FLEX, - Flex, - JUSTIFY_CENTER, - Link, - POSITION_ABSOLUTE, - PRODUCT, - RobotCoordsForeignDiv, - StyledText, -} from '@opentrons/components' -import { DND_TYPES } from '../../../constants' -import { moveDeckItem } from '../../../labware-ingred/actions' -import { getDeckSetupForActiveItem } from '../../../top-selectors/labware-locations' -import { BlockedSlot } from './BlockedSlot' - -import type { Dispatch, SetStateAction } from 'react' -import type { - CoordinateTuple, - DeckSlotId, - Dimensions, -} from '@opentrons/shared-data' -import type { LabwareOnDeck } from '../../../step-forms' -import type { ThunkDispatch } from '../../../types' -import type { DeckSetupTabType } from '../types' - -interface DeckItemHoverProps extends DeckSetupTabType { - hover: string | null - setHover: Dispatch> - slotBoundingBox: Dimensions - // can be slotId or labwareId (for off-deck labware) - itemId: string - slotPosition: CoordinateTuple | null - setShowMenuListForId: Dispatch> - labwareOnDeck: LabwareOnDeck - menuListId: DeckSlotId | null - setHoveredLabware?: (labware?: LabwareOnDeck | null) => void - setDraggedLabware?: (labware?: LabwareOnDeck | null) => void - swapBlocked?: boolean - isSelected?: boolean -} - -interface DroppedItem { - labwareOnDeck: LabwareOnDeck -} - -export function DeckItemHover(props: DeckItemHoverProps): JSX.Element | null { - const { - hover, - tab, - setHover, - slotBoundingBox, - itemId, - setShowMenuListForId, - menuListId, - slotPosition, - setHoveredLabware, - setDraggedLabware, - isSelected = false, - swapBlocked, - labwareOnDeck, - } = props - const { t } = useTranslation('starting_deck_state') - const deckSetup = useSelector(getDeckSetupForActiveItem) - - const offDeckLabware = Object.values(deckSetup.labware).find( - lw => lw.id === itemId - ) - - const hoverOpacity = - (hover != null && hover === itemId) || menuListId === itemId ? '1' : '0' - - const dispatch = useDispatch>() - const ref = useRef(null) - - const [, drag] = useDrag( - () => ({ - type: DND_TYPES.LABWARE, - item: { labwareOnDeck }, - }), - [labwareOnDeck] - ) - - const [{ draggedLabware }, drop] = useDrop( - () => ({ - accept: DND_TYPES.LABWARE, - canDrop: (item: DroppedItem) => { - const draggedLabware = item?.labwareOnDeck - const isDifferentSlot = - draggedLabware && draggedLabware.slot !== labwareOnDeck?.slot - return isDifferentSlot && !swapBlocked - }, - drop: (item: DroppedItem) => { - const draggedLabware = item?.labwareOnDeck - if (draggedLabware != null && labwareOnDeck != null) { - dispatch(moveDeckItem(draggedLabware.slot, labwareOnDeck.slot)) - } - }, - hover: () => { - setHoveredLabware?.(labwareOnDeck) - }, - collect: (monitor: DropTargetMonitor) => ({ - isOver: monitor.isOver(), - draggedLabware: monitor.getItem() as DroppedItem, - }), - }), - [labwareOnDeck] - ) - - useEffect(() => { - if (draggedLabware?.labwareOnDeck != null && setDraggedLabware != null) { - setDraggedLabware(draggedLabware?.labwareOnDeck) - } else { - setHoveredLabware?.(null) - setDraggedLabware?.(null) - } - }, [draggedLabware]) - - const isBeingDragged = - draggedLabware?.labwareOnDeck?.slot === labwareOnDeck?.slot - - drag(drop(ref)) - - if (tab === 'protocolSteps' || slotPosition === null || isSelected) - return null - - const x = slotPosition[0] - const y = slotPosition[1] - const width = slotBoundingBox.xDimension - const height = slotBoundingBox.yDimension - - console.log('swapBlocked in deckItemHover', swapBlocked) - return ( - { - setHover(itemId) - }, - onMouseLeave: () => { - setHover(null) - }, - onClick: () => { - setShowMenuListForId(itemId) - }, - }} - > - - - - - {isBeingDragged - ? 'dragging' - : offDeckLabware?.slot === 'offDeck' - ? t('edit_labware') - : t('edit_slot')} - - - - - {swapBlocked && ( - - )} - - ) -} diff --git a/protocol-designer/src/pages/Designer/DeckSetup/DeckSetupDetails.tsx b/protocol-designer/src/pages/Designer/DeckSetup/DeckSetupDetails.tsx index 34988ee6332..003a4965bd9 100644 --- a/protocol-designer/src/pages/Designer/DeckSetup/DeckSetupDetails.tsx +++ b/protocol-designer/src/pages/Designer/DeckSetup/DeckSetupDetails.tsx @@ -15,21 +15,27 @@ import { isAddressableAreaStandardSlot, THERMOCYCLER_MODULE_TYPE, } from '@opentrons/shared-data' -import { getSlotIdsBlockedBySpanningForThermocycler } from '../../../step-forms' +import { + getSlotIdsBlockedBySpanningForThermocycler, + getSlotIsEmpty, +} from '../../../step-forms' import { selectors } from '../../../labware-ingred/selectors' import { getStagingAreaAddressableAreas } from '../../../utils' import { editSlotInfo } from '../../../labware-ingred/actions' import { getRobotType } from '../../../file-data/selectors' import { LabwareOnDeck } from '../../../organisms' +import { getCustomLabwareDefsByURI } from '../../../labware-defs/selectors' import { getSlotInformation } from '../utils' import { HighlightLabware } from '../HighlightLabware' -import { DeckItemHover } from './DeckItemHover' import { SlotOverflowMenu } from './SlotOverflowMenu' import { HoveredItems } from './HoveredItems' import { SelectedHoveredItems } from './SelectedHoveredItems' import { getAdjacentLabware, getSwapBlocked } from './utils' import { SlotWarning } from './SlotWarning' import { HighlightItems } from './HighlightItems' +import { SlotControls } from './SlotControls' +import { AdapterControls } from './AdapterControls' +import { LabwareControls } from './LabwareControls' import type { ComponentProps, Dispatch, SetStateAction } from 'react' import type { ThermocyclerVizProps } from '@opentrons/components' @@ -43,7 +49,6 @@ import type { CutoutId, DeckDefinition, DeckSlotId, - Dimensions, ModuleModel, } from '@opentrons/shared-data' import type { @@ -53,8 +58,6 @@ import type { } from '../../../step-forms' import type { DeckSetupTabType } from '../types' import type { Fixture } from './constants' -import { getCustomLabwareDefsByURI } from '../../../labware-defs/selectors' -import { SlotControls } from './SlotControls' interface DeckSetupDetailsProps extends DeckSetupTabType { activeDeckSetup: InitialDeckSetup @@ -77,7 +80,7 @@ export function DeckSetupDetails(props: DeckSetupDetailsProps): JSX.Element { deckDef, hover, hoveredFixture, - hoveredLabware, + hoveredLabware: hoveredLabwareFromProp, hoveredModule, selectedZoomInSlot, tab, @@ -95,7 +98,7 @@ export function DeckSetupDetails(props: DeckSetupDetailsProps): JSX.Element { const [menuListId, setShowMenuListForId] = useState(null) const dispatch = useDispatch() - const [hoveredLabwareForSwap, setHoveredLabware] = useState< + const [hoveredLabware, setHoveredLabware] = useState< LabwareOnDeckType | null | undefined >(null) const [draggedLabware, setDraggedLabware] = useState< @@ -103,13 +106,15 @@ export function DeckSetupDetails(props: DeckSetupDetailsProps): JSX.Element { >(null) const customLabwareDefs = useSelector(getCustomLabwareDefsByURI) const swapBlocked = getSwapBlocked({ - hoveredLabware: hoveredLabwareForSwap, + hoveredLabware, draggedLabware, modulesById: activeDeckSetup.modules, customLabwareDefs, }) - const handleHoverEmptySlot = useCallback(() => setHoveredLabware(null), []) + const handleHoverEmptySlot = useCallback(() => { + setHoveredLabware(null) + }, []) const { createdLabwareForSlot, @@ -176,6 +181,7 @@ export function DeckSetupDetails(props: DeckSetupDetailsProps): JSX.Element { return null } const moduleDef = getModuleDef2(moduleOnDeck.model) + const getModuleInnerProps = ( moduleState: ModuleTemporalProperties['moduleState'] ): ComponentProps['innerProps'] => { @@ -212,11 +218,6 @@ export function DeckSetupDetails(props: DeckSetupDetailsProps): JSX.Element { yDimension: moduleDef.dimensions.labwareInterfaceYDimension ?? 0, zDimension: 0, } - const controlSelectDimensions = { - xDimension: labwareLoadedOnModule?.def.dimensions.xDimension ?? 0, - yDimension: labwareLoadedOnModule?.def.dimensions.yDimension ?? 0, - zDimension: labwareLoadedOnModule?.def.dimensions.zDimension ?? 0, - } const isLabwareOccludedByThermocyclerLid = moduleOnDeck.type === THERMOCYCLER_MODULE_TYPE && (moduleOnDeck.moduleState as ThermocyclerModuleState).lidOpen !== @@ -236,6 +237,10 @@ export function DeckSetupDetails(props: DeckSetupDetailsProps): JSX.Element { } : tempInnerProps + const isAdapter = labwareLoadedOnModule?.def.allowedRoles?.includes( + 'adapter' + ) + return moduleOnDeck.slot !== selectedSlot.slot ? ( - + + {isAdapter ? ( + + ) : ( + + )} ) : null} {labwareLoadedOnModule == null ? ( - <> - - + ) : null} @@ -335,36 +355,32 @@ export function DeckSetupDetails(props: DeckSetupDetailsProps): JSX.Element { stagingAreaAddressableAreas.includes(addressableArea.id) return ( addressableAreas && - !slotIdsBlockedBySpanning.includes(addressableArea.id) + !slotIdsBlockedBySpanning.includes(addressableArea.id) && + getSlotIsEmpty(activeDeckSetup, addressableArea.id) ) }) .map(addressableArea => { - const moduleType = Object.values(activeDeckSetup.modules).find( - module => module.slot === addressableArea.id - )?.type return ( - - - + ) })} + {/* all labware on deck NOT those in modules */} {allLabware.map(labware => { if ( @@ -374,6 +390,7 @@ export function DeckSetupDetails(props: DeckSetupDetailsProps): JSX.Element { labware.id === adjacentLabware?.id ) return null + const slotPosition = getPositionFromSlotId(labware.slot, deckDef) const slotBoundingBox = getAddressableAreaFromSlotId( labware.slot, @@ -383,7 +400,10 @@ export function DeckSetupDetails(props: DeckSetupDetailsProps): JSX.Element { console.warn(`no slot ${labware.slot} for labware ${labware.id}!`) return null } - return labware.slot !== selectedSlot.slot ? ( + const labwareIsAdapter = + labware.def.metadata.displayCategory === 'adapter' + + return ( - + {labwareIsAdapter ? ( + + ) : ( + + )} - ) : null + ) })} {/* all nested labwares on deck */} @@ -442,11 +477,7 @@ export function DeckSetupDetails(props: DeckSetupDetailsProps): JSX.Element { console.warn(`no slot ${labware.slot} for labware ${labware.id}!`) return null } - const slotBoundingBox: Dimensions = { - xDimension: labware.def.dimensions.xDimension, - yDimension: labware.def.dimensions.yDimension, - zDimension: labware.def.dimensions.zDimension, - } + const moduleParent = allModules.find( module => module.id === slotForOnTheDeck ) @@ -454,6 +485,7 @@ export function DeckSetupDetails(props: DeckSetupDetailsProps): JSX.Element { moduleParent == null ? slotForOnTheDeck : allModules.find(module => module.id === slotForOnTheDeck)?.slot + return ( - ) @@ -493,7 +523,7 @@ export function DeckSetupDetails(props: DeckSetupDetailsProps): JSX.Element { deckDef={deckDef} robotType={robotType} hoveredFixture={hoveredFixture} - hoveredLabware={hoveredLabware} + hoveredLabware={hoveredLabwareFromProp} hoveredModule={hoveredModule} slotPosition={slotPosition} /> @@ -504,7 +534,7 @@ export function DeckSetupDetails(props: DeckSetupDetailsProps): JSX.Element { deckDef={deckDef} robotType={robotType} hoveredFixture={hoveredFixture} - hoveredLabware={hoveredLabware} + hoveredLabware={hoveredLabwareFromProp} hoveredModule={hoveredModule} /> diff --git a/protocol-designer/src/pages/Designer/DeckSetup/LabwareControls.tsx b/protocol-designer/src/pages/Designer/DeckSetup/LabwareControls.tsx new file mode 100644 index 00000000000..0662d18c060 --- /dev/null +++ b/protocol-designer/src/pages/Designer/DeckSetup/LabwareControls.tsx @@ -0,0 +1,162 @@ +import { useDispatch } from 'react-redux' +import { useTranslation } from 'react-i18next' +import { useDrag, useDrop } from 'react-dnd' +import { useEffect, useRef } from 'react' +import { + ALIGN_CENTER, + Flex, + JUSTIFY_CENTER, + Link, + RobotCoordsForeignDiv, + StyledText, +} from '@opentrons/components' +import { BlockedSlot } from './BlockedSlot' +import { DND_TYPES } from '../../../constants' +import { moveDeckItem } from '../../../labware-ingred/actions' +import { DECK_CONTROLS_STYLE } from './constants' + +import type { DropTargetMonitor } from 'react-dnd' +import type { LabwareOnDeck } from '../../../step-forms' +import type { ThunkDispatch } from '../../../types' +import type { SharedControlsType } from './types' + +interface LabwareControlsProps extends SharedControlsType { + labwareOnDeck: LabwareOnDeck + setHoveredLabware: (labware?: LabwareOnDeck | null) => void + setDraggedLabware: (labware?: LabwareOnDeck | null) => void + swapBlocked: boolean +} + +interface DroppedItem { + labwareOnDeck: LabwareOnDeck +} + +export const LabwareControls = ( + props: LabwareControlsProps +): JSX.Element | null => { + const { + labwareOnDeck, + slotPosition, + setHoveredLabware, + setDraggedLabware, + swapBlocked, + hover, + setHover, + setShowMenuListForId, + isSelected, + tab, + itemId, + } = props + const dispatch = useDispatch>() + const ref = useRef(null) + const { t } = useTranslation('starting_deck_state') + + const [, drag] = useDrag( + () => ({ + type: DND_TYPES.LABWARE, + item: { labwareOnDeck }, + }), + [labwareOnDeck] + ) + + const [{ draggedLabware }, drop] = useDrop( + () => ({ + accept: DND_TYPES.LABWARE, + canDrop: (item: DroppedItem) => { + const draggedLabware = item?.labwareOnDeck + const isDifferentSlot = + draggedLabware && draggedLabware.slot !== labwareOnDeck.slot + return isDifferentSlot && !swapBlocked + }, + drop: (item: DroppedItem) => { + const draggedLabware = item?.labwareOnDeck + if (draggedLabware != null) { + dispatch(moveDeckItem(draggedLabware.slot, labwareOnDeck.slot)) + } + }, + hover: () => { + setHoveredLabware(labwareOnDeck) + }, + collect: (monitor: DropTargetMonitor) => ({ + isOver: monitor.isOver(), + draggedLabware: monitor.getItem() as DroppedItem, + }), + }), + [labwareOnDeck] + ) + + useEffect(() => { + if (draggedLabware?.labwareOnDeck != null) { + setDraggedLabware(draggedLabware?.labwareOnDeck) + } else { + setHoveredLabware(null) + setDraggedLabware(null) + } + }, [draggedLabware]) + + const isBeingDragged = + draggedLabware?.labwareOnDeck?.slot === labwareOnDeck.slot + + drag(drop(ref)) + + if (tab === 'protocolSteps' || isSelected || slotPosition == null) { + return null + } + + const [x, y] = slotPosition + const width = labwareOnDeck.def.dimensions.xDimension + const height = labwareOnDeck.def.dimensions.yDimension + + let hoverOpacity = '0' + if (isBeingDragged) { + hoverOpacity = '0.2' + } else if (hover != null && hover === itemId) { + hoverOpacity = '1' + } + + return ( + <> + {swapBlocked ? ( + + ) : ( + { + setHover(itemId) + }, + onMouseLeave: () => { + setHover(null) + }, + onClick: () => { + if (!isBeingDragged) { + setShowMenuListForId(itemId) + } + }, + }} + > + + + + {isBeingDragged ? 'dragging' : t('edit_labware')} + + + + + )} + + ) +} diff --git a/protocol-designer/src/pages/Designer/DeckSetup/SlotControls.tsx b/protocol-designer/src/pages/Designer/DeckSetup/SlotControls.tsx index 82c05c2691c..53faa678ae7 100644 --- a/protocol-designer/src/pages/Designer/DeckSetup/SlotControls.tsx +++ b/protocol-designer/src/pages/Designer/DeckSetup/SlotControls.tsx @@ -1,18 +1,12 @@ import { useTranslation } from 'react-i18next' -import { Dispatch, SetStateAction, useRef } from 'react' +import { useRef } from 'react' import { useSelector, useDispatch } from 'react-redux' import { useDrop, useDrag } from 'react-dnd' import { ALIGN_CENTER, - BORDERS, - COLORS, - CURSOR_POINTER, - DISPLAY_FLEX, Flex, JUSTIFY_CENTER, Link, - POSITION_ABSOLUTE, - PRODUCT, RobotCoordsForeignDiv, StyledText, } from '@opentrons/components' @@ -24,29 +18,18 @@ import { import { moveDeckItem } from '../../../labware-ingred/actions' import { selectors as labwareDefSelectors } from '../../../labware-defs' import { BlockedSlot } from './BlockedSlot' +import { DECK_CONTROLS_STYLE } from './constants' import type { DropTargetMonitor } from 'react-dnd' -import type { - CoordinateTuple, - DeckSlotId, - Dimensions, - ModuleType, -} from '@opentrons/shared-data' +import type { Dimensions, ModuleType } from '@opentrons/shared-data' import type { LabwareOnDeck } from '../../../step-forms' -import type { DeckSetupTabType } from '../types' +import type { SharedControlsType } from './types' -interface SlotControlsProps extends DeckSetupTabType { - slotPosition: CoordinateTuple | null +interface SlotControlsProps extends SharedControlsType { slotBoundingBox: Dimensions - // slotId can be either AddressableAreaName or moduleId + // NOTE: slotId can be either AddressableAreaName or moduleId slotId: string moduleType: ModuleType | null - setHover: Dispatch> - hover: string | null - itemId: string - menuListId: DeckSlotId | null - setShowMenuListForId: Dispatch> - isSelected?: boolean handleDragHover?: () => void } @@ -60,24 +43,22 @@ export const SlotControls = (props: SlotControlsProps): JSX.Element | null => { slotPosition, slotId, moduleType, - handleDragHover, - itemId, hover, + handleDragHover, setHover, - isSelected, - tab, - menuListId, setShowMenuListForId, + itemId, + tab, + isSelected, } = props - const { t } = useTranslation(['deck', 'starting_deck_state']) - const hoverOpacity = - (hover != null && hover === itemId) || menuListId === itemId ? '1' : '0' const customLabwareDefs = useSelector( labwareDefSelectors.getCustomLabwareDefsByURI ) const ref = useRef(null) const dispatch = useDispatch() + const { t } = useTranslation(['deck', 'starting_deck_state']) + const [, drag] = useDrag({ type: DND_TYPES.LABWARE, item: { labwareOnDeck: null }, @@ -92,7 +73,7 @@ export const SlotControls = (props: SlotControlsProps): JSX.Element | null => { draggedDef, 'no labware def of dragged item, expected it on drop' ) - console.log('hello hit here', moduleType, draggedDef) + if (moduleType != null && draggedDef != null) { // this is a module slot, prevent drop if the dragged labware is not compatible const isCustomLabware = getLabwareIsCustom( @@ -129,40 +110,32 @@ export const SlotControls = (props: SlotControlsProps): JSX.Element | null => { if ( (itemType !== DND_TYPES.LABWARE && itemType !== null) || - slotPosition == null + slotPosition == null || + tab === 'protocolSteps' || + isSelected ) return null const draggedDef = draggedItem?.labwareOnDeck?.def - console.log('dragged item', draggedItem) - const isCustomLabware = - draggedItem != null && draggedItem.labwareOnDeck != null - ? getLabwareIsCustom(customLabwareDefs, draggedItem.labwareOnDeck) - : false - drag(drop(ref)) - - if (tab === 'protocolSteps' || slotPosition === null || isSelected) - return null + const isCustomLabware = draggedItem + ? getLabwareIsCustom(customLabwareDefs, draggedItem.labwareOnDeck) + : false - const x = slotPosition[0] - const y = slotPosition[1] - const width = slotBoundingBox.xDimension - const height = slotBoundingBox.yDimension - - let slotBlocked: string | null = null - if ( + const isSlotBlocked = isOver && moduleType != null && draggedDef != null && - !getLabwareIsCompatible(draggedDef, moduleType) - ) { - slotBlocked = 'Labware incompatible with this module' - } + !getLabwareIsCompatible(draggedDef, moduleType) && + !isCustomLabware + + drag(drop(ref)) + + const hoverOpacity = (hover != null && hover === itemId) || isOver ? '1' : '0' return ( - {slotBlocked ? ( + {isSlotBlocked ? ( { /> ) : ( { setHover(itemId) @@ -201,21 +161,23 @@ export const SlotControls = (props: SlotControlsProps): JSX.Element | null => { setHover(null) }, onClick: () => { - setShowMenuListForId(itemId) + if (!isOver) { + setShowMenuListForId(itemId) + } }, }} > {isOver - ? t('overlay.slot.place_here') - : t('starting_deck_state:edit_slot')} + ? t(`overlay.slot.place_here`) + : t('starting_deck_state:edit_labware')} diff --git a/protocol-designer/src/pages/Designer/DeckSetup/__tests__/DeckSetupContainer.test.tsx b/protocol-designer/src/pages/Designer/DeckSetup/__tests__/DeckSetupContainer.test.tsx index e2ea9b30a85..a5d0226472d 100644 --- a/protocol-designer/src/pages/Designer/DeckSetup/__tests__/DeckSetupContainer.test.tsx +++ b/protocol-designer/src/pages/Designer/DeckSetup/__tests__/DeckSetupContainer.test.tsx @@ -15,7 +15,7 @@ import { import { getSelectedTerminalItemId } from '../../../../ui/steps' import { getDisableModuleRestrictions } from '../../../../feature-flags/selectors' import { getRobotType } from '../../../../file-data/selectors' -import { DeckSetupDetails } from '../DeckSetupDetails.1' +import { DeckSetupDetails } from '../DeckSetupDetails' import { DeckSetupTools } from '../DeckSetupTools' import { DeckSetupContainer } from '../DeckSetupContainer' import type * as OpentronsComponents from '@opentrons/components' diff --git a/protocol-designer/src/pages/Designer/DeckSetup/constants.ts b/protocol-designer/src/pages/Designer/DeckSetup/constants.ts index 5f433a9ff12..dc248cf1f76 100644 --- a/protocol-designer/src/pages/Designer/DeckSetup/constants.ts +++ b/protocol-designer/src/pages/Designer/DeckSetup/constants.ts @@ -14,12 +14,22 @@ import { MAGNETIC_BLOCK_TYPE, ABSORBANCE_READER_TYPE, ABSORBANCE_READER_V1, + FLEX_STACKER_MODULE_TYPE, } from '@opentrons/shared-data' +import { + ALIGN_CENTER, + BORDERS, + COLORS, + CURSOR_POINTER, + DISPLAY_FLEX, + POSITION_ABSOLUTE, + PRODUCT, +} from '@opentrons/components' import type { ModuleModel, ModuleType } from '@opentrons/shared-data' export const FLEX_MODULE_MODELS: ModuleModel[] = [ - 'absorbanceReaderV1', + ABSORBANCE_READER_V1, HEATERSHAKER_MODULE_V1, MAGNETIC_BLOCK_V1, TEMPERATURE_MODULE_V2, @@ -60,7 +70,6 @@ export const ORDERED_CATEGORIES: string[] = [ export const CUSTOM_CATEGORY = 'custom' export const ALL_ORDERED_CATEGORIES = [CUSTOM_CATEGORY, ...ORDERED_CATEGORIES] -// @ts-expect-error Flex stacker not yet supported in PD export const RECOMMENDED_LABWARE_BY_MODULE: { [K in ModuleType]: string[] } = { [TEMPERATURE_MODULE_TYPE]: [ 'opentrons_24_aluminumblock_generic_2ml_screwcap', @@ -95,6 +104,7 @@ export const RECOMMENDED_LABWARE_BY_MODULE: { [K in ModuleType]: string[] } = { 'opentrons_96_wellplate_200ul_pcr_full_skirt', ], [ABSORBANCE_READER_TYPE]: ['nest_96_wellplate_200ul_flat'], + [FLEX_STACKER_MODULE_TYPE]: [], } export const MOAM_MODELS_WITH_FF: ModuleModel[] = [TEMPERATURE_MODULE_V2] @@ -109,3 +119,20 @@ export const MAX_MOAM_MODULES = 7 // limiting 10 instead of 11 to make space for a single default tiprack // to be auto-generated export const MAX_MAGNETIC_BLOCKS = 10 + +export const DECK_CONTROLS_STYLE = { + position: POSITION_ABSOLUTE, + top: 0, + right: 0, + bottom: 0, + left: 0, + transform: 'rotate(180deg) scaleX(-1)', + zIndex: 1, + backgroundColor: `${COLORS.black90}cc`, + display: DISPLAY_FLEX, + alignItems: ALIGN_CENTER, + color: COLORS.white, + fontSize: PRODUCT.TYPOGRAPHY.fontSizeBodyDefaultSemiBold, + borderRadius: BORDERS.borderRadius8, + cursor: CURSOR_POINTER, +} diff --git a/protocol-designer/src/pages/Designer/DeckSetup/types.ts b/protocol-designer/src/pages/Designer/DeckSetup/types.ts new file mode 100644 index 00000000000..5e4d4998461 --- /dev/null +++ b/protocol-designer/src/pages/Designer/DeckSetup/types.ts @@ -0,0 +1,13 @@ +import type { Dispatch, SetStateAction } from 'react' +import type { CoordinateTuple } from '@opentrons/shared-data' +import type { DeckSetupTabType } from '../types' + +export interface SharedControlsType extends DeckSetupTabType { + slotPosition: CoordinateTuple | null + // this is either the slotId or offDeck labwareId + itemId: string + hover: string | null + setHover: Dispatch> + setShowMenuListForId: Dispatch> + isSelected: boolean +} diff --git a/protocol-designer/src/pages/Designer/DeckSetup/utils.ts b/protocol-designer/src/pages/Designer/DeckSetup/utils.ts index 31850a064a6..638d99b68b0 100644 --- a/protocol-designer/src/pages/Designer/DeckSetup/utils.ts +++ b/protocol-designer/src/pages/Designer/DeckSetup/utils.ts @@ -356,13 +356,7 @@ export const getSwapBlocked = (args: SwapBlockedArgs): boolean => { modulesById, customLabwareDefs, } = args - console.log( - 'swap', - hoveredLabware, - draggedLabware, - modulesById, - customLabwareDefs - ) + if (!hoveredLabware || !draggedLabware) { return false } diff --git a/protocol-designer/src/pages/Designer/OffDeck/OffDeckControls.tsx b/protocol-designer/src/pages/Designer/OffDeck/OffDeckControls.tsx new file mode 100644 index 00000000000..4987321faf0 --- /dev/null +++ b/protocol-designer/src/pages/Designer/OffDeck/OffDeckControls.tsx @@ -0,0 +1,96 @@ +import { useTranslation } from 'react-i18next' +import { css } from 'styled-components' +import { + Flex, + JUSTIFY_CENTER, + Link, + RobotCoordsForeignDiv, + StyledText, +} from '@opentrons/components' +import { DECK_CONTROLS_STYLE } from '../DeckSetup/constants' + +import type { Dispatch, SetStateAction } from 'react' +import type { + CoordinateTuple, + DeckSlotId, + Dimensions, +} from '@opentrons/shared-data' +import type { DeckSetupTabType } from '../types' + +interface OffDeckControlsProps extends DeckSetupTabType { + hover: string | null + setHover: Dispatch> + slotBoundingBox: Dimensions + labwareId: string + slotPosition: CoordinateTuple | null + setShowMenuListForId: Dispatch> + menuListId: DeckSlotId | null + isSelected?: boolean +} + +export function OffDeckControls( + props: OffDeckControlsProps +): JSX.Element | null { + const { + hover, + tab, + setHover, + slotBoundingBox, + labwareId, + setShowMenuListForId, + menuListId, + slotPosition, + isSelected = false, + } = props + const { t } = useTranslation('starting_deck_state') + if (tab === 'protocolSteps' || slotPosition === null || isSelected) + return null + + const hoverOpacity = + (hover != null && hover === labwareId) || menuListId === labwareId + ? '1' + : '0' + + return ( + { + setHover(labwareId) + }, + onMouseLeave: () => { + setHover(null) + }, + onClick: () => { + setShowMenuListForId(labwareId) + }, + }} + > + + { + setShowMenuListForId(labwareId) + }} + > + + {t('edit_labware')} + + + + + ) +} diff --git a/protocol-designer/src/pages/Designer/OffDeck/OffDeckDetails.tsx b/protocol-designer/src/pages/Designer/OffDeck/OffDeckDetails.tsx index 965780070b6..7be3efa3b7a 100644 --- a/protocol-designer/src/pages/Designer/OffDeck/OffDeckDetails.tsx +++ b/protocol-designer/src/pages/Designer/OffDeck/OffDeckDetails.tsx @@ -21,7 +21,7 @@ import { import * as wellContentsSelectors from '../../../top-selectors/well-contents' import { selectors } from '../../../labware-ingred/selectors' import { getDeckSetupForActiveItem } from '../../../top-selectors/labware-locations' -import { DeckItemHover } from '../DeckSetup/DeckItemHover' +import { OffDeckControls } from './OffDeckControls' import { SlotDetailsContainer } from '../../../organisms' import { wellFillFromWellContents } from '../../../organisms/LabwareOnDeck/utils' import { getRobotType } from '../../../file-data/selectors' @@ -166,16 +166,16 @@ export function OffDeckDetails(props: OffDeckDetailsProps): JSX.Element { )} /> - {/* */} + /> )} diff --git a/protocol-designer/src/steplist/formLevel/moveLabwareFormErrors.ts b/protocol-designer/src/steplist/formLevel/moveLabwareFormErrors.ts index c7ef90bb3e3..fc6a089e257 100644 --- a/protocol-designer/src/steplist/formLevel/moveLabwareFormErrors.ts +++ b/protocol-designer/src/steplist/formLevel/moveLabwareFormErrors.ts @@ -1,8 +1,5 @@ import { getLabwareDefIsStandard } from '@opentrons/shared-data' -import { - COMPATIBLE_LABWARE_ALLOWLIST_FOR_ADAPTER, - getLabwareCompatibleWithModule, -} from '../../utils/labwareModuleCompatibility' +import { getLabwareCompatibleWithModule } from '../../utils/labwareModuleCompatibility' import type { LabwareLocation } from '@opentrons/shared-data' import type { InvariantContext, @@ -26,7 +23,6 @@ const getMoveLabwareError = ( !getLabwareDefIsStandard(labware?.def) ) return null - const selectedLabwareDefUri = labware?.labwareDefURI if ('moduleId' in newLocation) { const moduleType = invariantContext.moduleEntities[newLocation.moduleId].type @@ -34,14 +30,13 @@ const getMoveLabwareError = ( ? 'Labware incompatible with this module' : null } else if ('labwareId' in newLocation) { - const adapterValueDefUri = + const adapterLoadName = invariantContext.labwareEntities[newLocation.labwareId].def.parameters .loadName - const adapterAllowList = - COMPATIBLE_LABWARE_ALLOWLIST_FOR_ADAPTER[adapterValueDefUri] - errorString = !adapterAllowList?.includes(selectedLabwareDefUri) - ? 'Labware incompatible with this adapter' - : null + errorString = + labware?.def.stackingOffsetWithLabware?.[adapterLoadName] == null + ? 'Labware incompatible with this adapter' + : null } return errorString } diff --git a/protocol-designer/src/utils/labwareModuleCompatibility.ts b/protocol-designer/src/utils/labwareModuleCompatibility.ts index c96be39c466..ceaa2f24b48 100644 --- a/protocol-designer/src/utils/labwareModuleCompatibility.ts +++ b/protocol-designer/src/utils/labwareModuleCompatibility.ts @@ -6,6 +6,7 @@ import { HEATERSHAKER_MODULE_TYPE, MAGNETIC_BLOCK_TYPE, ABSORBANCE_READER_TYPE, + FLEX_STACKER_MODULE_TYPE, } from '@opentrons/shared-data' import type { LabwareDefByDefURI } from '../labware-defs' import type { LabwareOnDeck } from '../step-forms' @@ -14,7 +15,6 @@ import type { LabwareDefinition2, ModuleType } from '@opentrons/shared-data' const PLATE_READER_MAX_LABWARE_Z_MM = 16 -// @ts-expect-error Flex stacker not yet supported in PD export const COMPATIBLE_LABWARE_ALLOWLIST_BY_MODULE_TYPE: Record< ModuleType, Readonly @@ -74,6 +74,7 @@ export const COMPATIBLE_LABWARE_ALLOWLIST_BY_MODULE_TYPE: Record< [ABSORBANCE_READER_TYPE]: [ 'opentrons_flex_lid_absorbance_plate_reader_module', ], + [FLEX_STACKER_MODULE_TYPE]: [], } export const getLabwareIsCompatible = ( def: LabwareDefinition2, @@ -88,75 +89,12 @@ export const getLabwareIsCompatible = ( return allowlist.includes(def.parameters.loadName) } -const DEEP_WELL_ADAPTER_LOADNAME = 'opentrons_96_deep_well_adapter' -const FLAT_BOTTOM_ADAPTER_LOADNAME = 'opentrons_96_flat_bottom_adapter' -const PCR_ADAPTER_LOADNAME = 'opentrons_96_pcr_adapter' -const UNIVERSAL_FLAT_ADAPTER_LOADNAME = 'opentrons_universal_flat_adapter' -const ALUMINUM_BLOCK_96_LOADNAME = 'opentrons_96_well_aluminum_block' -const ALUMINUM_FLAT_BOTTOM_PLATE = 'opentrons_aluminum_flat_bottom_plate' -const TEMP_DEEP_WELL_ADAPTER_LOADNAME = - 'opentrons_96_deep_well_temp_mod_adapter' export const ADAPTER_96_CHANNEL = 'opentrons_flex_96_tiprack_adapter' -export const COMPATIBLE_LABWARE_ALLOWLIST_FOR_ADAPTER: Record< - string, - string[] -> = { - [TEMP_DEEP_WELL_ADAPTER_LOADNAME]: ['opentrons/nest_96_wellplate_2ml_deep/2'], - [DEEP_WELL_ADAPTER_LOADNAME]: ['opentrons/nest_96_wellplate_2ml_deep/2'], - [FLAT_BOTTOM_ADAPTER_LOADNAME]: ['opentrons/nest_96_wellplate_200ul_flat/2'], - [PCR_ADAPTER_LOADNAME]: [ - 'opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2', - 'opentrons/opentrons_96_wellplate_200ul_pcr_full_skirt/2', - 'opentrons/biorad_96_wellplate_200ul_pcr/2', - ], - [UNIVERSAL_FLAT_ADAPTER_LOADNAME]: [ - 'opentrons/corning_384_wellplate_112ul_flat/2', - 'opentrons/corning_96_wellplate_360ul_flat/2', - // TODO(jr, 9/18/23): comment this out for now until these labwares are compatible - // with this adapter from the API side - // 'opentrons/corning_48_wellplate_1.6ml_flat/2', - // 'opentrons/corning_24_wellplate_3.4ml_flat/2', - // 'opentrons/corning_12_wellplate_6.9ml_flat/2', - // 'opentrons/corning_6_wellplate_16.8ml_flat/2', - // 'opentrons/nest_96_wellplate_200ul_flat/2', - ], - [ALUMINUM_BLOCK_96_LOADNAME]: [ - 'opentrons/biorad_96_wellplate_200ul_pcr/2', - 'opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2', - 'opentrons/opentrons_96_wellplate_200ul_pcr_full_skirt/2', - ], - [ALUMINUM_FLAT_BOTTOM_PLATE]: [ - 'opentrons/corning_384_wellplate_112ul_flat/2', - 'opentrons/corning_96_wellplate_360ul_flat/2', - 'opentrons/corning_48_wellplate_1.6ml_flat/2', - 'opentrons/corning_24_wellplate_3.4ml_flat/2', - 'opentrons/corning_12_wellplate_6.9ml_flat/2', - 'opentrons/corning_6_wellplate_16.8ml_flat/2', - 'opentrons/nest_96_wellplate_200ul_flat/2', - ], - [ADAPTER_96_CHANNEL]: [ - 'opentrons/opentrons_flex_96_tiprack_50ul/1', - 'opentrons/opentrons_flex_96_tiprack_200ul/1', - 'opentrons/opentrons_flex_96_tiprack_1000ul/1', - 'opentrons/opentrons_flex_96_filtertiprack_50ul/1', - 'opentrons/opentrons_flex_96_filtertiprack_200ul/1', - 'opentrons/opentrons_flex_96_filtertiprack_1000ul/1', - ], -} - -export const getLabwareCompatibleWithAdapter = ( - adapterLoadName?: string -): string[] => - adapterLoadName != null - ? COMPATIBLE_LABWARE_ALLOWLIST_FOR_ADAPTER[adapterLoadName] - : [] - export const getLabwareIsCustom = ( customLabwares: LabwareDefByDefURI, labwareOnDeck: LabwareOnDeck ): boolean => { - console.log('labwareOnDeck', labwareOnDeck) return labwareOnDeck.labwareDefURI in customLabwares } @@ -182,78 +120,3 @@ export const getLabwareCompatibleWithModule = ( def.parameters.loadName ) } - -export const getAdapterLabwareIsAMatch = ( - labwareId: string, - allLabware: LabwareOnDeck[], - draggedLabwareLoadname: string -): boolean => { - const loadName = Object.values(allLabware).find(lab => lab.id === labwareId) - ?.def.parameters.loadName - - const flatBottomLabwares = [ - 'corning_384_wellplate_112ul_flat', - 'corning_96_wellplate_360ul_flat', - 'corning_6_wellplate_16.8ml_flat', - 'corning_384_wellplate_112ul_flat', - 'corning_96_wellplate_360ul_flat', - 'corning_6_wellplate_16.8ml_flat', - 'nest_96_wellplate_200ul_flat', - ] - - const adapter96Tipracks = [ - 'opentrons_flex_96_tiprack_50ul', - 'opentrons_flex_96_tiprack_200ul', - 'opentrons_flex_96_tiprack_1000ul', - 'opentrons_flex_96_filtertiprack_50ul', - 'opentrons_flex_96_filtertiprack_200ul', - 'opentrons_flex_96_filtertiprack_1000ul', - ] - - const pcrLabwares = [ - 'biorad_96_wellplate_200ul_pcr', - 'nest_96_wellplate_100ul_pcr_full_skirt', - 'opentrons_96_wellplate_200ul_pcr_full_skirt', - ] - - const deepWellPair = - loadName === DEEP_WELL_ADAPTER_LOADNAME && - draggedLabwareLoadname === 'nest_96_wellplate_2ml_deep' - const flatBottomPair = - loadName === FLAT_BOTTOM_ADAPTER_LOADNAME && - draggedLabwareLoadname === 'nest_96_wellplate_200ul_flat' - const pcrPair = - loadName === PCR_ADAPTER_LOADNAME && - pcrLabwares.includes(draggedLabwareLoadname) - const universalPair = - loadName === UNIVERSAL_FLAT_ADAPTER_LOADNAME && - (draggedLabwareLoadname === 'corning_384_wellplate_112ul_flat' || - draggedLabwareLoadname === 'corning_96_wellplate_360ul_flat') - const aluminumBlock96Pairs = - loadName === ALUMINUM_BLOCK_96_LOADNAME && - pcrLabwares.includes(draggedLabwareLoadname) - const aluminumFlatBottomPlatePairs = - loadName === ALUMINUM_FLAT_BOTTOM_PLATE && - flatBottomLabwares.includes(draggedLabwareLoadname) - const adapter96ChannelPairs = - loadName === ADAPTER_96_CHANNEL && - adapter96Tipracks.includes(draggedLabwareLoadname) - const tempDeepWellAdapterPairs = - loadName === TEMP_DEEP_WELL_ADAPTER_LOADNAME && - draggedLabwareLoadname === 'nest_96_wellplate_2ml_deep' - - if ( - deepWellPair || - flatBottomPair || - pcrPair || - universalPair || - aluminumBlock96Pairs || - aluminumFlatBottomPlatePairs || - adapter96ChannelPairs || - tempDeepWellAdapterPairs - ) { - return true - } else { - return false - } -} From e358006d7dd32be1dac8aa0057f5ef6934eafa01 Mon Sep 17 00:00:00 2001 From: Jethary Date: Mon, 10 Feb 2025 08:09:14 -0500 Subject: [PATCH 105/150] feat(protocol-designer): deck setup drag & drop closes AUTh-1276 --- .../src/assets/localization/en/deck.json | 2 +- .../Designer/DeckSetup/AdapterControls.tsx | 21 ++++++---- .../pages/Designer/DeckSetup/BlockedSlot.tsx | 4 +- .../Designer/DeckSetup/DeckSetupDetails.tsx | 8 ++++ .../Designer/DeckSetup/LabwareControls.tsx | 40 +++++++++++++------ .../pages/Designer/DeckSetup/SlotControls.tsx | 14 +++---- .../src/pages/Designer/DeckSetup/constants.ts | 2 +- .../src/pages/Designer/DeckSetup/types.ts | 2 +- 8 files changed, 58 insertions(+), 35 deletions(-) diff --git a/protocol-designer/src/assets/localization/en/deck.json b/protocol-designer/src/assets/localization/en/deck.json index 0a19967ceab..e726fd7dae8 100644 --- a/protocol-designer/src/assets/localization/en/deck.json +++ b/protocol-designer/src/assets/localization/en/deck.json @@ -15,7 +15,7 @@ "overlay": { "slot": { "drag_to_new_slot": "Drag To New Slot", - "place_here": "Place Here" + "place_here": "Place here" } } } diff --git a/protocol-designer/src/pages/Designer/DeckSetup/AdapterControls.tsx b/protocol-designer/src/pages/Designer/DeckSetup/AdapterControls.tsx index fc38fdcc58e..d84e77e5451 100644 --- a/protocol-designer/src/pages/Designer/DeckSetup/AdapterControls.tsx +++ b/protocol-designer/src/pages/Designer/DeckSetup/AdapterControls.tsx @@ -1,4 +1,5 @@ import { useDispatch, useSelector } from 'react-redux' +import { useTranslation } from 'react-i18next' import { useRef } from 'react' import { useDrop } from 'react-dnd' import { @@ -19,8 +20,7 @@ import { DECK_CONTROLS_STYLE } from './constants' import type { DropTargetMonitor } from 'react-dnd' import type { Dimensions } from '@opentrons/shared-data' -import type { LabwareOnDeck } from '../../../step-forms' -import type { SharedControlsType } from './types' +import type { SharedControlsType, DroppedItem } from './types' interface AdapterControlsProps extends SharedControlsType { slotBoundingBox: Dimensions @@ -30,10 +30,6 @@ interface AdapterControlsProps extends SharedControlsType { handleDragHover?: () => void } -interface DroppedItem { - labwareOnDeck: LabwareOnDeck -} - export const AdapterControls = ( props: AdapterControlsProps ): JSX.Element | null => { @@ -50,11 +46,18 @@ export const AdapterControls = ( isSelected, tab, } = props + const { t } = useTranslation(['deck', 'starting_deck_state']) const customLabwareDefs = useSelector( labwareDefSelectors.getCustomLabwareDefsByURI ) const labwareEntities = useSelector(getLabwareEntities) - const adapterLoadName = labwareEntities[labwareId].def.parameters.loadName + const adapterLoadName = labwareEntities[labwareId]?.def.parameters.loadName + + if (adapterLoadName == null) { + console.error( + `expected to find the adapter loadname from labwareId ${labwareId} but could not` + ) + } const ref = useRef(null) const dispatch = useDispatch() @@ -168,7 +171,9 @@ export const AdapterControls = ( > - {isOver ? 'Place Here' : 'Edit Labware'} + {isOver + ? t('overlay.slot.place_here') + : t('starting_deck_state:edit_labware')} diff --git a/protocol-designer/src/pages/Designer/DeckSetup/BlockedSlot.tsx b/protocol-designer/src/pages/Designer/DeckSetup/BlockedSlot.tsx index 786af31674a..3cd35a7d265 100644 --- a/protocol-designer/src/pages/Designer/DeckSetup/BlockedSlot.tsx +++ b/protocol-designer/src/pages/Designer/DeckSetup/BlockedSlot.tsx @@ -1,6 +1,6 @@ import { useTranslation } from 'react-i18next' import { css } from 'styled-components' -import { RobotCoordsForeignDiv } from '@opentrons/components' +import { COLORS, RobotCoordsForeignDiv } from '@opentrons/components' type BlockedSlotMessage = | 'MODULE_INCOMPATIBLE_SINGLE_LABWARE' @@ -41,7 +41,7 @@ export const BlockedSlot = (props: BlockedSlotProps): JSX.Element => { style: { height: '100%', fontSize: '12px', - color: 'white', + color: COLORS.white, margin: '-1.5rem 0.5rem', transform: 'rotate(180deg) scaleX(-1)', }, diff --git a/protocol-designer/src/pages/Designer/DeckSetup/DeckSetupDetails.tsx b/protocol-designer/src/pages/Designer/DeckSetup/DeckSetupDetails.tsx index 003a4965bd9..f32b7d6d7bf 100644 --- a/protocol-designer/src/pages/Designer/DeckSetup/DeckSetupDetails.tsx +++ b/protocol-designer/src/pages/Designer/DeckSetup/DeckSetupDetails.tsx @@ -98,6 +98,14 @@ export function DeckSetupDetails(props: DeckSetupDetailsProps): JSX.Element { const [menuListId, setShowMenuListForId] = useState(null) const dispatch = useDispatch() + // handling module<>labware compat when moving labware to empty module + // is handled by SlotControls. But when swapping labware when at least + // one is on a module, we need to be aware of not only what labware is + // being dragged, but also what labware is **being hovered over**. + // The intrinsic state of `react-dnd` is not designed to handle that. + // So we need to use our own state here to determine whether swapping + // will be blocked due to labware<>module compatibility. That is what + // hoveredLabware and draggedLabare are for. const [hoveredLabware, setHoveredLabware] = useState< LabwareOnDeckType | null | undefined >(null) diff --git a/protocol-designer/src/pages/Designer/DeckSetup/LabwareControls.tsx b/protocol-designer/src/pages/Designer/DeckSetup/LabwareControls.tsx index 0662d18c060..d4e6a0a0697 100644 --- a/protocol-designer/src/pages/Designer/DeckSetup/LabwareControls.tsx +++ b/protocol-designer/src/pages/Designer/DeckSetup/LabwareControls.tsx @@ -10,15 +10,15 @@ import { RobotCoordsForeignDiv, StyledText, } from '@opentrons/components' -import { BlockedSlot } from './BlockedSlot' import { DND_TYPES } from '../../../constants' import { moveDeckItem } from '../../../labware-ingred/actions' import { DECK_CONTROLS_STYLE } from './constants' +import { BlockedSlot } from './BlockedSlot' import type { DropTargetMonitor } from 'react-dnd' import type { LabwareOnDeck } from '../../../step-forms' import type { ThunkDispatch } from '../../../types' -import type { SharedControlsType } from './types' +import type { SharedControlsType, DroppedItem } from './types' interface LabwareControlsProps extends SharedControlsType { labwareOnDeck: LabwareOnDeck @@ -27,10 +27,6 @@ interface LabwareControlsProps extends SharedControlsType { swapBlocked: boolean } -interface DroppedItem { - labwareOnDeck: LabwareOnDeck -} - export const LabwareControls = ( props: LabwareControlsProps ): JSX.Element | null => { @@ -49,17 +45,20 @@ export const LabwareControls = ( } = props const dispatch = useDispatch>() const ref = useRef(null) - const { t } = useTranslation('starting_deck_state') + const { t } = useTranslation(['starting_deck_state', 'deck']) - const [, drag] = useDrag( + const [{ isDragging }, drag] = useDrag( () => ({ type: DND_TYPES.LABWARE, item: { labwareOnDeck }, + collect: monitor => ({ + isDragging: monitor.isDragging(), + }), }), [labwareOnDeck] ) - const [{ draggedLabware }, drop] = useDrop( + const [{ isOver, draggedLabware, canDrop }, drop] = useDrop( () => ({ accept: DND_TYPES.LABWARE, canDrop: (item: DroppedItem) => { @@ -80,6 +79,7 @@ export const LabwareControls = ( collect: (monitor: DropTargetMonitor) => ({ isOver: monitor.isOver(), draggedLabware: monitor.getItem() as DroppedItem, + canDrop: monitor.canDrop(), }), }), [labwareOnDeck] @@ -107,10 +107,23 @@ export const LabwareControls = ( const width = labwareOnDeck.def.dimensions.xDimension const height = labwareOnDeck.def.dimensions.yDimension + const getDisplayText = (): string => { + if (isDragging) { + return t('deck:overlay.slot.drag_to_new_slot') + } + if (isBeingDragged) { + return '' + } + if (isOver && canDrop) { + return t('deck:overlay.slot.place_here') + } + return t('edit_labware') + } + let hoverOpacity = '0' - if (isBeingDragged) { - hoverOpacity = '0.2' - } else if (hover != null && hover === itemId) { + if (isOver && canDrop) { + hoverOpacity = '0.8' + } else if (hover === itemId) { hoverOpacity = '1' } @@ -128,6 +141,7 @@ export const LabwareControls = ( style: { opacity: hoverOpacity, ...DECK_CONTROLS_STYLE, + zIndex: isOver && canDrop ? 50 : 'auto', }, onMouseEnter: () => { setHover(itemId) @@ -151,7 +165,7 @@ export const LabwareControls = ( > - {isBeingDragged ? 'dragging' : t('edit_labware')} + {getDisplayText()} diff --git a/protocol-designer/src/pages/Designer/DeckSetup/SlotControls.tsx b/protocol-designer/src/pages/Designer/DeckSetup/SlotControls.tsx index 53faa678ae7..5f27096cb05 100644 --- a/protocol-designer/src/pages/Designer/DeckSetup/SlotControls.tsx +++ b/protocol-designer/src/pages/Designer/DeckSetup/SlotControls.tsx @@ -22,8 +22,7 @@ import { DECK_CONTROLS_STYLE } from './constants' import type { DropTargetMonitor } from 'react-dnd' import type { Dimensions, ModuleType } from '@opentrons/shared-data' -import type { LabwareOnDeck } from '../../../step-forms' -import type { SharedControlsType } from './types' +import type { SharedControlsType, DroppedItem } from './types' interface SlotControlsProps extends SharedControlsType { slotBoundingBox: Dimensions @@ -33,10 +32,6 @@ interface SlotControlsProps extends SharedControlsType { handleDragHover?: () => void } -interface DroppedItem { - labwareOnDeck: LabwareOnDeck -} - export const SlotControls = (props: SlotControlsProps): JSX.Element | null => { const { slotBoundingBox, @@ -118,9 +113,10 @@ export const SlotControls = (props: SlotControlsProps): JSX.Element | null => { const draggedDef = draggedItem?.labwareOnDeck?.def - const isCustomLabware = draggedItem - ? getLabwareIsCustom(customLabwareDefs, draggedItem.labwareOnDeck) - : false + const isCustomLabware = + draggedItem != null + ? getLabwareIsCustom(customLabwareDefs, draggedItem.labwareOnDeck) + : false const isSlotBlocked = isOver && diff --git a/protocol-designer/src/pages/Designer/DeckSetup/constants.ts b/protocol-designer/src/pages/Designer/DeckSetup/constants.ts index dc248cf1f76..628e330d549 100644 --- a/protocol-designer/src/pages/Designer/DeckSetup/constants.ts +++ b/protocol-designer/src/pages/Designer/DeckSetup/constants.ts @@ -132,7 +132,7 @@ export const DECK_CONTROLS_STYLE = { display: DISPLAY_FLEX, alignItems: ALIGN_CENTER, color: COLORS.white, - fontSize: PRODUCT.TYPOGRAPHY.fontSizeBodyDefaultSemiBold, + fontSize: PRODUCT.TYPOGRAPHY.fontFamilyBodyDefaultRegular, borderRadius: BORDERS.borderRadius8, cursor: CURSOR_POINTER, } diff --git a/protocol-designer/src/pages/Designer/DeckSetup/types.ts b/protocol-designer/src/pages/Designer/DeckSetup/types.ts index 5e4d4998461..20631cff1bb 100644 --- a/protocol-designer/src/pages/Designer/DeckSetup/types.ts +++ b/protocol-designer/src/pages/Designer/DeckSetup/types.ts @@ -4,7 +4,7 @@ import type { DeckSetupTabType } from '../types' export interface SharedControlsType extends DeckSetupTabType { slotPosition: CoordinateTuple | null - // this is either the slotId or offDeck labwareId + // this is the slotId (i.e. D1, A1, 1, 2, 3) itemId: string hover: string | null setHover: Dispatch> From 4fdd39c5f3e639ed35d3bcc767074777c6c6089f Mon Sep 17 00:00:00 2001 From: Jethary Date: Mon, 10 Feb 2025 08:34:51 -0500 Subject: [PATCH 106/150] save type --- protocol-designer/src/pages/Designer/DeckSetup/types.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/protocol-designer/src/pages/Designer/DeckSetup/types.ts b/protocol-designer/src/pages/Designer/DeckSetup/types.ts index 20631cff1bb..ef9750c302f 100644 --- a/protocol-designer/src/pages/Designer/DeckSetup/types.ts +++ b/protocol-designer/src/pages/Designer/DeckSetup/types.ts @@ -1,5 +1,6 @@ import type { Dispatch, SetStateAction } from 'react' import type { CoordinateTuple } from '@opentrons/shared-data' +import type { LabwareOnDeck } from '../../../step-forms' import type { DeckSetupTabType } from '../types' export interface SharedControlsType extends DeckSetupTabType { @@ -11,3 +12,7 @@ export interface SharedControlsType extends DeckSetupTabType { setShowMenuListForId: Dispatch> isSelected: boolean } + +export interface DroppedItem { + labwareOnDeck: LabwareOnDeck +} From 9ec832fed9aa57412922b394b1fa33d5986fbeee Mon Sep 17 00:00:00 2001 From: Jethary Date: Mon, 10 Feb 2025 09:57:45 -0500 Subject: [PATCH 107/150] fix cypress --- .../Deck/RobotCoordsForeignDiv.tsx | 4 ++ .../cypress/support/SetupSteps.ts | 45 ++++++++----------- .../Designer/DeckSetup/AdapterControls.tsx | 1 + .../Designer/DeckSetup/LabwareControls.tsx | 1 + .../pages/Designer/DeckSetup/SlotControls.tsx | 3 +- 5 files changed, 27 insertions(+), 27 deletions(-) diff --git a/components/src/hardware-sim/Deck/RobotCoordsForeignDiv.tsx b/components/src/hardware-sim/Deck/RobotCoordsForeignDiv.tsx index a831b282cff..53b22e3bf7f 100644 --- a/components/src/hardware-sim/Deck/RobotCoordsForeignDiv.tsx +++ b/components/src/hardware-sim/Deck/RobotCoordsForeignDiv.tsx @@ -12,6 +12,8 @@ export interface RobotCoordsForeignDivProps { innerDivProps?: ComponentProps transformWithSVG?: boolean extraTransform?: string + /** optional data-testid to test foreignObjects in cypress */ + dataTestId?: string } export const RobotCoordsForeignDiv = ( @@ -27,11 +29,13 @@ export const RobotCoordsForeignDiv = ( innerDivProps, transformWithSVG = false, extraTransform = '', + dataTestId = '', } = props const transform = `scale(1, -1) ${extraTransform}` return ( diff --git a/protocol-designer/cypress/support/SetupSteps.ts b/protocol-designer/cypress/support/SetupSteps.ts index 13dfa4bb998..cb0ee1952fc 100644 --- a/protocol-designer/cypress/support/SetupSteps.ts +++ b/protocol-designer/cypress/support/SetupSteps.ts @@ -109,7 +109,7 @@ export enum SetupContent { ModulePageH = 'Add your modules', ModulePageB = 'Select modules to use in your protocol.', EditProtocol = 'Edit protocol', - EditSlot = 'Edit slot', + EditLabware = 'Edit labware', AddLabwareToDeck = 'Add hardware/labware', EditHardwareLabwareOnDeck = 'Edit hardware/labware', LabwareH = 'Labware', @@ -126,6 +126,10 @@ export enum SetupContent { Save = 'Save', } +export const RegexSetupContent = { + slotText: /Edit (slot|labware)/i, +} + export enum SetupLocators { Confirm = 'button:contains("Confirm")', GoBack = 'button:contains("Go back")', @@ -149,7 +153,7 @@ export enum SetupLocators { TempdeckTempInput = 'input[name="targetTemperature"]', } -const chooseDeckSlot = ( +export const chooseDeckSlot = ( slot: string ): Cypress.Chainable> => { const deckSlots: Record< @@ -167,29 +171,18 @@ const chooseDeckSlot = ( | 'D3', () => Cypress.Chainable> > = { - A1: () => - cy.contains('foreignObject[x="0"][y="321"]', SetupContent.EditSlot), - A2: () => - cy.contains('foreignObject[x="164"][y="321"]', SetupContent.EditSlot), - A3: () => - cy.contains('foreignObject[x="328"][y="321"]', SetupContent.EditSlot), - B1: () => - cy.contains('foreignObject[x="0"][y="214"]', SetupContent.EditSlot), - B2: () => - cy.contains('foreignObject[x="164"][y="214"]', SetupContent.EditSlot), - B3: () => - cy.contains('foreignObject[x="328"][y="214"]', SetupContent.EditSlot), - C1: () => - cy.contains('foreignObject[x="0"][y="107"]', SetupContent.EditSlot), - C2: () => - cy.contains('foreignObject[x="164"][y="107"]', SetupContent.EditSlot), - C3: () => - cy.contains('foreignObject[x="328"][y="107"]', SetupContent.EditSlot), - D1: () => cy.contains('foreignObject[x="0"][y="0"]', SetupContent.EditSlot), - D2: () => - cy.contains('foreignObject[x="164"][y="0"]', SetupContent.EditSlot), - D3: () => - cy.contains('foreignObject[x="328"][y="0"]', SetupContent.EditSlot), + A1: () => cy.contains('[data-testid="A1"]', RegexSetupContent.slotText), + A2: () => cy.contains('[data-testid="A2"]', RegexSetupContent.slotText), + A3: () => cy.contains('[data-testid="A3"]', RegexSetupContent.slotText), + B1: () => cy.contains('[data-testid="B1"]', RegexSetupContent.slotText), + B2: () => cy.contains('[data-testid="B2"]', RegexSetupContent.slotText), + B3: () => cy.contains('[data-testid="B3"]', RegexSetupContent.slotText), + C1: () => cy.contains('[data-testid="C1"]', RegexSetupContent.slotText), + C2: () => cy.contains('[data-testid="C2"]', RegexSetupContent.slotText), + C3: () => cy.contains('[data-testid="C3"]', RegexSetupContent.slotText), + D1: () => cy.contains('[data-testid="D1"]', RegexSetupContent.slotText), + D2: () => cy.contains('[data-testid="D2"]', RegexSetupContent.slotText), + D3: () => cy.contains('[data-testid="D3"]', RegexSetupContent.slotText), } const slotAction = deckSlots[slot as keyof typeof deckSlots] @@ -335,7 +328,7 @@ export const executeSetupSteps = (action: SetupActions): void => { chooseDeckSlot('C2') .find('.Box-sc-8ozbhb-0.kIDovv') .find('a[role="button"]') - .contains(SetupContent.EditSlot) + .contains(SetupContent.EditLabware) .click({ force: true }) break case SetupActions.SelectArmadillo96WellPlate: // New case for selecting Armadillo plate diff --git a/protocol-designer/src/pages/Designer/DeckSetup/AdapterControls.tsx b/protocol-designer/src/pages/Designer/DeckSetup/AdapterControls.tsx index d84e77e5451..e2ad8b9f315 100644 --- a/protocol-designer/src/pages/Designer/DeckSetup/AdapterControls.tsx +++ b/protocol-designer/src/pages/Designer/DeckSetup/AdapterControls.tsx @@ -141,6 +141,7 @@ export const AdapterControls = ( /> ) : ( { /> ) : ( { {isOver ? t(`overlay.slot.place_here`) - : t('starting_deck_state:edit_labware')} + : t('starting_deck_state:edit_slot')} From 5da85c3fc691553bb59e09396636fa5710a34253 Mon Sep 17 00:00:00 2001 From: Sarah Breen Date: Mon, 10 Feb 2025 10:14:47 -0500 Subject: [PATCH 108/150] docs(app): add quick transfer doc to keep track of versioning (#17473) --- .../organisms/ODD/QuickTransferFlow/README.md | 58 +++++++++++++++++++ .../utils/createQuickTransferFile.ts | 1 + 2 files changed, 59 insertions(+) create mode 100644 app/src/organisms/ODD/QuickTransferFlow/README.md diff --git a/app/src/organisms/ODD/QuickTransferFlow/README.md b/app/src/organisms/ODD/QuickTransferFlow/README.md new file mode 100644 index 00000000000..ba2214b809d --- /dev/null +++ b/app/src/organisms/ODD/QuickTransferFlow/README.md @@ -0,0 +1,58 @@ +# Quick Transfer Versioning: + +Quick Transfer is versioned under the `designerApplicationData` field on the resulting protocol file. Since this data is not yet read or migrated this doc details the versions, type of `quickTransferState` per version, and other changes made so that migration can occur in the future if needed. + +## Version 1.0.0 + +``` +export interface QuickTransferSummaryState { + pipette: PipetteV2Specs + mount: Mount + tipRack: LabwareDefinition2 + source: LabwareDefinition2 + sourceWells: string[] + destination: LabwareDefinition2 | 'source' + destinationWells: string[] + transferType: TransferType + volume: number + aspirateFlowRate: number + dispenseFlowRate: number + path: PathOption + tipPositionAspirate: number + preWetTip: boolean + mixOnAspirate?: { + mixVolume: number + repititions: number + } + delayAspirate?: { + delayDuration: number + positionFromBottom: number + } + touchTipAspirate?: number + airGapAspirate?: number + tipPositionDispense: number + mixOnDispense?: { + mixVolume: number + repititions: number + } + delayDispense?: { + delayDuration: number + positionFromBottom: number + } + touchTipDispense?: number + disposalVolume?: number + blowOut?: BlowOutLocation + airGapDispense?: number + changeTip: ChangeTipOptions + dropTipLocation: CutoutConfig +} +``` + +## Version 1.1.0 + +Type is the same as in `1.0.0`, but the number represented by `touchTipAspirate` and `touchTipDispense` is now the distance from the top of the well instead of distance from the bottom of the well. This can be migrated using the well height from the definition on both source and dest labware. + +``` +touchTipAspirate = -(sourceWellHeight - prevTouchTipAspirate) +touchTipDispense = -(destWellHeight - prevTouchTipDispense) +``` diff --git a/app/src/organisms/ODD/QuickTransferFlow/utils/createQuickTransferFile.ts b/app/src/organisms/ODD/QuickTransferFlow/utils/createQuickTransferFile.ts index 614acb18753..24a46609043 100644 --- a/app/src/organisms/ODD/QuickTransferFlow/utils/createQuickTransferFile.ts +++ b/app/src/organisms/ODD/QuickTransferFlow/utils/createQuickTransferFile.ts @@ -202,6 +202,7 @@ export function createQuickTransferFile( subcategory: null, tags: [], }, + // see QuickTransferFlow/README.md for versioning details designerApplication: { name: 'opentrons/quick-transfer', version: '1.1.0', From 369a096ac16134e9dc8f49ef8e5f60c07b6898c7 Mon Sep 17 00:00:00 2001 From: Jethary Date: Mon, 10 Feb 2025 12:01:32 -0500 Subject: [PATCH 109/150] fix bug with swapping labware on an adapter --- .../cypress/support/SetupSteps.ts | 2 +- .../Designer/DeckSetup/AdapterControls.tsx | 15 +++--- .../Designer/DeckSetup/DeckSetupDetails.tsx | 25 +++++++--- .../src/pages/Designer/DeckSetup/utils.ts | 50 ++++++++++++++++--- 4 files changed, 71 insertions(+), 21 deletions(-) diff --git a/protocol-designer/cypress/support/SetupSteps.ts b/protocol-designer/cypress/support/SetupSteps.ts index cb0ee1952fc..5753f6d9df9 100644 --- a/protocol-designer/cypress/support/SetupSteps.ts +++ b/protocol-designer/cypress/support/SetupSteps.ts @@ -153,7 +153,7 @@ export enum SetupLocators { TempdeckTempInput = 'input[name="targetTemperature"]', } -export const chooseDeckSlot = ( +const chooseDeckSlot = ( slot: string ): Cypress.Chainable> => { const deckSlots: Record< diff --git a/protocol-designer/src/pages/Designer/DeckSetup/AdapterControls.tsx b/protocol-designer/src/pages/Designer/DeckSetup/AdapterControls.tsx index e2ad8b9f315..e9f2ec2d655 100644 --- a/protocol-designer/src/pages/Designer/DeckSetup/AdapterControls.tsx +++ b/protocol-designer/src/pages/Designer/DeckSetup/AdapterControls.tsx @@ -27,6 +27,7 @@ interface AdapterControlsProps extends SharedControlsType { // the adapter's labwareId labwareId: string onDeck: boolean + swapBlocked: boolean handleDragHover?: () => void } @@ -45,6 +46,7 @@ export const AdapterControls = ( itemId, isSelected, tab, + swapBlocked, } = props const { t } = useTranslation(['deck', 'starting_deck_state']) const customLabwareDefs = useSelector( @@ -80,9 +82,9 @@ export const AdapterControls = ( const adapterLabwareIsMatch = draggedDef.stackingOffsetWithLabware?.[adapterLoadName] != null - return adapterLabwareIsMatch || isCustomLabware + return (adapterLabwareIsMatch || isCustomLabware) && !swapBlocked } - return true + return !swapBlocked }, drop: (item: DroppedItem) => { const droppedLabware = item @@ -120,10 +122,11 @@ export const AdapterControls = ( : false const isSlotBlocked = - isOver && - draggedDef != null && - draggedDef.stackingOffsetWithLabware?.[adapterLoadName] == null && - !isCustomLabware + swapBlocked || + (isOver && + draggedDef != null && + draggedDef.stackingOffsetWithLabware?.[adapterLoadName] == null && + !isCustomLabware) drop(ref) diff --git a/protocol-designer/src/pages/Designer/DeckSetup/DeckSetupDetails.tsx b/protocol-designer/src/pages/Designer/DeckSetup/DeckSetupDetails.tsx index f32b7d6d7bf..96329b055f9 100644 --- a/protocol-designer/src/pages/Designer/DeckSetup/DeckSetupDetails.tsx +++ b/protocol-designer/src/pages/Designer/DeckSetup/DeckSetupDetails.tsx @@ -30,7 +30,11 @@ import { HighlightLabware } from '../HighlightLabware' import { SlotOverflowMenu } from './SlotOverflowMenu' import { HoveredItems } from './HoveredItems' import { SelectedHoveredItems } from './SelectedHoveredItems' -import { getAdjacentLabware, getSwapBlocked } from './utils' +import { + getAdjacentLabware, + getSwapBlockedAdapter, + getSwapBlockedModule, +} from './utils' import { SlotWarning } from './SlotWarning' import { HighlightItems } from './HighlightItems' import { SlotControls } from './SlotControls' @@ -113,11 +117,16 @@ export function DeckSetupDetails(props: DeckSetupDetailsProps): JSX.Element { LabwareOnDeckType | null | undefined >(null) const customLabwareDefs = useSelector(getCustomLabwareDefsByURI) - const swapBlocked = getSwapBlocked({ - hoveredLabware, - draggedLabware, + const swapBlockedModule = getSwapBlockedModule({ modulesById: activeDeckSetup.modules, customLabwareDefs, + hoveredLabware, + draggedLabware, + }) + const swapBlockedAdapter = getSwapBlockedAdapter({ + labwareById: activeDeckSetup.labware, + hoveredLabware, + draggedLabware, }) const handleHoverEmptySlot = useCallback(() => { @@ -279,6 +288,7 @@ export function DeckSetupDetails(props: DeckSetupDetailsProps): JSX.Element { {isAdapter ? ( { +export const getSwapBlockedModule = (args: SwapBlockedModuleArgs): boolean => { const { hoveredLabware, draggedLabware, @@ -375,7 +375,7 @@ export const getSwapBlocked = (args: SwapBlockedArgs): boolean => { hoveredLabware ) - // dragging custom labware to module gives not compat error + // dragging custom labware to module gives no compat error const labwareSourceToDestBlocked = sourceModuleType ? !getLabwareIsCompatible(hoveredLabware.def, sourceModuleType) && !hoveredLabwareIsCustom @@ -387,3 +387,39 @@ export const getSwapBlocked = (args: SwapBlockedArgs): boolean => { return labwareSourceToDestBlocked || labwareDestToSourceBlocked } + +export interface SwapBlockedAdapterArgs { + labwareById: InitialDeckSetup['labware'] + hoveredLabware?: LabwareOnDeck | null + draggedLabware?: LabwareOnDeck | null +} + +export const getSwapBlockedAdapter = ( + args: SwapBlockedAdapterArgs +): boolean => { + const { hoveredLabware, draggedLabware, labwareById } = args + + if (!hoveredLabware || !draggedLabware) { + return false + } + + const adapterSourceToDestLoadname: string | null = + labwareById[draggedLabware.slot]?.def.parameters.loadName ?? null + const adapterDestToSourceLoadname: string | null = + labwareById[hoveredLabware.slot]?.def.parameters.loadName ?? null + + const labwareSourceToDestBlocked = + adapterSourceToDestLoadname != null + ? hoveredLabware.def.stackingOffsetWithLabware?.[ + adapterSourceToDestLoadname + ] == null + : false + const labwareDestToSourceBlocked = + adapterDestToSourceLoadname != null + ? draggedLabware.def.stackingOffsetWithLabware?.[ + adapterDestToSourceLoadname + ] == null + : false + + return labwareSourceToDestBlocked || labwareDestToSourceBlocked +} From a8c1f168604936c31a97873e39c6f4c0df924f43 Mon Sep 17 00:00:00 2001 From: Max Marrone Date: Mon, 10 Feb 2025 12:50:54 -0500 Subject: [PATCH 110/150] fix(shared-data): Restore "lid" display category missing from labware schema 3 (#17480) --- shared-data/js/__tests__/labwareDefSchemaV3.test.ts | 8 +++----- shared-data/labware/schemas/3.json | 3 ++- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/shared-data/js/__tests__/labwareDefSchemaV3.test.ts b/shared-data/js/__tests__/labwareDefSchemaV3.test.ts index e115dccc570..340ebd96190 100644 --- a/shared-data/js/__tests__/labwareDefSchemaV3.test.ts +++ b/shared-data/js/__tests__/labwareDefSchemaV3.test.ts @@ -77,11 +77,9 @@ describe(`test labware definitions with schema v3`, () => { // FIXME(mm, 2025-02-04): These new definitions have a displayCategory that // the schema does not recognize. Either they need to change or the schema does. - const expectFailure = [ - 'opentrons_flex_tiprack_lid', - 'opentrons_tough_pcr_auto_sealing_lid', - 'protocol_engine_lid_stack_object', - ].includes(labwareDef.parameters.loadName) + const expectFailure = ['protocol_engine_lid_stack_object'].includes( + labwareDef.parameters.loadName + ) if (expectFailure) expect(validationErrors).not.toBe(null) else expect(validationErrors).toBe(null) diff --git a/shared-data/labware/schemas/3.json b/shared-data/labware/schemas/3.json index 5e02c45a981..45216e06577 100644 --- a/shared-data/labware/schemas/3.json +++ b/shared-data/labware/schemas/3.json @@ -41,7 +41,8 @@ "wellPlate", "aluminumBlock", "adapter", - "other" + "other", + "lid" ] }, "safeString": { From 455774ed5286f497f902e254e49471ca2802d74f Mon Sep 17 00:00:00 2001 From: David Chau <46395074+ddcc4@users.noreply.github.com> Date: Mon, 10 Feb 2025 14:13:13 -0500 Subject: [PATCH 111/150] feat(protocol-designer): add declaration for `def run()` to generated Python (#17482) # Overview This adds the `def run(...)` declaration to the generated Python file. AUTH-1092 We'll start filling in the `run()` function in future PRs. ## Test Plan and Hands on Testing Updated unit tests. Looked at generated file with feature flag turned on. ## Risk assessment Low. This just affects the exported Python file hidden under a feature flag. --- .../file-data/__tests__/createFile.test.ts | 3 +++ .../src/file-data/selectors/fileCreator.ts | 8 +++++- .../src/file-data/selectors/pythonFile.ts | 25 ++++++++++++++++++- step-generation/src/utils/pythonFormat.ts | 6 +++++ 4 files changed, 40 insertions(+), 2 deletions(-) diff --git a/protocol-designer/src/file-data/__tests__/createFile.test.ts b/protocol-designer/src/file-data/__tests__/createFile.test.ts index 613f0e52f6a..527e1cccf20 100644 --- a/protocol-designer/src/file-data/__tests__/createFile.test.ts +++ b/protocol-designer/src/file-data/__tests__/createFile.test.ts @@ -119,6 +119,9 @@ requirements = { "robotType": "OT-2", "apiLevel": "2.23", } + +def run(protocol: protocol_api.ProtocolContext): + pass `.trimStart() ) }) diff --git a/protocol-designer/src/file-data/selectors/fileCreator.ts b/protocol-designer/src/file-data/selectors/fileCreator.ts index 9850b802dc7..a12547a3b70 100644 --- a/protocol-designer/src/file-data/selectors/fileCreator.ts +++ b/protocol-designer/src/file-data/selectors/fileCreator.ts @@ -26,7 +26,12 @@ import { getModulesLoadInfo, getPipettesLoadInfo, } from './utils' -import { pythonImports, pythonMetadata, pythonRequirements } from './pythonFile' +import { + pythonDefRun, + pythonImports, + pythonMetadata, + pythonRequirements, +} from './pythonFile' import type { SecondOrderCommandAnnotation } from '@opentrons/shared-data/commandAnnotation/types' import type { @@ -310,6 +315,7 @@ export const createPythonFile: Selector = createSelector( pythonImports(), pythonMetadata(fileMetadata), pythonRequirements(robotType), + pythonDefRun(), ] .filter(section => section) // skip any blank sections .join('\n\n') + '\n' diff --git a/protocol-designer/src/file-data/selectors/pythonFile.ts b/protocol-designer/src/file-data/selectors/pythonFile.ts index dbf5e9c3bf9..e4d9e63eec0 100644 --- a/protocol-designer/src/file-data/selectors/pythonFile.ts +++ b/protocol-designer/src/file-data/selectors/pythonFile.ts @@ -1,7 +1,11 @@ /** Generate sections of the Python file for fileCreator.ts */ import { FLEX_ROBOT_TYPE, OT2_ROBOT_TYPE } from '@opentrons/shared-data' -import { formatPyDict } from '@opentrons/step-generation' +import { + formatPyDict, + indentPyLines, + PROTOCOL_CONTEXT_NAME, +} from '@opentrons/step-generation' import type { FileMetadataFields } from '../types' import type { RobotType } from '@opentrons/shared-data' @@ -46,3 +50,22 @@ export function pythonRequirements(robotType: RobotType): string { } return `requirements = ${formatPyDict(requirements)}` } + +export function pythonDefRun(): string { + const sections: string[] = [ + // loadModules(), + // loadLabware(), + // loadInstruments(), + // defineLiquids(), + // loadLiquids(), + // stepCommands(), + ] + const functionBody = + sections + .filter(section => section) // skip empty sections + .join('\n\n') || 'pass' + return ( + `def run(${PROTOCOL_CONTEXT_NAME}: protocol_api.ProtocolContext):\n` + + `${indentPyLines(functionBody)}` + ) +} diff --git a/step-generation/src/utils/pythonFormat.ts b/step-generation/src/utils/pythonFormat.ts index 6efc6557542..76dcb1809fc 100644 --- a/step-generation/src/utils/pythonFormat.ts +++ b/step-generation/src/utils/pythonFormat.ts @@ -1,5 +1,11 @@ /** Utility functions for Python code generation. */ +/** The variable name for the ProtocolContext object in the run() function. + * Our docs call it `protocol`, which is slightly misleading since the object is not + * the protocol itself, but we'll try to stay consistent with the docs. + */ +export const PROTOCOL_CONTEXT_NAME = 'protocol' + const INDENT = ' ' /** Indent each of the lines in `text`. */ From 48ac4e616fd29f3f3c428c003bfc724b097042bb Mon Sep 17 00:00:00 2001 From: Seth Foster Date: Mon, 10 Feb 2025 17:06:32 -0500 Subject: [PATCH 112/150] feat(api): return location sequences from commands (#17435) By adding all the locations of a labware used in a command that establishes or changes the position of a labware, we can free the client from having to accumulate all previous such commands to display a single such command. These locations are shown as location sequences. These are lists of heterogenous unions keyed by `kind`. The kinds mostly correspond to the kinds of locations that the engine already uses - they're different types because they have the `kind` key so you can tell them apart when serialized instead of just via python isinstance checks. All these sequences end in either an `OnCutoutFixtureLocation` which lists a cutout id and possible cutout fixtures; or a `NotOnDeckLocation` that specifies `OFF_DECK` or system. Different robots have different kinds of sequences; on the OT-2, modules are loaded on deck slots, and so a labware on a module would have `[OnModule, OnAddressableArea, OnCutoutFixture]` while on the Flex, modules are loaded on cutout fixtures and a labware on a module would have `[OnAdressableArea, OnModule, OnCutoutFixture]` (having the `OnModule` there lets us have the module ID; it is not technically necessary). There are some command implementations that are straightforward, and some that are charmingly quirky. - `loadLabware`, `reloadLabware`, `loadLid` all just return the location of the newly added labware. Simple, clean, wondrous - `loadLidStack` creates a lid stack object and returns its location, and also creates N lid objects and returns all of _their_ locations, which is done in its own array that is guaranteed to have the same ordering as all the lid ids so we can keep the types of the locations consistent across commands and also avoid altering already-existing result elements - `moveLabware` needs an origin and a destination location, so it has them. In fact, one destination location isn't enough. When we move labware to a trash location, we need to encode both (1) which trash location it was and (2) that it is a trash location. After the command, the position of the labware is `OFF_DECK` (because it went into the trash), after all. So we get both `immediateDestinationLocationSequence` (which in this scenario would be the addressable area of the trash) and `eventualDestinationLocationSequence` (which in this scenario would be off deck). If the two are the same, then the two are the same - the stacker `store` and `retrieve` commands have info that isn't really actually useful right now, but it will be soon, so let's carve out some space for them. For now the labware just bounces back and forth between the module/off deck and the module/stacker staging slot. ## to come out of draft - [x] ts bindings - [x] stacker store and retrieve - ~[ ] add "what is the old and new state of the locations named in the command" to these values~ not going to do that ^ in this pr just so we can get it merged --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: sfoster1 <3091648+sfoster1@users.noreply.github.com> --- ...[pl_BacteriaInoculation_Flex_6plates].json | 1718 ++- ...][pl_Flex_Protein_Digestion_Protocol].json | 217 +- ...B_TC_TM_DeckConfiguration1NoFixtures].json | 503 +- ...300M_P20S_aspirateDispenseMix0Volume].json | 45 +- ...P300M_P20S_HS_TC_TM_dispense_changes].json | 60 +- ...2_19_P300M_P20S_HS_TC_TM_SmokeTestV3].json | 133 +- ...03a95825][Flex_S_v2_19_QIASeq_FX_48x].json | 985 +- ...s_TooTallLabware_Override_south_west].json | 30 +- ...][Flex_S_v2_18_Illumina_DNA_Prep_48x].json | 795 +- ...es_TooTallLabware_Override_north_row].json | 30 +- ...2_15_P300M_P20S_HS_TC_TM_SmokeTestV3].json | 409 +- ...2_18_P300M_P20S_HS_TC_TM_SmokeTestV3].json | 133 +- ..._EM_seq_48Samples_AllSteps_Edits_150].json | 1322 ++- ...][Flex_S_v2_20_96_None_ROW_HappyPath].json | 47 +- ...c2386b92][Flex_S_v2_20_96_AllCorners].json | 647 +- ...11020a4e17][pl_Bradford_proteinassay].json | 298 +- ..._X_v6_P300M_P20S_HS_MM_TM_TC_AllMods].json | 106 +- ...a9c68b][Flex_S_v2_20_P8X1000_P50_LLD].json | 83 +- ...llumina_Stranded_total_RNA_Ribo_Zero].json | 53 +- ...0fccf4][pl_microBioID_beads_touchtip].json | 820 +- ...94e3c49bb][pl_Normalization_with_PCR].json | 85 +- ...errides_TooTallLabware_Override_west].json | 30 +- ..._GRIP_TC_TM_GripperCollisionWithTips].json | 394 +- ...l_Dynabeads_IP_Flex_96well_RIT_final].json | 687 +- ...c080][pl_MagMax_RNA_Cells_Flex_multi].json | 976 +- ...f51][Flex_S_v2_18_KAPA_Library_Quant].json | 168 +- ..._Omega_HDQ_DNA_Cells_Flex_96_channel].json | 707 +- ...pshot[250e9496be][pl_BCApeptideassay].json | 410 +- ...ooTallLabware_Override_mix_collision].json | 45 +- ...7961bc58][pl_NiNTA_Flex_96well_final].json | 756 +- ...9][pl_Omega_HDQ_DNA_Cells_Flex_multi].json | 637 +- ...pl_Omega_HDQ_DNA_Bacteria_Flex_multi].json | 667 +- ...ide_distribute_destination_collision].json | 66 +- ...e_Override_transfer_source_collision].json | 64 +- ...Flex_S_v2_18_P1000_96_TipTrackingBug].json | 30 +- ...2_21_P1000_96_GRIP_HS_MB_TC_TM_Smoke].json | 1124 +- ...2bc6830494][pl_langone_ribo_pt1_ramp].json | 50 +- ..._TooTallLabware_Override_east_column].json | 30 +- ...TC_TM_TriggerPrepareForMountMovement].json | 9999 ++++++++++++++++- ..._S_v2_20_96_None_SINGLE_4Corners50ul].json | 15 +- ...20_96_None_SINGLE_HappyPathNorthSide].json | 77 +- ...[pl_Takara_InFusionSnapAssembly_Flex].json | 83 +- ...ex_X_v2_21_plate_reader_wrong_plate2].json | 30 +- ...allLabware_Override_bottom_left_edge].json | 15 +- ...allLabware_Override_bottom_left_edge].json | 15 +- ...es_TooTallLabware_Override_south_row].json | 30 +- ...f][pl_Dynabeads_IP_Flex_96well_final].json | 687 +- ...fd9][Flex_S_v2_19_KAPA_Library_Quant].json | 168 +- ...2_18_P1000_96_GRIP_HS_MB_TC_TM_Smoke].json | 3752 ++++++- ...shot[4148613317][Flex_S_v2_19_ligseq].json | 754 +- ...apshot[42beea80be][pl_96_ch_demo_rtp].json | 769 +- ...8][OT2_X_v6_P20S_None_SimpleTransfer].json | 60 +- ...ple_dilution_with_96_channel_pipette].json | 106 +- ...2_16_P300M_P20S_HS_TC_TM_SmokeTestV3].json | 409 +- ...P300M_P20S_HS_TC_TM_dispense_changes].json | 60 +- ...ARTIAL_COLUMN_HappyPathMixedTipRacks].json | 75 +- ...Override_eight_partial_column_no_end].json | 15 +- ...50c02c81][Flex_S_v2_19_AMPure_XP_48x].json | 425 +- ...][pl_Zymo_Quick_RNA_Cells_Flex_multi].json | 1116 +- ...v6_P300M_P20S_MixTransferManyLiquids].json | 120 +- ...ide_eight_partial_column_bottom_left].json | 15 +- ...ooTallLabware_Override_c3_right_edge].json | 17 +- ...Override_eight_partial_column_no_end].json | 30 +- ...erifyNoFloatingPointErrorInPipetting].json | 30 +- ...][Flex_S_v2_19_Illumina_DNA_Prep_48x].json | 795 +- ...shot[59b00713a7][Flex_S_v2_18_ligseq].json | 754 +- ...ega_HDQ_DNA_Bacteria_Flex_96_channel].json | 878 +- ...0MGen2_None_OT2PipetteInFlexProtocol].json | 15 +- ...Override_ninety_six_partial_column_2].json | 15 +- ..._PIPETTES_TM_ModuleInStagingAreaCol3].json | 16 +- ...Override_ninety_six_partial_column_1].json | 15 +- ..._customizable_serial_dilution_upload].json | 64 +- ...b47][pl_M_N_Nucleomag_DNA_Flex_multi].json | 652 +- ...s_TooTallLabware_Override_south_east].json | 34 +- ...errides_TooTallLabware_Override_east].json | 32 +- ...lex_S_v2_20_96_None_COLUMN_HappyPath].json | 47 +- ...de_consolidate_destination_collision].json | 66 +- ...96_GRIP_HS_MB_TM_MagMaxRNAExtraction].json | 2752 ++++- ..._HS_TM_MB_TC_IlluminaDNAEnrichmentV4].json | 865 +- ..._HS_TC_TM_aspirateDispenseMix0Volume].json | 45 +- ...[pl_SamplePrep_MS_Digest_Flex_upto96].json | 130 +- ...ex_X_v2_21_plate_reader_no_close_lid].json | 30 +- ...2_20_8_None_PARTIAL_COLUMN_HappyPath].json | 47 +- ...lidConfigs_Override_return_tip_error].json | 60 +- ...ebdcd29][pl_KAPA_Library_Quant_48_v8].json | 168 +- ...e61426a2][Flex_S_v2_18_AMPure_XP_48x].json | 425 +- ...0][Flex_X_v2_21_tc_lids_wrong_target].json | 236 +- ..._TooTallLabware_Override_west_column].json | 32 +- ..._QIAseq_FX_24x_Normalizer_Workflow_B].json | 1107 +- ...84cbc4][Flex_S_v2_18_IDT_xGen_EZ_48x].json | 603 +- ...2_14_P300M_P20S_HS_TC_TM_SmokeTestV3].json | 132 +- ...Zymo_Quick_RNA_Cells_Flex_96_Channel].json | 1257 ++- ...][OT2_X_v6_P20S_P300M_HS_HSCollision].json | 64 +- ...tialTipPickupThermocyclerLidConflict].json | 62 +- ...rrides_TooTallLabware_Override_south].json | 30 +- ...figs_Override_drop_tip_with_location].json | 49 +- ...pl_NiNTA_Flex_96well_PlatePrep_final].json | 162 +- ...6_P1000_96_TC_PartialTipPickupColumn].json | 47 +- ...747b2f9][pl_Illumina_DNA_Prep_48x_v8].json | 795 +- ...de_eight_partial_column_bottom_right].json | 30 +- ..._TM_MB_OmegaHDQDNAExtractionBacteria].json | 878 +- ...c62][Flex_S_v2_21_tc_lids_happy_path].json | 458 +- ...bcb0a3f13][pl_normalization_with_csv].json | 90 +- ...1000_96_GRIP_DropLabwareIntoTrashBin].json | 34 +- ...O_PIPETTES_TrashBinInStagingAreaCol3].json | 16 +- ...eckConfiguration1NoModulesNoFixtures].json | 330 +- ...s_TooTallLabware_Override_north_west].json | 30 +- ...pl_SamplePrep_MS_Cleanup_Flex_upto96].json | 554 +- ...][Flex_S_v2_19_Illumina_DNA_PCR_Free].json | 1094 +- ...37534569][Flex_S_v2_19_kapahyperplus].json | 994 +- ...l_Nanopore_Genomic_Ligation_v5_Final].json | 754 +- ...4d3b3a2d3][pl_96_ch_demo_rtp_with_hs].json | 1357 ++- ...][Flex_X_v2_21_plate_reader_no_trash].json | 76 +- ...20_96_None_SINGLE_HappyPathSouthSide].json | 77 +- ...a8a5ad823d][pl_cherrypicking_flex_v3].json | 173 +- ...4f22054f][Flex_S_v2_18_kapahyperplus].json | 994 +- ..._snapshot[aa61eee0bf][pl_sigdx_part2].json | 1395 ++- ...shot[ac5a46e74b][pl_langone_pt2_ribo].json | 576 +- ...6_GRIP_HS_MB_TC_TM_IDTXgen96Part1to3].json | 363 +- ...ide_eight_partial_column_bottom_left].json | 30 +- ...2_S_v6_P300M_P20S_HS_Smoke620release].json | 94 +- ..._pipetteCollisionWithThermocyclerLid].json | 102 +- ...lidConfigs_Override_return_tip_error].json | 49 +- ...96_TC_PartialTipPickupTryToReturnTip].json | 47 +- ...407ff98][pl_cherrypicking_csv_airgap].json | 109 +- ...llumina_Stranded_total_RNA_Ribo_Zero].json | 53 +- ...figs_Override_drop_tip_with_location].json | 60 +- ...[pl_MagMax_RNA_Cells_Flex_96_Channel].json | 1107 +- ...][Flex_X_v2_21_plate_reader_bad_slot].json | 34 +- ...P1000S_None_SimpleNormalizeLongRight].json | 158 +- ...rride_transfer_destination_collision].json | 66 +- ...rrides_TooTallLabware_Override_north].json | 30 +- ...[OT2_S_v6_P1000S_None_SimpleTransfer].json | 60 +- ...llLabware_Override_bottom_right_edge].json | 19 +- ..._96_GRIP_DeckConfiguration1NoModules].json | 561 +- ...d2ca0089][Flex_S_v2_18_QIASeq_FX_48x].json | 985 +- ..._P20S_P300M_TransferReTransferLiquid].json | 75 +- ...Flex_S_v2_20_8_None_SINGLE_HappyPath].json | 47 +- ...[cecd51c8ee][pl_ExpressPlex_96_final].json | 222 +- ...de_eight_partial_column_bottom_right].json | 15 +- ...pl_Zymo_Magbead_DNA_Cells_Flex_multi].json | 760 +- ...shot[d29d74d7fb][pl_QIASeq_FX_48x_v8].json | 1077 +- ...hot[d2c818bf00][Flex_S_v2_20_P50_LPD].json | 83 +- ...oMagbeadRNAExtractionCellsOrBacteria].json | 938 +- ...mo_Magbead_DNA_Cells_Flex_96_channel].json | 938 +- ...2_17_P300M_P20S_HS_TC_TM_SmokeTestV3].json | 409 +- ...39e6a3][Flex_S_v2_19_IDT_xGen_EZ_48x].json | 603 +- ...shot[d6389183c0][pl_AMPure_XP_48x_v8].json | 425 +- ...6_P1000_96_TC_PartialTipPickupSingle].json | 47 +- ...[OT2_S_v2_20_8_None_SINGLE_HappyPath].json | 60 +- ...1][pl_Hyperplus_tiptracking_V4_final].json | 994 +- ...2_19_P1000_96_GRIP_HS_MB_TC_TM_Smoke].json | 3752 ++++++- ...Override_ninety_six_partial_column_3].json | 15 +- ...tranded_total_RNA_Ribo_Zero_protocol].json | 750 +- ...RIP_HS_TM_MB_TC_KAPALibraryQuantv4_8].json | 204 +- ...][Flex_S_v2_18_Illumina_DNA_PCR_Free].json | 1094 +- ...e71b031f47][pl_Illumina_DNA_PCR_Free].json | 1094 +- ...des_TooTallLabware_Override_top_edge].json | 15 +- ...Flex_S_v2_20_96_None_Column3_SINGLE_].json | 336 +- ...verride_consolidate_source_collision].json | 64 +- ...P_HS_TM_MB_TC_IlluminaDNAPrep24xV4_7].json | 918 +- ...X_v2_16_P1000_96_DropTipsWithNoTrash].json | 58 +- ...P_HS_MB_TC_TM_IlluminaDNAPrep96PART3].json | 397 +- ...0M_P300S_HS_HS_NormalUseWithTransfer].json | 79 +- ...2_16_P1000_96_GRIP_HS_MB_TC_TM_Smoke].json | 9997 +++++++++++++++- ...00_96_TM_ModuleAndWasteChuteConflict].json | 34 +- ...ddbb32][pl_ExpressPlex_Pooling_Final].json | 196 +- ...tteCollisionWithThermocyclerLidClips].json | 15 +- ..._GRIP_HS_MB_TC_TM_DeckConfiguration1].json | 734 +- ...Override_distribute_source_collision].json | 64 +- ...P300M_P20S_HS_TC_TM_dispense_changes].json | 60 +- ...lex_X_v2_21_plate_reader_wrong_plate].json | 30 +- .../tests/custom_json_snapshot_extension.py | 10 +- .../commands/flex_stacker/retrieve.py | 49 +- .../commands/flex_stacker/store.py | 48 +- .../commands/labware_handling_common.py | 24 + .../protocol_engine/commands/load_labware.py | 24 +- .../protocol_engine/commands/load_lid.py | 21 +- .../commands/load_lid_stack.py | 123 +- .../protocol_engine/commands/move_labware.py | 114 +- .../commands/reload_labware.py | 25 +- .../state/addressable_areas.py | 33 + .../protocol_engine/state/geometry.py | 166 + .../protocol_engine/state/labware.py | 6 +- .../protocol_engine/state/modules.py | 46 +- .../protocol_engine/types/__init__.py | 18 + .../protocol_engine/types/location.py | 27 +- .../protocol_runner/legacy_command_mapper.py | 2 + .../commands/flex_stacker/test_retrieve.py | 33 +- .../commands/flex_stacker/test_store.py | 27 +- .../commands/test_load_labware.py | 53 + .../protocol_engine/commands/test_load_lid.py | 118 + .../commands/test_load_lid_stack.py | 165 + .../commands/test_move_labware.py | 126 +- .../commands/test_reload_labware.py | 10 + .../opentrons/protocol_engine/conftest.py | 9 + .../protocol_engine/state/command_fixtures.py | 34 - .../state/test_geometry_view.py | 374 +- .../test_legacy_command_mapper.py | 1 + .../protocols/test_v6_json_upload.tavern.yaml | 25 + .../test_v8_json_upload_flex.tavern.yaml | 58 +- .../test_v8_json_upload_ot2.tavern.yaml | 51 +- shared-data/command/types/setup.ts | 45 + 203 files changed, 86188 insertions(+), 2826 deletions(-) create mode 100644 api/src/opentrons/protocol_engine/commands/labware_handling_common.py create mode 100644 api/tests/opentrons/protocol_engine/commands/test_load_lid.py create mode 100644 api/tests/opentrons/protocol_engine/commands/test_load_lid_stack.py diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[00574c503f][pl_BacteriaInoculation_Flex_6plates].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[00574c503f][pl_BacteriaInoculation_Flex_6plates].json index 0cf14e731b6..62344320dab 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[00574c503f][pl_BacteriaInoculation_Flex_6plates].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[00574c503f][pl_BacteriaInoculation_Flex_6plates].json @@ -228,7 +228,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1969,7 +1982,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3253,7 +3281,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4430,7 +4471,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -29291,7 +29345,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -29320,7 +29389,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -29348,7 +29459,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -30496,7 +30651,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -31165,7 +31333,33 @@ "newLocation": "offDeck", "strategy": "manualMoveWithoutPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -31193,7 +31387,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -31221,7 +31457,55 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "flexStackerModuleV1WithWasteChuteRightAdapterCovered", + "flexStackerModuleV1WithWasteChuteRightAdapterNoCover", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "flexStackerModuleV1WithWasteChuteRightAdapterCovered", + "flexStackerModuleV1WithWasteChuteRightAdapterNoCover", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -31237,7 +31521,37 @@ "newLocation": "offDeck", "strategy": "manualMoveWithoutPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "flexStackerModuleV1WithWasteChuteRightAdapterCovered", + "flexStackerModuleV1WithWasteChuteRightAdapterNoCover", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -31326,7 +31640,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -31355,7 +31684,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -31383,7 +31754,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -32531,7 +32946,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -33200,7 +33628,33 @@ "newLocation": "offDeck", "strategy": "manualMoveWithoutPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -33228,7 +33682,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -33256,7 +33752,55 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "flexStackerModuleV1WithWasteChuteRightAdapterCovered", + "flexStackerModuleV1WithWasteChuteRightAdapterNoCover", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "flexStackerModuleV1WithWasteChuteRightAdapterCovered", + "flexStackerModuleV1WithWasteChuteRightAdapterNoCover", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -33272,7 +33816,37 @@ "newLocation": "offDeck", "strategy": "manualMoveWithoutPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "flexStackerModuleV1WithWasteChuteRightAdapterCovered", + "flexStackerModuleV1WithWasteChuteRightAdapterNoCover", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -33361,7 +33935,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -33390,7 +33979,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -33418,7 +34049,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -34566,7 +35241,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -35235,7 +35923,33 @@ "newLocation": "offDeck", "strategy": "manualMoveWithoutPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -35263,7 +35977,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -35291,7 +36047,55 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "flexStackerModuleV1WithWasteChuteRightAdapterCovered", + "flexStackerModuleV1WithWasteChuteRightAdapterNoCover", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "flexStackerModuleV1WithWasteChuteRightAdapterCovered", + "flexStackerModuleV1WithWasteChuteRightAdapterNoCover", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -35307,7 +36111,37 @@ "newLocation": "offDeck", "strategy": "manualMoveWithoutPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "flexStackerModuleV1WithWasteChuteRightAdapterCovered", + "flexStackerModuleV1WithWasteChuteRightAdapterNoCover", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -35396,7 +36230,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -35425,7 +36274,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -35453,7 +36344,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -36601,7 +37536,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -37270,7 +38218,33 @@ "newLocation": "offDeck", "strategy": "manualMoveWithoutPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -37298,7 +38272,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -37326,7 +38342,55 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "flexStackerModuleV1WithWasteChuteRightAdapterCovered", + "flexStackerModuleV1WithWasteChuteRightAdapterNoCover", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "flexStackerModuleV1WithWasteChuteRightAdapterCovered", + "flexStackerModuleV1WithWasteChuteRightAdapterNoCover", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -37342,7 +38406,37 @@ "newLocation": "offDeck", "strategy": "manualMoveWithoutPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "flexStackerModuleV1WithWasteChuteRightAdapterCovered", + "flexStackerModuleV1WithWasteChuteRightAdapterNoCover", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -37431,7 +38525,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -37460,7 +38569,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -37488,7 +38639,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -38636,7 +39831,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -39305,7 +40513,33 @@ "newLocation": "offDeck", "strategy": "manualMoveWithoutPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -39333,7 +40567,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -39361,7 +40637,55 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "flexStackerModuleV1WithWasteChuteRightAdapterCovered", + "flexStackerModuleV1WithWasteChuteRightAdapterNoCover", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "flexStackerModuleV1WithWasteChuteRightAdapterCovered", + "flexStackerModuleV1WithWasteChuteRightAdapterNoCover", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -39377,7 +40701,37 @@ "newLocation": "offDeck", "strategy": "manualMoveWithoutPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "flexStackerModuleV1WithWasteChuteRightAdapterCovered", + "flexStackerModuleV1WithWasteChuteRightAdapterNoCover", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -39466,7 +40820,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -39495,7 +40864,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -39523,7 +40934,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -40671,7 +42126,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -41340,7 +42808,33 @@ "newLocation": "offDeck", "strategy": "manualMoveWithoutPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -41368,7 +42862,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -41396,7 +42932,55 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "flexStackerModuleV1WithWasteChuteRightAdapterCovered", + "flexStackerModuleV1WithWasteChuteRightAdapterNoCover", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "flexStackerModuleV1WithWasteChuteRightAdapterCovered", + "flexStackerModuleV1WithWasteChuteRightAdapterNoCover", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -41412,7 +42996,37 @@ "newLocation": "offDeck", "strategy": "manualMoveWithoutPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "flexStackerModuleV1WithWasteChuteRightAdapterCovered", + "flexStackerModuleV1WithWasteChuteRightAdapterNoCover", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[01255c3f3b][pl_Flex_Protein_Digestion_Protocol].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[01255c3f3b][pl_Flex_Protein_Digestion_Protocol].json index 67327c84b0e..ee5f6c7dfd3 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[01255c3f3b][pl_Flex_Protein_Digestion_Protocol].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[01255c3f3b][pl_Flex_Protein_Digestion_Protocol].json @@ -101,7 +101,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -170,7 +183,20 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1328,7 +1354,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "A1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1397,7 +1440,20 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2555,7 +2611,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2624,7 +2697,20 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3782,7 +3868,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "B1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3851,7 +3954,20 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5009,7 +5125,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6276,7 +6409,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7939,7 +8085,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -9602,7 +9763,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -11265,7 +11439,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "flexStackerModuleV1WithWasteChuteRightAdapterCovered", + "flexStackerModuleV1WithWasteChuteRightAdapterNoCover", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0190369ce5][Flex_S_v2_16_P1000_96_GRIP_HS_MB_TC_TM_DeckConfiguration1NoFixtures].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0190369ce5][Flex_S_v2_16_P1000_96_GRIP_HS_MB_TC_TM_DeckConfiguration1NoFixtures].json index 3d1cdd1d3c1..5e8335207ab 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0190369ce5][Flex_S_v2_16_P1000_96_GRIP_HS_MB_TC_TM_DeckConfiguration1NoFixtures].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0190369ce5][Flex_S_v2_16_P1000_96_GRIP_HS_MB_TC_TM_DeckConfiguration1NoFixtures].json @@ -1809,7 +1809,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2B3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2983,7 +2998,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4157,7 +4185,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4226,7 +4267,22 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5384,7 +5440,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5453,7 +5528,20 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6611,7 +6699,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7767,7 +7872,13 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8923,7 +9034,13 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -10951,7 +11068,39 @@ "newLocation": "offDeck", "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -10967,7 +11116,37 @@ "newLocation": "offDeck", "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -10985,7 +11164,52 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11003,7 +11227,48 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11299,7 +11564,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11317,7 +11626,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11335,7 +11690,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2B3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2B3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11351,7 +11760,33 @@ "newLocation": "offDeck", "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11367,7 +11802,39 @@ "newLocation": "offDeck", "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2B3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" } diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0256665840][OT2_S_v2_16_P300M_P20S_aspirateDispenseMix0Volume].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0256665840][OT2_S_v2_16_P300M_P20S_aspirateDispenseMix0Volume].json index 6d0b815689f..71b8d699200 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0256665840][OT2_S_v2_16_P300M_P20S_aspirateDispenseMix0Volume].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0256665840][OT2_S_v2_16_P300M_P20S_aspirateDispenseMix0Volume].json @@ -1175,7 +1175,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "5", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout5", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2328,7 +2341,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout4", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2613,7 +2639,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[041ad55e7b][OT2_S_v2_15_P300M_P20S_HS_TC_TM_dispense_changes].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[041ad55e7b][OT2_S_v2_15_P300M_P20S_HS_TC_TM_dispense_changes].json index eba6890b1dc..3183067c1c9 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[041ad55e7b][OT2_S_v2_15_P300M_P20S_HS_TC_TM_dispense_changes].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[041ad55e7b][OT2_S_v2_15_P300M_P20S_HS_TC_TM_dispense_changes].json @@ -1231,7 +1231,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "5", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout5", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2384,7 +2397,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout4", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2668,7 +2694,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2914,7 +2953,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[057de2035d][OT2_S_v2_19_P300M_P20S_HS_TC_TM_SmokeTestV3].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[057de2035d][OT2_S_v2_19_P300M_P20S_HS_TC_TM_SmokeTestV3].json index f88d031bd87..f36ee780ed3 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[057de2035d][OT2_S_v2_19_P300M_P20S_HS_TC_TM_SmokeTestV3].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[057de2035d][OT2_S_v2_19_P300M_P20S_HS_TC_TM_SmokeTestV3].json @@ -1231,7 +1231,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "5", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout5", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2384,7 +2397,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout4", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4619,7 +4645,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "addressableAreaName": "9", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout9", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5794,7 +5837,28 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "addressableAreaName": "9", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout9", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6959,7 +7023,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "addressableAreaName": "1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8133,7 +8214,28 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "addressableAreaName": "1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -9307,7 +9409,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "addressableAreaName": "7", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout7", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0903a95825][Flex_S_v2_19_QIASeq_FX_48x].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0903a95825][Flex_S_v2_19_QIASeq_FX_48x].json index fccf2aae96c..650f90685c2 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0903a95825][Flex_S_v2_19_QIASeq_FX_48x].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0903a95825][Flex_S_v2_19_QIASeq_FX_48x].json @@ -1341,7 +1341,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2965,7 +2980,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4144,7 +4174,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4391,7 +4440,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6131,7 +6193,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7601,7 +7678,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -12120,7 +12212,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -19760,7 +19867,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -23511,7 +23664,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -28293,7 +28461,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -28998,7 +29212,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -29816,7 +30076,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -31086,7 +31392,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -34530,7 +34849,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -40035,7 +40400,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -43270,7 +43648,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -44484,7 +44908,21 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterCovered", + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -44503,7 +44941,42 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "gripperWasteChute", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -44521,7 +44994,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -45300,7 +45817,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -50214,7 +50777,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -51428,7 +52037,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -51447,7 +52069,42 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "gripperWasteChute", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -51465,7 +52122,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -55490,7 +56191,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -61037,7 +61784,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -61056,7 +61816,40 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "gripperWasteChute", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -61074,7 +61867,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -64350,7 +65183,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -65157,7 +66036,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[09676b9f7e][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_south_west].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[09676b9f7e][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_south_west].json index e81582f2998..738e66152b8 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[09676b9f7e][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_south_west].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[09676b9f7e][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_south_west].json @@ -1160,7 +1160,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1421,7 +1434,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0a9ef592c8][Flex_S_v2_18_Illumina_DNA_Prep_48x].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0a9ef592c8][Flex_S_v2_18_Illumina_DNA_Prep_48x].json index b49eaeb6609..13841871112 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0a9ef592c8][Flex_S_v2_18_Illumina_DNA_Prep_48x].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0a9ef592c8][Flex_S_v2_18_Illumina_DNA_Prep_48x].json @@ -1786,7 +1786,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2965,7 +2980,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3212,7 +3246,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4848,7 +4895,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6192,7 +6254,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7601,7 +7678,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -9773,7 +9865,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11068,7 +11206,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -15837,7 +15990,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -17475,7 +17674,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -18703,7 +18948,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -20044,7 +20304,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -21682,7 +21988,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -23064,7 +23416,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -24702,7 +25100,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -25930,7 +26374,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -28369,7 +28826,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -35717,7 +36220,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -39564,7 +40113,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -44526,7 +45088,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -45740,7 +46348,21 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterCovered", + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -45759,7 +46381,42 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "gripperWasteChute", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "A3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -45777,7 +46434,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "A3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "A3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -46658,7 +47359,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0b42cfc151][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_north_row].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0b42cfc151][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_north_row].json index 3951be19f24..606dc997ab7 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0b42cfc151][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_north_row].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0b42cfc151][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_north_row].json @@ -1160,7 +1160,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1421,7 +1434,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0c4ae179bb][OT2_S_v2_15_P300M_P20S_HS_TC_TM_SmokeTestV3].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0c4ae179bb][OT2_S_v2_15_P300M_P20S_HS_TC_TM_SmokeTestV3].json index 84e33cd17bd..e524f6bf97b 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0c4ae179bb][OT2_S_v2_15_P300M_P20S_HS_TC_TM_SmokeTestV3].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0c4ae179bb][OT2_S_v2_15_P300M_P20S_HS_TC_TM_SmokeTestV3].json @@ -1231,7 +1231,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "5", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout5", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2384,7 +2397,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout4", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4619,7 +4645,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "addressableAreaName": "9", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout9", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5794,7 +5837,28 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "addressableAreaName": "9", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout9", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6959,7 +7023,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "addressableAreaName": "1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8133,7 +8214,28 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "addressableAreaName": "1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -9307,7 +9409,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "addressableAreaName": "7", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout7", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -9431,7 +9550,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "6", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout6", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -10606,7 +10738,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -10853,7 +10998,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -11007,7 +11165,33 @@ "newLocation": "offDeck", "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11025,7 +11209,47 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11089,7 +11313,47 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11153,7 +11417,47 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "6", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout6", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11217,7 +11521,47 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "6", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout6", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "6", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout6", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11281,7 +11625,40 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0cbde10c37][OT2_S_v2_18_P300M_P20S_HS_TC_TM_SmokeTestV3].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0cbde10c37][OT2_S_v2_18_P300M_P20S_HS_TC_TM_SmokeTestV3].json index e9c6717fdd0..d014eef0b06 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0cbde10c37][OT2_S_v2_18_P300M_P20S_HS_TC_TM_SmokeTestV3].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0cbde10c37][OT2_S_v2_18_P300M_P20S_HS_TC_TM_SmokeTestV3].json @@ -1231,7 +1231,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "5", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout5", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2384,7 +2397,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout4", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4619,7 +4645,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "addressableAreaName": "9", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout9", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5794,7 +5837,28 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "addressableAreaName": "9", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout9", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6959,7 +7023,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "addressableAreaName": "1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8133,7 +8214,28 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "addressableAreaName": "1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -9307,7 +9409,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "addressableAreaName": "7", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout7", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0dd21c0ee5][pl_EM_seq_48Samples_AllSteps_Edits_150].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0dd21c0ee5][pl_EM_seq_48Samples_AllSteps_Edits_150].json index c407d673c2b..a042b99dd30 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0dd21c0ee5][pl_EM_seq_48Samples_AllSteps_Edits_150].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0dd21c0ee5][pl_EM_seq_48Samples_AllSteps_Edits_150].json @@ -1632,7 +1632,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2810,7 +2825,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4434,7 +4468,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5612,7 +5661,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6913,7 +6981,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8089,7 +8170,13 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8335,7 +8422,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -9618,7 +9718,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -10901,7 +11014,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -12059,7 +12185,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -13217,7 +13356,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -14375,7 +14527,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -15533,7 +15700,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -16691,7 +16873,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -17849,7 +18044,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -19007,7 +19215,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -20165,7 +20386,23 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot", + "stagingAreaSlotWithMagneticBlockV1", + "stagingAreaSlotWithWasteChuteRightAdapterCovered", + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -25003,7 +25240,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -26216,7 +26497,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -27504,7 +27827,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -27886,7 +28253,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -32165,7 +32574,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -33453,7 +33912,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -34741,7 +35254,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -35123,7 +35686,42 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "gripperWasteChute", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -35141,7 +35739,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -39155,7 +39805,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -40368,7 +41062,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -41656,7 +42392,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -42038,7 +42818,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -42056,7 +42878,40 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -44403,7 +45258,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -44618,7 +45523,40 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "gripperWasteChute", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "A3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -44636,7 +45574,40 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "gripperWasteChute", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -44654,7 +45625,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "A3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "A3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -44672,7 +45683,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -45777,7 +46828,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -47065,7 +48170,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -47447,7 +48602,42 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "gripperWasteChute", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -47465,7 +48655,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[109b7ad1f0][Flex_S_v2_20_96_None_ROW_HappyPath].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[109b7ad1f0][Flex_S_v2_20_96_None_ROW_HappyPath].json index 64a1766fb6a..c698278c953 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[109b7ad1f0][Flex_S_v2_20_96_None_ROW_HappyPath].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[109b7ad1f0][Flex_S_v2_20_96_None_ROW_HappyPath].json @@ -1167,7 +1167,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2379,7 +2392,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3554,7 +3580,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[10c2386b92][Flex_S_v2_20_96_AllCorners].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[10c2386b92][Flex_S_v2_20_96_AllCorners].json index 581a3e3ea51..97f2493fd48 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[10c2386b92][Flex_S_v2_20_96_AllCorners].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[10c2386b92][Flex_S_v2_20_96_AllCorners].json @@ -1186,7 +1186,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2345,7 +2358,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3504,7 +3530,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4663,7 +4702,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5822,7 +5874,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6981,7 +7046,23 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot", + "stagingAreaSlotWithMagneticBlockV1", + "stagingAreaSlotWithWasteChuteRightAdapterCovered", + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7000,7 +7081,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "A1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "A1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -7264,7 +7385,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -7452,7 +7613,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "A3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "A3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -8494,7 +8699,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13144,7 +13389,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13882,7 +14167,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -27348,7 +27673,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "A4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "A4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -31238,7 +31603,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "A4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -31256,7 +31661,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "A3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -31274,7 +31719,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "A3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "A3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -32088,7 +32573,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -32656,7 +33181,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "A1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -32674,7 +33243,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "A1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "A1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[11020a4e17][pl_Bradford_proteinassay].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[11020a4e17][pl_Bradford_proteinassay].json index d63c91e8a57..347d9090015 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[11020a4e17][pl_Bradford_proteinassay].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[11020a4e17][pl_Bradford_proteinassay].json @@ -641,7 +641,22 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -888,7 +903,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1249,7 +1277,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1610,7 +1651,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2769,7 +2823,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3928,7 +3997,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6062,7 +6146,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7258,7 +7355,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -19097,7 +19207,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -19190,7 +19352,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -19206,7 +19414,33 @@ "newLocation": "offDeck", "strategy": "manualMoveWithoutPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -19234,7 +19468,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[134037b2aa][OT2_X_v6_P300M_P20S_HS_MM_TM_TC_AllMods].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[134037b2aa][OT2_X_v6_P300M_P20S_HS_MM_TM_TC_AllMods].json index a0e4e4b52b4..bee8bb17515 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[134037b2aa][OT2_X_v6_P300M_P20S_HS_MM_TM_TC_AllMods].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[134037b2aa][OT2_X_v6_P300M_P20S_HS_MM_TM_TC_AllMods].json @@ -1799,7 +1799,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "5", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout5", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3060,7 +3073,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "addressableAreaName": "1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3417,7 +3447,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "addressableAreaName": "3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4574,7 +4621,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "addressableAreaName": "9", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout9", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5731,7 +5795,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "addressableAreaName": "7", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout7", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5825,7 +5906,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "6", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout6", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[13e5a9c68b][Flex_S_v2_20_P8X1000_P50_LLD].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[13e5a9c68b][Flex_S_v2_20_P8X1000_P50_LLD].json index 9519a2e4438..cbb450d94d4 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[13e5a9c68b][Flex_S_v2_20_P8X1000_P50_LLD].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[13e5a9c68b][Flex_S_v2_20_P8X1000_P50_LLD].json @@ -1166,7 +1166,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2324,7 +2337,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3502,7 +3528,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3595,7 +3636,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "flexStackerModuleV1WithWasteChuteRightAdapterCovered", + "flexStackerModuleV1WithWasteChuteRightAdapterNoCover", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3841,7 +3899,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[13ec753045][Flex_S_v2_18_Illumina_Stranded_total_RNA_Ribo_Zero].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[13ec753045][Flex_S_v2_18_Illumina_Stranded_total_RNA_Ribo_Zero].json index 8701aae97bc..0ca954f5977 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[13ec753045][Flex_S_v2_18_Illumina_Stranded_total_RNA_Ribo_Zero].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[13ec753045][Flex_S_v2_18_Illumina_Stranded_total_RNA_Ribo_Zero].json @@ -1632,7 +1632,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2810,7 +2825,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4270,7 +4304,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[15a60fccf4][pl_microBioID_beads_touchtip].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[15a60fccf4][pl_microBioID_beads_touchtip].json index 0363b1ca1df..abd05eb99ba 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[15a60fccf4][pl_microBioID_beads_touchtip].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[15a60fccf4][pl_microBioID_beads_touchtip].json @@ -1643,7 +1643,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2085,7 +2100,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3280,7 +3310,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4563,7 +4606,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5739,7 +5797,13 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6917,7 +6981,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8075,7 +8152,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -9233,7 +9323,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -10391,7 +10494,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -11549,7 +11667,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -12707,7 +12838,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -13865,7 +14009,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -15023,7 +15180,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -16181,7 +16351,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -17339,7 +17522,23 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot", + "stagingAreaSlotWithMagneticBlockV1", + "stagingAreaSlotWithWasteChuteRightAdapterCovered", + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -22224,7 +22423,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -22545,7 +22790,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -23817,7 +24108,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -24072,7 +24409,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -25344,7 +25727,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -25599,7 +26028,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -26871,7 +27346,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -27126,7 +27647,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -28398,7 +28965,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -30235,7 +30848,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -33741,7 +34400,33 @@ "newLocation": "offDeck", "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -33759,7 +34444,40 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -34166,7 +34884,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[194e3c49bb][pl_Normalization_with_PCR].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[194e3c49bb][pl_Normalization_with_PCR].json index 15d4ad5cd55..fc95e5a6f71 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[194e3c49bb][pl_Normalization_with_PCR].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[194e3c49bb][pl_Normalization_with_PCR].json @@ -960,7 +960,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2138,7 +2153,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3290,7 +3320,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "flexStackerModuleV1WithWasteChuteRightAdapterCovered", + "flexStackerModuleV1WithWasteChuteRightAdapterNoCover", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4448,7 +4495,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5606,7 +5666,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[196ec488f7][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_west].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[196ec488f7][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_west].json index c39bcbb3546..7ee2d792794 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[196ec488f7][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_west].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[196ec488f7][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_west].json @@ -1160,7 +1160,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1421,7 +1434,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[19c783e363][Flex_X_v8_P1000_96_HS_GRIP_TC_TM_GripperCollisionWithTips].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[19c783e363][Flex_X_v8_P1000_96_HS_GRIP_TC_TM_GripperCollisionWithTips].json index bc40fdbb1d4..3c420c48873 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[19c783e363][Flex_X_v8_P1000_96_HS_GRIP_TC_TM_GripperCollisionWithTips].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[19c783e363][Flex_X_v8_P1000_96_HS_GRIP_TC_TM_GripperCollisionWithTips].json @@ -1130,7 +1130,20 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1199,7 +1212,20 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1268,7 +1294,20 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2435,7 +2474,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3602,7 +3656,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2D3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4762,7 +4831,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4857,7 +4943,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4951,7 +5052,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6111,7 +6227,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7271,7 +7404,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8451,7 +8601,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -9632,7 +9795,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -10792,7 +10968,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -11952,7 +12141,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -12425,7 +12627,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12519,7 +12765,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12552,7 +12850,37 @@ "newLocation": "offDeck", "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12568,7 +12896,37 @@ "newLocation": "offDeck", "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[1b73b8a126][pl_Dynabeads_IP_Flex_96well_RIT_final].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[1b73b8a126][pl_Dynabeads_IP_Flex_96well_RIT_final].json index a084faeeb15..00f60fcd42d 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[1b73b8a126][pl_Dynabeads_IP_Flex_96well_RIT_final].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[1b73b8a126][pl_Dynabeads_IP_Flex_96well_RIT_final].json @@ -1292,7 +1292,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1539,7 +1552,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1798,7 +1824,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1892,7 +1933,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3050,7 +3104,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4209,7 +4278,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5368,7 +5450,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5930,7 +6025,22 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7214,7 +7324,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -17028,7 +17157,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -19850,7 +20029,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -29174,7 +29407,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -31996,7 +32279,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -34159,7 +34496,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -36981,7 +37368,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -39144,7 +39585,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -41966,7 +42457,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -44129,7 +44674,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -46951,7 +47546,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[1d37cbc080][pl_MagMax_RNA_Cells_Flex_multi].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[1d37cbc080][pl_MagMax_RNA_Cells_Flex_multi].json index 7d89bcbae0c..904e51d2610 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[1d37cbc080][pl_MagMax_RNA_Cells_Flex_multi].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[1d37cbc080][pl_MagMax_RNA_Cells_Flex_multi].json @@ -532,7 +532,22 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1816,7 +1831,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3454,7 +3488,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4633,7 +4682,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4820,7 +4888,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5067,7 +5150,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6226,7 +6322,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7385,7 +7494,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8544,7 +8666,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -9703,7 +9838,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -12369,7 +12517,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12819,7 +13017,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13249,7 +13501,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13699,7 +14001,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14129,7 +14485,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14579,7 +14985,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16077,7 +16537,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16527,7 +17037,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16957,7 +17521,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -17407,7 +18021,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -17837,7 +18505,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -18287,7 +19005,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -18717,7 +19489,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -19167,7 +19989,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -20391,7 +21267,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[238912ff51][Flex_S_v2_18_KAPA_Library_Quant].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[238912ff51][Flex_S_v2_18_KAPA_Library_Quant].json index f98ef8886da..e86faca6494 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[238912ff51][Flex_S_v2_18_KAPA_Library_Quant].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[238912ff51][Flex_S_v2_18_KAPA_Library_Quant].json @@ -1340,7 +1340,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5689,7 +5704,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7313,7 +7341,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8491,7 +8534,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8738,7 +8800,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -9916,7 +9991,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -11094,7 +11182,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -12365,7 +12466,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "flexStackerModuleV1WithWasteChuteRightAdapterCovered", + "flexStackerModuleV1WithWasteChuteRightAdapterNoCover", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -14128,7 +14246,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -25965,7 +26098,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[248a2a3107][pl_Omega_HDQ_DNA_Cells_Flex_96_channel].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[248a2a3107][pl_Omega_HDQ_DNA_Cells_Flex_96_channel].json index 38d0810f4ad..413050e1402 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[248a2a3107][pl_Omega_HDQ_DNA_Cells_Flex_96_channel].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[248a2a3107][pl_Omega_HDQ_DNA_Cells_Flex_96_channel].json @@ -532,7 +532,22 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1816,7 +1831,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3440,7 +3474,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4619,7 +4668,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4775,7 +4843,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6059,7 +6142,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -10799,7 +10895,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -15539,7 +15648,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -18551,7 +18675,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -23804,7 +23941,20 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -24962,7 +25112,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "A1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -25031,7 +25198,20 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -26189,7 +26369,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -31230,7 +31427,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -31425,7 +31672,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -31650,7 +31951,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -31845,7 +32196,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -32070,7 +32475,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -32265,7 +32720,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -32490,7 +32999,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -32685,7 +33244,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -34928,7 +35541,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[250e9496be][pl_BCApeptideassay].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[250e9496be][pl_BCApeptideassay].json index 48190df7f82..3adf7e00fd2 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[250e9496be][pl_BCApeptideassay].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[250e9496be][pl_BCApeptideassay].json @@ -641,7 +641,22 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -861,7 +876,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1108,7 +1136,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1469,7 +1510,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1830,7 +1884,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2989,7 +3056,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4148,7 +4230,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8896,7 +8993,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -10092,7 +10202,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -24651,7 +24774,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -24744,7 +24919,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -24760,7 +24981,33 @@ "newLocation": "offDeck", "strategy": "manualMoveWithoutPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -24788,7 +25035,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -24804,7 +25091,33 @@ "newLocation": "offDeck", "strategy": "manualMoveWithoutPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -25999,7 +26312,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -26057,7 +26383,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[255d014c70][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_mix_collision].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[255d014c70][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_mix_collision].json index 225541d9e20..328d400125d 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[255d014c70][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_mix_collision].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[255d014c70][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_mix_collision].json @@ -1160,7 +1160,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1421,7 +1434,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2595,7 +2621,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[277961bc58][pl_NiNTA_Flex_96well_final].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[277961bc58][pl_NiNTA_Flex_96well_final].json index 64cec1732c3..3a0ebdf8b69 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[277961bc58][pl_NiNTA_Flex_96well_final].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[277961bc58][pl_NiNTA_Flex_96well_final].json @@ -1292,7 +1292,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2576,7 +2591,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3860,7 +3888,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5144,7 +5187,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5238,7 +5294,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6396,7 +6465,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7555,7 +7637,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8098,7 +8193,22 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -9382,7 +9492,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -11103,7 +11232,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2D3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -23098,7 +23242,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -25920,7 +26114,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -29183,7 +29431,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -32005,7 +32303,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -35299,7 +35651,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -38121,7 +38523,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -41384,7 +41840,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -44206,7 +44712,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -47469,7 +48029,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -50291,7 +50901,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -53602,7 +54266,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[28fdeebdd9][pl_Omega_HDQ_DNA_Cells_Flex_multi].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[28fdeebdd9][pl_Omega_HDQ_DNA_Cells_Flex_multi].json index 936161f35e0..ff5111a7656 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[28fdeebdd9][pl_Omega_HDQ_DNA_Cells_Flex_multi].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[28fdeebdd9][pl_Omega_HDQ_DNA_Cells_Flex_multi].json @@ -532,7 +532,22 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1816,7 +1831,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3454,7 +3488,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4633,7 +4682,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4789,7 +4857,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5036,7 +5119,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6195,7 +6291,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7354,7 +7463,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8513,7 +8635,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -13793,7 +13928,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14273,7 +14458,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14590,7 +14829,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15040,7 +15329,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15357,7 +15700,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15807,7 +16200,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16124,7 +16571,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16574,7 +17071,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -17192,7 +17743,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[29bb5df52d][pl_Omega_HDQ_DNA_Bacteria_Flex_multi].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[29bb5df52d][pl_Omega_HDQ_DNA_Bacteria_Flex_multi].json index bce6b1bfc5c..c2b0ae3445e 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[29bb5df52d][pl_Omega_HDQ_DNA_Bacteria_Flex_multi].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[29bb5df52d][pl_Omega_HDQ_DNA_Bacteria_Flex_multi].json @@ -532,7 +532,22 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1816,7 +1831,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3454,7 +3488,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4633,7 +4682,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4789,7 +4857,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5036,7 +5119,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5283,7 +5379,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6442,7 +6551,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7601,7 +7723,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8760,7 +8895,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -9919,7 +10067,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -16610,7 +16771,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -17090,7 +17301,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -17422,7 +17687,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -17872,7 +18187,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -18204,7 +18573,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -18654,7 +19073,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -18986,7 +19459,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -20079,7 +20602,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -20383,7 +20960,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[29e143f047][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_distribute_destination_collision].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[29e143f047][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_distribute_destination_collision].json index 4d1fef18df8..c23a9cf8379 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[29e143f047][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_distribute_destination_collision].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[29e143f047][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_distribute_destination_collision].json @@ -1160,7 +1160,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1421,7 +1434,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2595,7 +2623,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3769,7 +3810,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "flexStackerModuleV1WithWasteChuteRightAdapterCovered", + "flexStackerModuleV1WithWasteChuteRightAdapterNoCover", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[29eec5a85a][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_transfer_source_collision].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[29eec5a85a][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_transfer_source_collision].json index bed5e33f447..aaed6596a91 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[29eec5a85a][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_transfer_source_collision].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[29eec5a85a][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_transfer_source_collision].json @@ -1160,7 +1160,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1421,7 +1434,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2595,7 +2621,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3769,7 +3808,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "flexStackerModuleV1WithWasteChuteRightAdapterCovered", + "flexStackerModuleV1WithWasteChuteRightAdapterNoCover", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2b7fcb5b23][Flex_S_v2_18_P1000_96_TipTrackingBug].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2b7fcb5b23][Flex_S_v2_18_P1000_96_TipTrackingBug].json index 2dbe272ad3a..92a8fa346d9 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2b7fcb5b23][Flex_S_v2_18_P1000_96_TipTrackingBug].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2b7fcb5b23][Flex_S_v2_18_P1000_96_TipTrackingBug].json @@ -1166,7 +1166,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2324,7 +2337,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2b866b03f3][Flex_S_v2_21_P1000_96_GRIP_HS_MB_TC_TM_Smoke].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2b866b03f3][Flex_S_v2_21_P1000_96_GRIP_HS_MB_TC_TM_Smoke].json index ee19bc58e32..76050f9e178 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2b866b03f3][Flex_S_v2_21_P1000_96_GRIP_HS_MB_TC_TM_Smoke].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2b866b03f3][Flex_S_v2_21_P1000_96_GRIP_HS_MB_TC_TM_Smoke].json @@ -75,7 +75,21 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot", + "stagingAreaSlotWithMagneticBlockV1" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1376,7 +1390,24 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "A4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1534,7 +1565,28 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "A4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1692,7 +1744,32 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "A4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1850,7 +1927,36 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "A4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2008,7 +2114,40 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "A4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3250,7 +3389,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4415,7 +4569,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "heaterShakerV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4508,7 +4677,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5686,7 +5868,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5755,7 +5950,20 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6913,7 +7121,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8071,7 +8296,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -9229,7 +9469,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -10385,7 +10638,13 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -10455,7 +10714,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -10487,7 +10790,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -10533,7 +10878,49 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterCovered", + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterCovered", + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -10565,7 +10952,48 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterCovered", + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11335,7 +11763,40 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "gripperWasteChute", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11353,7 +11814,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13860,7 +14361,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13878,7 +14423,79 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "A4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13987,7 +14604,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "gripperWasteChute", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID", + "lidId": "UUID" + }, + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14049,7 +14706,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14171,7 +14882,65 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14234,7 +15003,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "absorbanceReaderV1B3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "absorbanceReaderV1B3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14427,7 +15246,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "absorbanceReaderV1B3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14443,7 +15304,33 @@ "newLocation": "offDeck", "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14538,6 +15425,19 @@ }, "result": { "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], "offsetId": "UUID" }, "startedAt": "TIMESTAMP", @@ -14603,7 +15503,47 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14665,6 +15605,19 @@ }, "result": { "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], "offsetId": "UUID" }, "startedAt": "TIMESTAMP", @@ -14731,7 +15684,46 @@ "strategy": "manualMoveWithPause" }, "result": { - "offsetId": "UUID" + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "offsetId": "UUID", + "originLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -14796,7 +15788,40 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14891,7 +15916,40 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "gripperWasteChute", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2bc6830494][pl_langone_ribo_pt1_ramp].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2bc6830494][pl_langone_ribo_pt1_ramp].json index cbbda041874..6c482d452b1 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2bc6830494][pl_langone_ribo_pt1_ramp].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2bc6830494][pl_langone_ribo_pt1_ramp].json @@ -1316,7 +1316,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2492,7 +2507,13 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3668,7 +3689,13 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5441,7 +5468,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2D3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2cc8efae68][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_east_column].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2cc8efae68][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_east_column].json index 1fe105e1626..dcbda864ff9 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2cc8efae68][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_east_column].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2cc8efae68][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_east_column].json @@ -1160,7 +1160,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1421,7 +1434,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2eaf98de6a][Flex_S_v2_16_P1000_96_GRIP_HS_MB_TC_TM_TriggerPrepareForMountMovement].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2eaf98de6a][Flex_S_v2_16_P1000_96_GRIP_HS_MB_TC_TM_TriggerPrepareForMountMovement].json index cade2906ff1..ce410943c79 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2eaf98de6a][Flex_S_v2_16_P1000_96_GRIP_HS_MB_TC_TM_TriggerPrepareForMountMovement].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2eaf98de6a][Flex_S_v2_16_P1000_96_GRIP_HS_MB_TC_TM_TriggerPrepareForMountMovement].json @@ -2296,7 +2296,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3461,7 +3476,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4744,7 +4774,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5918,7 +5961,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5987,7 +6043,20 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7145,7 +7214,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8303,7 +8389,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -9461,7 +9562,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -11659,7 +11773,42 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "gripperWasteChute", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1WithWasteChuteRightAdapterNoCover", + "stagingAreaSlotWithWasteChuteRightAdapterNoCover", + "wasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12556,7 +12705,46 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "gripperWasteChute", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1WithWasteChuteRightAdapterNoCover", + "stagingAreaSlotWithWasteChuteRightAdapterNoCover", + "wasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12574,7 +12762,55 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13108,7 +13344,46 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "gripperWasteChute", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1WithWasteChuteRightAdapterNoCover", + "stagingAreaSlotWithWasteChuteRightAdapterNoCover", + "wasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13126,7 +13401,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13144,7 +13459,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13162,7 +13517,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13180,7 +13575,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13198,7 +13633,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13216,7 +13691,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13234,7 +13749,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13252,7 +13807,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13270,7 +13865,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13288,7 +13923,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13306,7 +13981,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13324,7 +14039,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13342,7 +14097,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13360,7 +14155,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13378,7 +14213,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13396,7 +14271,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13414,7 +14333,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13432,7 +14393,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13450,7 +14463,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13468,7 +14527,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13486,7 +14597,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13504,7 +14661,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13522,7 +14723,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13540,7 +14783,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13558,7 +14845,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13576,7 +14917,65 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13594,7 +14993,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13612,7 +15061,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13630,7 +15121,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13648,7 +15179,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13666,7 +15237,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13684,7 +15295,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13702,7 +15353,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13720,7 +15411,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13738,11 +15469,51 @@ }, "strategy": "usingGripper" }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { "commandType": "moveLabware", "completedAt": "TIMESTAMP", "createdAt": "TIMESTAMP", @@ -13756,7 +15527,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13774,7 +15585,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13792,7 +15643,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13810,7 +15701,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13828,7 +15759,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13846,7 +15817,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13864,7 +15875,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13882,7 +15933,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13900,7 +15991,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13918,7 +16053,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13936,7 +16113,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13954,7 +16183,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13972,7 +16247,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13990,7 +16317,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14008,7 +16381,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14026,7 +16443,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14044,7 +16503,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14062,7 +16565,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14080,7 +16637,65 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14098,8 +16713,58 @@ }, "strategy": "usingGripper" }, - "result": {}, - "startedAt": "TIMESTAMP", + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, + "startedAt": "TIMESTAMP", "status": "succeeded" }, { @@ -14116,7 +16781,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14134,7 +16841,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14152,7 +16899,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14170,7 +16957,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14188,7 +17015,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14206,7 +17073,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14224,7 +17131,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14242,7 +17189,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14260,7 +17247,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14278,7 +17305,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14296,7 +17363,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14314,7 +17421,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14332,7 +17479,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14350,7 +17537,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14368,7 +17595,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14386,7 +17653,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14404,7 +17711,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14422,7 +17769,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14440,7 +17831,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14458,7 +17891,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14476,7 +17961,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14494,7 +18025,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14512,7 +18095,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14530,7 +18159,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14548,7 +18221,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14566,7 +18281,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14584,7 +18343,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14602,7 +18415,65 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14620,7 +18491,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14638,7 +18559,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14656,7 +18619,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14674,7 +18681,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14692,7 +18741,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14710,7 +18803,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14728,7 +18863,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14746,7 +18925,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14764,7 +18985,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14782,7 +19043,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14800,7 +19105,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14818,7 +19165,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14836,13 +19227,55 @@ }, "strategy": "usingGripper" }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "moveLabware", - "completedAt": "TIMESTAMP", + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "completedAt": "TIMESTAMP", "createdAt": "TIMESTAMP", "id": "UUID", "key": "7914219d53039908cfae2a897f068a00", @@ -14854,7 +19287,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14872,7 +19349,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14890,7 +19409,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14908,7 +19471,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14926,7 +19531,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14944,7 +19593,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14962,7 +19653,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14980,7 +19711,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14998,7 +19773,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15016,7 +19837,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15034,7 +19901,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15052,7 +19973,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15070,7 +20041,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15088,7 +20113,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15106,7 +20181,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15124,7 +20245,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15142,7 +20317,65 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15160,7 +20393,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15178,7 +20461,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15196,7 +20525,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15214,7 +20585,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15232,7 +20647,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15250,7 +20707,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15268,7 +20769,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15286,7 +20829,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15304,7 +20887,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15322,7 +20949,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15340,7 +21009,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15358,7 +21071,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15376,7 +21131,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15394,7 +21193,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15412,7 +21253,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15430,7 +21315,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15448,7 +21375,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15466,7 +21437,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15484,7 +21497,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15502,7 +21555,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15520,7 +21617,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15538,7 +21681,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15556,7 +21745,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15574,7 +21817,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15592,7 +21885,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15610,7 +21957,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15628,7 +22025,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15646,7 +22089,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15664,7 +22161,65 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15682,7 +22237,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15700,7 +22305,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15718,7 +22377,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15736,7 +22441,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15754,7 +22511,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15772,7 +22575,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15790,7 +22645,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15808,7 +22709,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15826,7 +22767,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15844,7 +22837,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15862,7 +22901,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15880,7 +22971,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15898,7 +23035,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15916,7 +23105,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15934,7 +23169,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15952,7 +23239,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15970,7 +23303,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15988,7 +23373,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16006,7 +23437,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16024,7 +23495,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16042,7 +23565,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16060,7 +23633,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16078,7 +23705,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16096,7 +23773,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16114,7 +23845,65 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16132,7 +23921,65 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16150,7 +23997,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16168,7 +24065,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16186,7 +24129,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16204,7 +24201,65 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16222,7 +24277,65 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16240,7 +24353,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16258,7 +24417,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16276,7 +24487,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16294,7 +24551,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16312,7 +24621,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16330,7 +24685,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16348,7 +24743,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16366,7 +24813,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16384,7 +24877,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16402,7 +24947,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16420,7 +25011,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16438,7 +25081,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16456,7 +25145,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16474,7 +25215,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16492,7 +25279,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16510,7 +25349,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16528,7 +25413,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16546,7 +25471,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16564,7 +25541,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16582,7 +25609,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16600,7 +25681,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16618,7 +25749,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16636,7 +25821,65 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16654,7 +25897,65 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16672,7 +25973,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16690,7 +26041,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16708,7 +26105,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16726,7 +26177,65 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -17029,7 +26538,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" } diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[30c05024e8][Flex_S_v2_20_96_None_SINGLE_4Corners50ul].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[30c05024e8][Flex_S_v2_20_96_None_SINGLE_4Corners50ul].json index b51efe39d43..a6966ce29fb 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[30c05024e8][Flex_S_v2_20_96_None_SINGLE_4Corners50ul].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[30c05024e8][Flex_S_v2_20_96_None_SINGLE_4Corners50ul].json @@ -1167,7 +1167,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[31d1aec819][Flex_S_v2_20_96_None_SINGLE_HappyPathNorthSide].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[31d1aec819][Flex_S_v2_20_96_None_SINGLE_HappyPathNorthSide].json index c50efd7f6d3..4a595ea5344 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[31d1aec819][Flex_S_v2_20_96_None_SINGLE_HappyPathNorthSide].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[31d1aec819][Flex_S_v2_20_96_None_SINGLE_HappyPathNorthSide].json @@ -1167,7 +1167,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2379,7 +2392,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3554,7 +3580,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6468,7 +6507,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7643,7 +7697,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[33c134ee09][pl_Takara_InFusionSnapAssembly_Flex].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[33c134ee09][pl_Takara_InFusionSnapAssembly_Flex].json index 34c36cbea16..b68131b959a 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[33c134ee09][pl_Takara_InFusionSnapAssembly_Flex].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[33c134ee09][pl_Takara_InFusionSnapAssembly_Flex].json @@ -1632,7 +1632,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2D3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2811,7 +2826,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3970,7 +4004,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5129,7 +5176,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5528,7 +5588,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[34f32336bc][Flex_X_v2_21_plate_reader_wrong_plate2].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[34f32336bc][Flex_X_v2_21_plate_reader_wrong_plate2].json index 7f50cfdd654..32b6258f2ab 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[34f32336bc][Flex_X_v2_21_plate_reader_wrong_plate2].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[34f32336bc][Flex_X_v2_21_plate_reader_wrong_plate2].json @@ -1166,7 +1166,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2360,7 +2373,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[376765183a0][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_bottom_left_edge].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[376765183a0][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_bottom_left_edge].json index e2bc115fd1b..cec98fa8689 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[376765183a0][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_bottom_left_edge].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[376765183a0][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_bottom_left_edge].json @@ -1160,7 +1160,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[376765183a1][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_bottom_left_edge].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[376765183a1][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_bottom_left_edge].json index e2bc115fd1b..cec98fa8689 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[376765183a1][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_bottom_left_edge].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[376765183a1][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_bottom_left_edge].json @@ -1160,7 +1160,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[39191e3573][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_south_row].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[39191e3573][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_south_row].json index b574f7610f7..864825a2bda 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[39191e3573][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_south_row].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[39191e3573][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_south_row].json @@ -1160,7 +1160,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1421,7 +1434,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[3a039d726f][pl_Dynabeads_IP_Flex_96well_final].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[3a039d726f][pl_Dynabeads_IP_Flex_96well_final].json index b38642d42ac..1559f5ba9d3 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[3a039d726f][pl_Dynabeads_IP_Flex_96well_final].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[3a039d726f][pl_Dynabeads_IP_Flex_96well_final].json @@ -1292,7 +1292,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1539,7 +1552,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1786,7 +1812,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1880,7 +1921,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3038,7 +3092,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4197,7 +4266,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5356,7 +5438,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5899,7 +5994,22 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7183,7 +7293,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -11035,7 +11164,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13857,7 +14036,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -18851,7 +19084,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -21673,7 +21956,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -23836,7 +24173,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -26658,7 +27045,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -28821,7 +29262,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -31643,7 +32134,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -33806,7 +34351,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -36628,7 +37223,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[3cec61dfd9][Flex_S_v2_19_KAPA_Library_Quant].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[3cec61dfd9][Flex_S_v2_19_KAPA_Library_Quant].json index 489f4447f21..6d4bb80ddab 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[3cec61dfd9][Flex_S_v2_19_KAPA_Library_Quant].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[3cec61dfd9][Flex_S_v2_19_KAPA_Library_Quant].json @@ -1340,7 +1340,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5689,7 +5704,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7313,7 +7341,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8491,7 +8534,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8738,7 +8800,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -9916,7 +9991,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -11094,7 +11182,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -12365,7 +12466,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "flexStackerModuleV1WithWasteChuteRightAdapterCovered", + "flexStackerModuleV1WithWasteChuteRightAdapterNoCover", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -14128,7 +14246,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -25965,7 +26098,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[3cf6a3778e][Flex_S_v2_18_P1000_96_GRIP_HS_MB_TC_TM_Smoke].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[3cf6a3778e][Flex_S_v2_18_P1000_96_GRIP_HS_MB_TC_TM_Smoke].json index 0f988bca20b..e7d321f62ad 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[3cf6a3778e][Flex_S_v2_18_P1000_96_GRIP_HS_MB_TC_TM_Smoke].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[3cf6a3778e][Flex_S_v2_18_P1000_96_GRIP_HS_MB_TC_TM_Smoke].json @@ -2296,7 +2296,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3461,7 +3476,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3554,7 +3584,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4728,7 +4771,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4797,7 +4853,20 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5955,7 +6024,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7113,7 +7199,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8271,7 +8372,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -10098,7 +10212,33 @@ "newLocation": "offDeck", "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -10372,7 +10512,37 @@ "newLocation": "offDeck", "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -10390,7 +10560,55 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11167,7 +11385,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11185,7 +11443,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11203,7 +11501,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11221,7 +11559,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11239,7 +11617,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11257,7 +11675,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11275,7 +11733,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11293,7 +11795,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11311,7 +11855,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11329,7 +11917,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11347,7 +11977,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11365,7 +12047,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11383,7 +12111,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11401,7 +12181,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11419,16 +12245,56 @@ }, "strategy": "usingGripper" }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "moveLabware", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "d371cbd83b68cbffb7be6e25c3b68254", + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "d371cbd83b68cbffb7be6e25c3b68254", "notes": [], "params": { "labwareId": "UUID", @@ -11437,7 +12303,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11455,7 +12361,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11473,7 +12419,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11491,7 +12481,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11509,7 +12541,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11527,7 +12603,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11545,7 +12663,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11563,7 +12733,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11581,7 +12797,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11599,7 +12867,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11617,7 +12931,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11635,7 +12989,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11653,7 +13047,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11671,7 +13105,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11689,7 +13167,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11707,7 +13227,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11725,7 +13289,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11743,7 +13349,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11761,7 +13419,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11779,7 +13483,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11797,7 +13553,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11815,7 +13617,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11833,7 +13679,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11851,7 +13743,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11869,7 +13807,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11887,7 +13879,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11905,7 +13947,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11923,7 +14019,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11941,7 +14087,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11959,7 +14151,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11977,7 +14215,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11995,7 +14279,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12013,7 +14351,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12031,7 +14419,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12049,7 +14491,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12067,7 +14559,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12085,7 +14631,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12103,7 +14699,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12121,7 +14771,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12139,7 +14839,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12157,7 +14911,65 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12175,7 +14987,65 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12193,7 +15063,65 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12211,7 +15139,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12229,7 +15207,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12247,7 +15279,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12265,7 +15347,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12283,7 +15419,65 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12301,7 +15495,65 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12319,7 +15571,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12591,7 +15889,47 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12607,7 +15945,33 @@ "newLocation": "offDeck", "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12702,6 +16066,19 @@ }, "result": { "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], "offsetId": "UUID" }, "startedAt": "TIMESTAMP", @@ -12767,7 +16144,47 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12829,6 +16246,19 @@ }, "result": { "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], "offsetId": "UUID" }, "startedAt": "TIMESTAMP", @@ -12895,7 +16325,46 @@ "strategy": "manualMoveWithPause" }, "result": { - "offsetId": "UUID" + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "offsetId": "UUID", + "originLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -12960,7 +16429,40 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13069,7 +16571,40 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "gripperWasteChute", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13087,7 +16622,40 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "gripperWasteChute", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" } diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[4148613317][Flex_S_v2_19_ligseq].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[4148613317][Flex_S_v2_19_ligseq].json index be83efdb3d1..655cfaad1d4 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[4148613317][Flex_S_v2_19_ligseq].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[4148613317][Flex_S_v2_19_ligseq].json @@ -2126,7 +2126,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3410,7 +3425,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4629,7 +4657,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5787,7 +5828,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7077,7 +7133,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8235,7 +8306,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -9393,7 +9477,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -10551,7 +10650,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -13482,7 +13596,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14499,7 +14659,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16865,7 +17071,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -17180,7 +17432,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -17432,7 +17730,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -19708,7 +20052,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -20182,7 +20572,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -20511,7 +20947,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -20985,7 +21467,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -21314,7 +21842,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -21972,7 +22546,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -22287,7 +22907,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -22459,7 +23125,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[42beea80be][pl_96_ch_demo_rtp].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[42beea80be][pl_96_ch_demo_rtp].json index 42f66954c50..544eb269caf 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[42beea80be][pl_96_ch_demo_rtp].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[42beea80be][pl_96_ch_demo_rtp].json @@ -77,7 +77,20 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1235,7 +1248,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "A1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1304,7 +1334,20 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2462,7 +2505,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2531,7 +2591,20 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3689,7 +3762,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "B1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4973,7 +5063,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6257,7 +6360,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7436,7 +7554,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8615,7 +8746,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8710,7 +8856,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8805,7 +8964,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -9052,7 +9224,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -9879,7 +10064,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -10070,7 +10299,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -10370,7 +10641,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -10561,7 +10878,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11089,7 +11452,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11280,7 +11687,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11580,7 +12029,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11771,7 +12266,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12313,7 +12854,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12491,7 +13076,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12791,7 +13418,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12969,7 +13642,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[4389e3ab18][OT2_X_v6_P20S_None_SimpleTransfer].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[4389e3ab18][OT2_X_v6_P20S_None_SimpleTransfer].json index 15cc1b07236..8ed38948ce4 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[4389e3ab18][OT2_X_v6_P20S_None_SimpleTransfer].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[4389e3ab18][OT2_X_v6_P20S_None_SimpleTransfer].json @@ -120,7 +120,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "7", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout7", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -368,7 +381,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "8", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout8", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -519,7 +545,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1673,7 +1712,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[4753259c3e][pl_sample_dilution_with_96_channel_pipette].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[4753259c3e][pl_sample_dilution_with_96_channel_pipette].json index b45ed38fb45..21461064b5f 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[4753259c3e][pl_sample_dilution_with_96_channel_pipette].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[4753259c3e][pl_sample_dilution_with_96_channel_pipette].json @@ -1632,7 +1632,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2811,7 +2826,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3990,7 +4024,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "flexStackerModuleV1WithWasteChuteRightAdapterCovered", + "flexStackerModuleV1WithWasteChuteRightAdapterNoCover", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4082,7 +4133,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4151,7 +4215,20 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5309,7 +5386,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "A1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[4a82419f1f][OT2_S_v2_16_P300M_P20S_HS_TC_TM_SmokeTestV3].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[4a82419f1f][OT2_S_v2_16_P300M_P20S_HS_TC_TM_SmokeTestV3].json index c0eeca7fad0..dea0d423437 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[4a82419f1f][OT2_S_v2_16_P300M_P20S_HS_TC_TM_SmokeTestV3].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[4a82419f1f][OT2_S_v2_16_P300M_P20S_HS_TC_TM_SmokeTestV3].json @@ -1231,7 +1231,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "5", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout5", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2384,7 +2397,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout4", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4619,7 +4645,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "addressableAreaName": "9", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout9", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5794,7 +5837,28 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "addressableAreaName": "9", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout9", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6959,7 +7023,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "addressableAreaName": "1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8133,7 +8214,28 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "addressableAreaName": "1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -9307,7 +9409,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "addressableAreaName": "7", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout7", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -9431,7 +9550,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "6", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout6", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -10606,7 +10738,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -10853,7 +10998,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -11007,7 +11165,33 @@ "newLocation": "offDeck", "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11025,7 +11209,47 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11089,7 +11313,47 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11153,7 +11417,47 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "6", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout6", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11217,7 +11521,47 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "6", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout6", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "6", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout6", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11281,7 +11625,40 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[4b17883f74][OT2_S_v2_17_P300M_P20S_HS_TC_TM_dispense_changes].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[4b17883f74][OT2_S_v2_17_P300M_P20S_HS_TC_TM_dispense_changes].json index b9c7fe3eccb..ccd6f05ce50 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[4b17883f74][OT2_S_v2_17_P300M_P20S_HS_TC_TM_dispense_changes].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[4b17883f74][OT2_S_v2_17_P300M_P20S_HS_TC_TM_dispense_changes].json @@ -1231,7 +1231,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "5", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout5", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2384,7 +2397,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout4", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2668,7 +2694,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2914,7 +2953,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[4b9e0f93d9][OT2_S_v2_20_8_None_PARTIAL_COLUMN_HappyPathMixedTipRacks].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[4b9e0f93d9][OT2_S_v2_20_8_None_PARTIAL_COLUMN_HappyPathMixedTipRacks].json index 2c0e359ce5f..877630a9947 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[4b9e0f93d9][OT2_S_v2_20_8_None_PARTIAL_COLUMN_HappyPathMixedTipRacks].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[4b9e0f93d9][OT2_S_v2_20_8_None_PARTIAL_COLUMN_HappyPathMixedTipRacks].json @@ -1160,7 +1160,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "7", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout7", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2312,7 +2325,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "8", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout8", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3490,7 +3516,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3736,7 +3775,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3829,7 +3881,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[4ea9d66206][Flex_X_v2_20_96_and_8_Overrides_InvalidConfigs_Override_eight_partial_column_no_end].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[4ea9d66206][Flex_X_v2_20_96_and_8_Overrides_InvalidConfigs_Override_eight_partial_column_no_end].json index 25f1fc6f062..062e7073bf2 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[4ea9d66206][Flex_X_v2_20_96_and_8_Overrides_InvalidConfigs_Override_eight_partial_column_no_end].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[4ea9d66206][Flex_X_v2_20_96_and_8_Overrides_InvalidConfigs_Override_eight_partial_column_no_end].json @@ -1166,7 +1166,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[4f50c02c81][Flex_S_v2_19_AMPure_XP_48x].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[4f50c02c81][Flex_S_v2_19_AMPure_XP_48x].json index 01407d2b421..4b45abf4d02 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[4f50c02c81][Flex_S_v2_19_AMPure_XP_48x].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[4f50c02c81][Flex_S_v2_19_AMPure_XP_48x].json @@ -1786,7 +1786,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2965,7 +2980,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3212,7 +3246,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3736,7 +3783,22 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5019,7 +5081,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6381,7 +6462,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8011,7 +8107,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -11233,7 +11344,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12156,7 +12317,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15405,7 +15620,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -19334,7 +19599,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -23759,7 +24039,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -24968,7 +25302,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -26196,7 +26580,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[50d7be4518][pl_Zymo_Quick_RNA_Cells_Flex_multi].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[50d7be4518][pl_Zymo_Quick_RNA_Cells_Flex_multi].json index 00eb89d9c69..9b9bf721300 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[50d7be4518][pl_Zymo_Quick_RNA_Cells_Flex_multi].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[50d7be4518][pl_Zymo_Quick_RNA_Cells_Flex_multi].json @@ -532,7 +532,22 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1816,7 +1831,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3454,7 +3488,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4664,7 +4713,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4820,7 +4888,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5067,7 +5150,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5314,7 +5410,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5561,7 +5670,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6720,7 +6844,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7879,7 +8016,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -9038,7 +9188,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -10197,7 +10360,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -14137,7 +14313,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14915,7 +15141,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15331,7 +15611,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15781,7 +16111,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16197,7 +16581,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16647,7 +17081,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -17063,7 +17551,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -17513,7 +18051,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -19284,7 +19876,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -19734,7 +20376,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -20150,7 +20846,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -20600,7 +21346,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -21016,7 +21816,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -21466,7 +22316,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -21882,7 +22786,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -22332,7 +23286,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -22916,7 +23924,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[51fc977577][OT2_S_v6_P300M_P20S_MixTransferManyLiquids].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[51fc977577][OT2_S_v6_P300M_P20S_MixTransferManyLiquids].json index edb78f79ace..043c232ab03 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[51fc977577][OT2_S_v6_P300M_P20S_MixTransferManyLiquids].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[51fc977577][OT2_S_v6_P300M_P20S_MixTransferManyLiquids].json @@ -1196,7 +1196,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2350,7 +2363,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2444,7 +2470,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "10", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout10", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2538,7 +2577,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "11", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout11", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2632,7 +2684,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "7", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout7", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2880,7 +2945,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "8", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout8", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2974,7 +3052,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "6", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout6", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3222,7 +3313,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout4", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[53db9bf516][Flex_X_v2_20_96_and_8_Overrides_InvalidConfigs_Override_eight_partial_column_bottom_left].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[53db9bf516][Flex_X_v2_20_96_and_8_Overrides_InvalidConfigs_Override_eight_partial_column_bottom_left].json index e514b696c6a..06664a232af 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[53db9bf516][Flex_X_v2_20_96_and_8_Overrides_InvalidConfigs_Override_eight_partial_column_bottom_left].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[53db9bf516][Flex_X_v2_20_96_and_8_Overrides_InvalidConfigs_Override_eight_partial_column_bottom_left].json @@ -1166,7 +1166,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[549cc904ac][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_c3_right_edge].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[549cc904ac][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_c3_right_edge].json index aeac8222289..163b844c723 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[549cc904ac][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_c3_right_edge].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[549cc904ac][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_c3_right_edge].json @@ -1160,7 +1160,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[54b0b509cd][OT2_X_v2_20_8_Overrides_InvalidConfigs_Override_eight_partial_column_no_end].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[54b0b509cd][OT2_X_v2_20_8_Overrides_InvalidConfigs_Override_eight_partial_column_no_end].json index c639bf70fc2..023e39e6787 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[54b0b509cd][OT2_X_v2_20_8_Overrides_InvalidConfigs_Override_eight_partial_column_no_end].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[54b0b509cd][OT2_X_v2_20_8_Overrides_InvalidConfigs_Override_eight_partial_column_no_end].json @@ -1160,7 +1160,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2312,7 +2325,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[54f717cfd1][OT2_S_v2_16_P300S_None_verifyNoFloatingPointErrorInPipetting].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[54f717cfd1][OT2_S_v2_16_P300S_None_verifyNoFloatingPointErrorInPipetting].json index 69e890d57fd..e22b94b1628 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[54f717cfd1][OT2_S_v2_16_P300S_None_verifyNoFloatingPointErrorInPipetting].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[54f717cfd1][OT2_S_v2_16_P300S_None_verifyNoFloatingPointErrorInPipetting].json @@ -1160,7 +1160,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "9", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout9", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1527,7 +1540,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "10", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout10", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[555b2fff00][Flex_S_v2_19_Illumina_DNA_Prep_48x].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[555b2fff00][Flex_S_v2_19_Illumina_DNA_Prep_48x].json index 22587a32c81..5a0df68535a 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[555b2fff00][Flex_S_v2_19_Illumina_DNA_Prep_48x].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[555b2fff00][Flex_S_v2_19_Illumina_DNA_Prep_48x].json @@ -1786,7 +1786,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2965,7 +2980,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3212,7 +3246,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4848,7 +4895,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6192,7 +6254,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7601,7 +7678,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -9773,7 +9865,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11068,7 +11206,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -15837,7 +15990,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -17475,7 +17674,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -18703,7 +18948,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -20044,7 +20304,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -21682,7 +21988,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -23064,7 +23416,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -24702,7 +25100,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -25930,7 +26374,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -28369,7 +28826,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -35717,7 +36220,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -39564,7 +40113,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -44526,7 +45088,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -45740,7 +46348,21 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterCovered", + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -45759,7 +46381,42 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "gripperWasteChute", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "A3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -45777,7 +46434,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "A3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "A3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -46658,7 +47359,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[59b00713a7][Flex_S_v2_18_ligseq].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[59b00713a7][Flex_S_v2_18_ligseq].json index 737dc286bb5..3c91316df19 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[59b00713a7][Flex_S_v2_18_ligseq].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[59b00713a7][Flex_S_v2_18_ligseq].json @@ -2126,7 +2126,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3410,7 +3425,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4629,7 +4657,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5787,7 +5828,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7077,7 +7133,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8235,7 +8306,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -9393,7 +9477,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -10551,7 +10650,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -13482,7 +13596,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14499,7 +14659,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16865,7 +17071,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -17180,7 +17432,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -17432,7 +17730,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -19708,7 +20052,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -20182,7 +20572,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -20511,7 +20947,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -20985,7 +21467,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -21314,7 +21842,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -21972,7 +22546,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -22287,7 +22907,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -22459,7 +23125,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[5c57add326][pl_Omega_HDQ_DNA_Bacteria_Flex_96_channel].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[5c57add326][pl_Omega_HDQ_DNA_Bacteria_Flex_96_channel].json index 026a1474062..5af0defc047 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[5c57add326][pl_Omega_HDQ_DNA_Bacteria_Flex_96_channel].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[5c57add326][pl_Omega_HDQ_DNA_Bacteria_Flex_96_channel].json @@ -532,7 +532,22 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1816,7 +1831,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3100,7 +3134,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6452,7 +6501,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7631,7 +7695,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8976,7 +9059,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -13716,7 +13812,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -16728,7 +16837,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -19740,7 +19862,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -22752,7 +22887,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -26277,7 +26427,20 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -27435,7 +27598,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "A1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -27504,7 +27684,20 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -28662,7 +28855,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -34471,7 +34681,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -34489,7 +34749,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -34521,7 +34835,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -41754,7 +42114,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -41963,7 +42373,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -42317,7 +42781,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -42526,7 +43040,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -42880,7 +43448,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -43089,7 +43707,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -43443,7 +44115,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -43652,7 +44374,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -45909,7 +46685,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[5e958b7c98][Flex_X_v2_16_P300MGen2_None_OT2PipetteInFlexProtocol].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[5e958b7c98][Flex_X_v2_16_P300MGen2_None_OT2PipetteInFlexProtocol].json index accbbbbda1e..a5056e60b04 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[5e958b7c98][Flex_X_v2_16_P300MGen2_None_OT2PipetteInFlexProtocol].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[5e958b7c98][Flex_X_v2_16_P300MGen2_None_OT2PipetteInFlexProtocol].json @@ -1161,7 +1161,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[5edb9b4de3][Flex_X_v2_20_96_and_8_Overrides_InvalidConfigs_Override_ninety_six_partial_column_2].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[5edb9b4de3][Flex_X_v2_20_96_and_8_Overrides_InvalidConfigs_Override_ninety_six_partial_column_2].json index 122bbadc03d..5cd7ebaedbb 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[5edb9b4de3][Flex_X_v2_20_96_and_8_Overrides_InvalidConfigs_Override_ninety_six_partial_column_2].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[5edb9b4de3][Flex_X_v2_20_96_and_8_Overrides_InvalidConfigs_Override_ninety_six_partial_column_2].json @@ -1166,7 +1166,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[604023f7f1][Flex_X_v2_16_NO_PIPETTES_TM_ModuleInStagingAreaCol3].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[604023f7f1][Flex_X_v2_16_NO_PIPETTES_TM_ModuleInStagingAreaCol3].json index ac1235fe4a1..9f8b487f01f 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[604023f7f1][Flex_X_v2_16_NO_PIPETTES_TM_ModuleInStagingAreaCol3].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[604023f7f1][Flex_X_v2_16_NO_PIPETTES_TM_ModuleInStagingAreaCol3].json @@ -101,7 +101,21 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot", + "stagingAreaSlotWithMagneticBlockV1" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6122c72996][Flex_X_v2_20_96_and_8_Overrides_InvalidConfigs_Override_ninety_six_partial_column_1].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6122c72996][Flex_X_v2_20_96_and_8_Overrides_InvalidConfigs_Override_ninety_six_partial_column_1].json index 341397530c7..d31aef09924 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6122c72996][Flex_X_v2_20_96_and_8_Overrides_InvalidConfigs_Override_ninety_six_partial_column_1].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6122c72996][Flex_X_v2_20_96_and_8_Overrides_InvalidConfigs_Override_ninety_six_partial_column_1].json @@ -1166,7 +1166,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[618f29898f][pl_Flex_customizable_serial_dilution_upload].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[618f29898f][pl_Flex_customizable_serial_dilution_upload].json index 1a2e4840a95..a3a57dd9c54 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[618f29898f][pl_Flex_customizable_serial_dilution_upload].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[618f29898f][pl_Flex_customizable_serial_dilution_upload].json @@ -254,7 +254,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1421,7 +1434,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "flexStackerModuleV1WithWasteChuteRightAdapterCovered", + "flexStackerModuleV1WithWasteChuteRightAdapterNoCover", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2579,7 +2609,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3737,7 +3780,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[63ea171b47][pl_M_N_Nucleomag_DNA_Flex_multi].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[63ea171b47][pl_M_N_Nucleomag_DNA_Flex_multi].json index 4b86c4eccdc..6be97baa775 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[63ea171b47][pl_M_N_Nucleomag_DNA_Flex_multi].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[63ea171b47][pl_M_N_Nucleomag_DNA_Flex_multi].json @@ -532,7 +532,22 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1816,7 +1831,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3454,7 +3488,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4633,7 +4682,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4789,7 +4857,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5036,7 +5119,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5283,7 +5379,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6442,7 +6551,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7601,7 +7723,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8760,7 +8895,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -12533,7 +12681,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13040,7 +13238,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13404,7 +13656,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13881,7 +14183,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14245,7 +14601,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14722,7 +15128,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15086,7 +15546,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15743,7 +16253,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15851,7 +16415,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[675d2c2562][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_south_east].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[675d2c2562][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_south_east].json index 77e2166f737..c734b8ee674 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[675d2c2562][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_south_east].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[675d2c2562][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_south_east].json @@ -1160,7 +1160,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1421,7 +1434,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "flexStackerModuleV1WithWasteChuteRightAdapterCovered", + "flexStackerModuleV1WithWasteChuteRightAdapterNoCover", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[68614da0b3][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_east].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[68614da0b3][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_east].json index df66e371d7b..d1bceb74c4d 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[68614da0b3][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_east].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[68614da0b3][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_east].json @@ -1160,7 +1160,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1421,7 +1434,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6c20d6c570][Flex_S_v2_20_96_None_COLUMN_HappyPath].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6c20d6c570][Flex_S_v2_20_96_None_COLUMN_HappyPath].json index e4961b84c9f..f1ef75b5ab0 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6c20d6c570][Flex_S_v2_20_96_None_COLUMN_HappyPath].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6c20d6c570][Flex_S_v2_20_96_None_COLUMN_HappyPath].json @@ -1167,7 +1167,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2379,7 +2392,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3554,7 +3580,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6e2f6f10c5][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_consolidate_destination_collision].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6e2f6f10c5][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_consolidate_destination_collision].json index e8590ac1760..5e46350d090 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6e2f6f10c5][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_consolidate_destination_collision].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6e2f6f10c5][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_consolidate_destination_collision].json @@ -1160,7 +1160,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1421,7 +1434,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2595,7 +2623,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3769,7 +3810,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "flexStackerModuleV1WithWasteChuteRightAdapterCovered", + "flexStackerModuleV1WithWasteChuteRightAdapterNoCover", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6e34343cfc][Flex_S_v2_15_P1000_96_GRIP_HS_MB_TM_MagMaxRNAExtraction].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6e34343cfc][Flex_S_v2_15_P1000_96_GRIP_HS_MB_TM_MagMaxRNAExtraction].json index 5bb400f3266..712538407b8 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6e34343cfc][Flex_S_v2_15_P1000_96_GRIP_HS_MB_TM_MagMaxRNAExtraction].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6e34343cfc][Flex_S_v2_15_P1000_96_GRIP_HS_MB_TM_MagMaxRNAExtraction].json @@ -1748,7 +1748,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3031,7 +3046,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4731,7 +4759,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2D3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6014,7 +6057,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7297,7 +7353,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8580,7 +8651,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -9758,7 +9844,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -10936,7 +11035,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -11005,7 +11117,20 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -12163,7 +12288,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "A1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -12232,7 +12374,20 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -13390,7 +13545,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -18348,7 +18520,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -18376,7 +18594,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -18435,7 +18697,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -18508,7 +18812,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -18758,7 +19108,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -19092,7 +19488,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -19342,7 +19784,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -19676,7 +20164,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -19926,7 +20460,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -23838,7 +24418,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -24088,7 +24714,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -24422,7 +25094,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -24672,7 +25390,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -25006,7 +25770,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -25256,7 +26066,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -26725,7 +27581,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -26975,7 +27877,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -27017,7 +27963,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -32823,7 +33811,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -32851,7 +33885,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -32910,7 +33988,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -32983,7 +34103,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -33233,7 +34399,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -33567,7 +34779,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -33817,7 +35075,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -34151,7 +35455,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -34401,7 +35751,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -38313,7 +39709,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -38563,7 +40005,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -38897,7 +40385,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -39147,7 +40681,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -39481,7 +41061,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -39731,7 +41357,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -41200,7 +42872,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -41450,7 +43168,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -41492,7 +43254,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -47298,7 +49102,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -47326,7 +49176,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -47385,7 +49279,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -47458,7 +49394,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -47708,7 +49690,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -48042,7 +50070,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -48292,7 +50366,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -48626,7 +50746,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -48876,7 +51042,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -52788,7 +55000,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -53038,7 +55296,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -53372,7 +55676,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -53622,7 +55972,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -53956,7 +56352,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -54206,7 +56648,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -55675,7 +58163,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -55925,7 +58459,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -55967,7 +58545,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6f246e1cd8][Flex_S_2_18_P1000M_P50M_GRIP_HS_TM_MB_TC_IlluminaDNAEnrichmentV4].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6f246e1cd8][Flex_S_2_18_P1000M_P50M_GRIP_HS_TM_MB_TC_IlluminaDNAEnrichmentV4].json index a6b46f54c00..0e0e92f5b42 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6f246e1cd8][Flex_S_2_18_P1000M_P50M_GRIP_HS_TM_MB_TC_IlluminaDNAEnrichmentV4].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6f246e1cd8][Flex_S_2_18_P1000M_P50M_GRIP_HS_TM_MB_TC_IlluminaDNAEnrichmentV4].json @@ -1650,7 +1650,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2933,7 +2948,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4566,7 +4594,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2D3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5785,7 +5828,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6943,7 +6999,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8233,7 +8304,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -9391,7 +9477,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -10549,7 +10648,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -11707,7 +11821,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -15569,7 +15696,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16829,7 +17002,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -17390,7 +17609,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -18534,7 +18799,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -19081,7 +19392,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -20225,7 +20582,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -20772,7 +21175,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -21916,7 +22365,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -22953,7 +23448,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -25385,7 +25926,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -25522,7 +26109,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -31993,7 +32626,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -35300,7 +35979,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -42210,7 +42935,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -44771,7 +45542,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6f84e60cb0][OT2_S_v2_16_P300M_P20S_HS_TC_TM_aspirateDispenseMix0Volume].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6f84e60cb0][OT2_S_v2_16_P300M_P20S_HS_TC_TM_aspirateDispenseMix0Volume].json index 03aae1235b6..d8cb851ea96 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6f84e60cb0][OT2_S_v2_16_P300M_P20S_HS_TC_TM_aspirateDispenseMix0Volume].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6f84e60cb0][OT2_S_v2_16_P300M_P20S_HS_TC_TM_aspirateDispenseMix0Volume].json @@ -1175,7 +1175,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "5", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout5", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2328,7 +2341,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout4", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2613,7 +2639,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[70b873c24b][pl_SamplePrep_MS_Digest_Flex_upto96].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[70b873c24b][pl_SamplePrep_MS_Digest_Flex_upto96].json index 9afcc19539c..234d7ab6d33 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[70b873c24b][pl_SamplePrep_MS_Digest_Flex_upto96].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[70b873c24b][pl_SamplePrep_MS_Digest_Flex_upto96].json @@ -1303,7 +1303,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2587,7 +2602,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "flexStackerModuleV1WithWasteChuteRightAdapterCovered", + "flexStackerModuleV1WithWasteChuteRightAdapterNoCover", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3746,7 +3778,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4905,7 +4952,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5908,7 +5970,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -13397,7 +13472,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -20886,7 +20974,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -28375,7 +28476,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[718c468b7d][Flex_X_v2_21_plate_reader_no_close_lid].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[718c468b7d][Flex_X_v2_21_plate_reader_no_close_lid].json index 3375ed2fadd..9b00fd40331 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[718c468b7d][Flex_X_v2_21_plate_reader_no_close_lid].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[718c468b7d][Flex_X_v2_21_plate_reader_no_close_lid].json @@ -1225,7 +1225,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2383,7 +2396,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[733c9cdf62][Flex_S_v2_20_8_None_PARTIAL_COLUMN_HappyPath].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[733c9cdf62][Flex_S_v2_20_8_None_PARTIAL_COLUMN_HappyPath].json index 0eabefc61c9..fb49ec33e02 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[733c9cdf62][Flex_S_v2_20_8_None_PARTIAL_COLUMN_HappyPath].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[733c9cdf62][Flex_S_v2_20_8_None_PARTIAL_COLUMN_HappyPath].json @@ -1283,7 +1283,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2497,7 +2512,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3672,7 +3700,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[7583faec7c][OT2_X_v2_20_8_Overrides_InvalidConfigs_Override_return_tip_error].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[7583faec7c][OT2_X_v2_20_8_Overrides_InvalidConfigs_Override_return_tip_error].json index be40cf92526..9165680a90a 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[7583faec7c][OT2_X_v2_20_8_Overrides_InvalidConfigs_Override_return_tip_error].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[7583faec7c][OT2_X_v2_20_8_Overrides_InvalidConfigs_Override_return_tip_error].json @@ -1160,7 +1160,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2312,7 +2325,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3525,7 +3551,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout4", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4699,7 +4738,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "5", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout5", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[770ebdcd29][pl_KAPA_Library_Quant_48_v8].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[770ebdcd29][pl_KAPA_Library_Quant_48_v8].json index 504f3f1a239..82599a9930a 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[770ebdcd29][pl_KAPA_Library_Quant_48_v8].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[770ebdcd29][pl_KAPA_Library_Quant_48_v8].json @@ -1340,7 +1340,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5689,7 +5704,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7313,7 +7341,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8491,7 +8534,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8738,7 +8800,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -9916,7 +9991,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -11094,7 +11182,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -12365,7 +12466,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "flexStackerModuleV1WithWasteChuteRightAdapterCovered", + "flexStackerModuleV1WithWasteChuteRightAdapterNoCover", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -14128,7 +14246,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -25965,7 +26098,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[79e61426a2][Flex_S_v2_18_AMPure_XP_48x].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[79e61426a2][Flex_S_v2_18_AMPure_XP_48x].json index 744032008ce..faa39e6f5ad 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[79e61426a2][Flex_S_v2_18_AMPure_XP_48x].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[79e61426a2][Flex_S_v2_18_AMPure_XP_48x].json @@ -1786,7 +1786,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2965,7 +2980,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3212,7 +3246,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3736,7 +3783,22 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5019,7 +5081,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6381,7 +6462,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8011,7 +8107,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -11233,7 +11344,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12156,7 +12317,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15405,7 +15620,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -19334,7 +19599,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -23759,7 +24039,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -24968,7 +25302,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -26196,7 +26580,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[7d16d5dbf0][Flex_X_v2_21_tc_lids_wrong_target].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[7d16d5dbf0][Flex_X_v2_21_tc_lids_wrong_target].json index c2da7c45698..cb98406075d 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[7d16d5dbf0][Flex_X_v2_21_tc_lids_wrong_target].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[7d16d5dbf0][Flex_X_v2_21_tc_lids_wrong_target].json @@ -534,7 +534,22 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1817,7 +1832,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1884,7 +1912,20 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1903,7 +1944,59 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "A1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -2061,7 +2154,24 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2219,7 +2329,28 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2377,7 +2508,32 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2535,7 +2691,36 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2693,7 +2878,40 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[7e7a90041b][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_west_column].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[7e7a90041b][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_west_column].json index 485e79b56ad..268b8174b2b 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[7e7a90041b][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_west_column].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[7e7a90041b][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_west_column].json @@ -1160,7 +1160,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1421,7 +1434,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[7ebefe4580][pl_QIAseq_FX_24x_Normalizer_Workflow_B].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[7ebefe4580][pl_QIAseq_FX_24x_Normalizer_Workflow_B].json index c567c61d095..f351bfa5b89 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[7ebefe4580][pl_QIAseq_FX_24x_Normalizer_Workflow_B].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[7ebefe4580][pl_QIAseq_FX_24x_Normalizer_Workflow_B].json @@ -560,7 +560,22 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1844,7 +1859,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3063,7 +3097,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "flexStackerModuleV1WithWasteChuteRightAdapterCovered", + "flexStackerModuleV1WithWasteChuteRightAdapterNoCover", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4687,7 +4738,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5866,7 +5932,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6113,7 +6198,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7271,7 +7369,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8566,7 +8679,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -9724,7 +9852,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -10882,7 +11023,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -12040,7 +12196,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -26920,7 +27089,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -34497,7 +34716,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -35238,7 +35511,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -36092,7 +36415,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -39622,7 +39999,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -47213,7 +47640,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -47954,7 +48435,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -52898,7 +53429,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -56954,7 +57539,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -64531,7 +65166,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -65272,7 +65961,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -67737,7 +68476,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -69153,7 +69946,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -70710,7 +71553,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -71316,7 +72213,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -74386,7 +75333,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -75127,7 +76128,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[84f684cbc4][Flex_S_v2_18_IDT_xGen_EZ_48x].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[84f684cbc4][Flex_S_v2_18_IDT_xGen_EZ_48x].json index b4e7172cb6c..df73a55de8a 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[84f684cbc4][Flex_S_v2_18_IDT_xGen_EZ_48x].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[84f684cbc4][Flex_S_v2_18_IDT_xGen_EZ_48x].json @@ -1341,7 +1341,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2965,7 +2980,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4144,7 +4174,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4391,7 +4440,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6131,7 +6193,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7601,7 +7678,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -15277,7 +15369,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -26457,7 +26564,53 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -30304,7 +30457,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -35848,7 +36016,53 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -36757,7 +36971,53 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -40170,7 +40430,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -43565,7 +43838,53 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -47018,7 +47337,53 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -51060,7 +51425,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -56508,7 +56886,53 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -57722,7 +58146,21 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterCovered", + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -57741,7 +58179,42 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "gripperWasteChute", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -57759,7 +58232,51 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -58640,7 +59157,53 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[8860ee702c][OT2_S_v2_14_P300M_P20S_HS_TC_TM_SmokeTestV3].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[8860ee702c][OT2_S_v2_14_P300M_P20S_HS_TC_TM_SmokeTestV3].json index 71d5d247e8d..3535475bea7 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[8860ee702c][OT2_S_v2_14_P300M_P20S_HS_TC_TM_SmokeTestV3].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[8860ee702c][OT2_S_v2_14_P300M_P20S_HS_TC_TM_SmokeTestV3].json @@ -1231,7 +1231,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "5", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout5", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2384,7 +2397,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout4", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4621,7 +4647,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "addressableAreaName": "9", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout9", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5785,7 +5828,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "addressableAreaName": "1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6959,7 +7019,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "addressableAreaName": "7", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout7", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7083,7 +7160,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "6", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout6", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8258,7 +8348,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8505,7 +8608,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[88abcfdbca][pl_Zymo_Quick_RNA_Cells_Flex_96_Channel].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[88abcfdbca][pl_Zymo_Quick_RNA_Cells_Flex_96_Channel].json index d929f2211bb..13c7f5d67ba 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[88abcfdbca][pl_Zymo_Quick_RNA_Cells_Flex_96_Channel].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[88abcfdbca][pl_Zymo_Quick_RNA_Cells_Flex_96_Channel].json @@ -532,7 +532,22 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1816,7 +1831,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3515,7 +3549,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4694,7 +4743,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7706,7 +7774,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -10718,7 +10799,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -15458,7 +15554,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -18470,7 +18579,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -21482,7 +21606,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -24389,7 +24526,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -27401,7 +27553,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -30926,7 +31091,20 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -32084,7 +32262,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "A1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -32153,7 +32348,20 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -33311,7 +33519,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -35742,7 +35967,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -35760,7 +36025,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -38041,7 +38348,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -38371,7 +38728,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -38597,7 +39008,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -38867,7 +39328,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -39093,7 +39608,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -39363,7 +39928,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -39589,7 +40208,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -39859,7 +40528,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -44712,7 +45435,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -45012,7 +45785,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -45238,7 +46065,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -45508,7 +46385,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -45734,7 +46665,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -46004,7 +46985,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -46230,7 +47265,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -46500,7 +47585,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -48758,7 +49897,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[88de2fb78f][OT2_X_v6_P20S_P300M_HS_HSCollision].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[88de2fb78f][OT2_X_v6_P20S_P300M_HS_HSCollision].json index 3e65e6d11ca..fe534adfd97 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[88de2fb78f][OT2_X_v6_P20S_P300M_HS_HSCollision].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[88de2fb78f][OT2_X_v6_P20S_P300M_HS_HSCollision].json @@ -1656,7 +1656,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2917,7 +2930,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "addressableAreaName": "1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4071,7 +4101,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout4", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5227,7 +5270,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "5", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout5", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[89a8226c4e][Flex_X_v2_16_P1000_96_TC_PartialTipPickupThermocyclerLidConflict].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[89a8226c4e][Flex_X_v2_16_P1000_96_TC_PartialTipPickupThermocyclerLidConflict].json index a8dc215c6e1..bf8feeaf64a 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[89a8226c4e][Flex_X_v2_16_P1000_96_TC_PartialTipPickupThermocyclerLidConflict].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[89a8226c4e][Flex_X_v2_16_P1000_96_TC_PartialTipPickupThermocyclerLidConflict].json @@ -1166,7 +1166,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2352,7 +2367,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3519,7 +3547,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4802,7 +4843,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[8a663305c4][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_south].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[8a663305c4][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_south].json index c90d4eae5e8..5da2003701a 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[8a663305c4][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_south].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[8a663305c4][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_south].json @@ -1160,7 +1160,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1421,7 +1434,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[8b07e799f6][Flex_X_v2_20_96_and_8_Overrides_InvalidConfigs_Override_drop_tip_with_location].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[8b07e799f6][Flex_X_v2_20_96_and_8_Overrides_InvalidConfigs_Override_drop_tip_with_location].json index 546aa74d915..f703eb3b420 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[8b07e799f6][Flex_X_v2_20_96_and_8_Overrides_InvalidConfigs_Override_drop_tip_with_location].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[8b07e799f6][Flex_X_v2_20_96_and_8_Overrides_InvalidConfigs_Override_drop_tip_with_location].json @@ -1166,7 +1166,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2379,7 +2392,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3553,7 +3579,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "flexStackerModuleV1WithWasteChuteRightAdapterCovered", + "flexStackerModuleV1WithWasteChuteRightAdapterNoCover", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[8e1f35ed6c][pl_NiNTA_Flex_96well_PlatePrep_final].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[8e1f35ed6c][pl_NiNTA_Flex_96well_PlatePrep_final].json index 23a738dea13..9da7b5f31ae 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[8e1f35ed6c][pl_NiNTA_Flex_96well_PlatePrep_final].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[8e1f35ed6c][pl_NiNTA_Flex_96well_PlatePrep_final].json @@ -1292,7 +1292,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2576,7 +2589,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3860,7 +3888,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3954,7 +3995,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4048,7 +4102,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4142,7 +4211,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4389,7 +4471,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4913,7 +5008,22 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6197,7 +6307,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7814,7 +7943,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[8fcfd2ced0][Flex_S_v2_16_P1000_96_TC_PartialTipPickupColumn].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[8fcfd2ced0][Flex_S_v2_16_P1000_96_TC_PartialTipPickupColumn].json index 69045761942..abd8fa243a2 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[8fcfd2ced0][Flex_S_v2_16_P1000_96_TC_PartialTipPickupColumn].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[8fcfd2ced0][Flex_S_v2_16_P1000_96_TC_PartialTipPickupColumn].json @@ -1166,7 +1166,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2352,7 +2367,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3519,7 +3547,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[918747b2f9][pl_Illumina_DNA_Prep_48x_v8].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[918747b2f9][pl_Illumina_DNA_Prep_48x_v8].json index 4e22ae14eb6..f68f07f294e 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[918747b2f9][pl_Illumina_DNA_Prep_48x_v8].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[918747b2f9][pl_Illumina_DNA_Prep_48x_v8].json @@ -1786,7 +1786,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2965,7 +2980,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3212,7 +3246,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4848,7 +4895,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6192,7 +6254,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7601,7 +7678,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -9773,7 +9865,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11068,7 +11206,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -15837,7 +15990,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -17475,7 +17674,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -18703,7 +18948,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -20044,7 +20304,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -21682,7 +21988,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -23064,7 +23416,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -24702,7 +25100,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -25930,7 +26374,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -28369,7 +28826,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -38201,7 +38704,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -42006,7 +42555,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -46926,7 +47488,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -48140,7 +48748,21 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterCovered", + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -48159,7 +48781,42 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "gripperWasteChute", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "A3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -48177,7 +48834,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "A3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "A3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -49262,7 +49963,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[93b724671e][OT2_X_v2_20_8_Overrides_InvalidConfigs_Override_eight_partial_column_bottom_right].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[93b724671e][OT2_X_v2_20_8_Overrides_InvalidConfigs_Override_eight_partial_column_bottom_right].json index 85f4f9f5ea7..8c1e2358762 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[93b724671e][OT2_X_v2_20_8_Overrides_InvalidConfigs_Override_eight_partial_column_bottom_right].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[93b724671e][OT2_X_v2_20_8_Overrides_InvalidConfigs_Override_eight_partial_column_bottom_right].json @@ -1160,7 +1160,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2312,7 +2325,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[95da6fbef2][Flex_S_2_15_P1000M_GRIP_HS_TM_MB_OmegaHDQDNAExtractionBacteria].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[95da6fbef2][Flex_S_2_15_P1000M_GRIP_HS_TM_MB_OmegaHDQDNAExtractionBacteria].json index 27170407315..ea91e0ddab0 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[95da6fbef2][Flex_S_2_15_P1000M_GRIP_HS_TM_MB_OmegaHDQDNAExtractionBacteria].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[95da6fbef2][Flex_S_2_15_P1000M_GRIP_HS_TM_MB_OmegaHDQDNAExtractionBacteria].json @@ -532,7 +532,22 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1816,7 +1831,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3100,7 +3134,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4724,7 +4773,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2D3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5903,7 +5967,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7248,7 +7331,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8532,7 +8628,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -9816,7 +9925,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -11100,7 +11222,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -12384,7 +12519,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -12453,7 +12603,20 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -13611,7 +13774,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "A1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -13680,7 +13860,20 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -14838,7 +15031,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -20647,7 +20857,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -20665,7 +20925,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -20697,7 +21011,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -27930,7 +28290,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -28139,7 +28549,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -28493,7 +28957,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -28672,7 +29186,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -29026,7 +29594,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -29205,7 +29823,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -29559,7 +30231,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -29738,7 +30460,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -31995,7 +32771,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[99c15c6c62][Flex_S_v2_21_tc_lids_happy_path].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[99c15c6c62][Flex_S_v2_21_tc_lids_happy_path].json index a33f00a85fa..b8498fb063f 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[99c15c6c62][Flex_S_v2_21_tc_lids_happy_path].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[99c15c6c62][Flex_S_v2_21_tc_lids_happy_path].json @@ -75,7 +75,20 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -233,7 +246,24 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -391,7 +421,28 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -549,7 +600,32 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1857,7 +1933,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1886,7 +1977,71 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -1914,7 +2069,54 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID", + "lidId": "UUID" + }, + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -1942,7 +2144,67 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -1970,7 +2232,62 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID", + "lidId": "UUID" + }, + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -1998,7 +2315,63 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -2026,7 +2399,70 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID", + "lidId": "UUID" + }, + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" } diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[9bcb0a3f13][pl_normalization_with_csv].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[9bcb0a3f13][pl_normalization_with_csv].json index ccab060d501..7541150b152 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[9bcb0a3f13][pl_normalization_with_csv].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[9bcb0a3f13][pl_normalization_with_csv].json @@ -1175,7 +1175,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1269,7 +1282,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2427,7 +2453,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3585,7 +3624,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4743,7 +4795,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5901,7 +5966,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[9e56ee92f6][Flex_X_v2_16_P1000_96_GRIP_DropLabwareIntoTrashBin].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[9e56ee92f6][Flex_X_v2_16_P1000_96_GRIP_DropLabwareIntoTrashBin].json index 6263cb86172..571fed66fba 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[9e56ee92f6][Flex_X_v2_16_P1000_96_GRIP_DropLabwareIntoTrashBin].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[9e56ee92f6][Flex_X_v2_16_P1000_96_GRIP_DropLabwareIntoTrashBin].json @@ -77,7 +77,20 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1235,7 +1248,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "A1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a01a35c14a][Flex_X_v2_16_NO_PIPETTES_TrashBinInStagingAreaCol3].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a01a35c14a][Flex_X_v2_16_NO_PIPETTES_TrashBinInStagingAreaCol3].json index ddc34e08100..586ddf8369b 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a01a35c14a][Flex_X_v2_16_NO_PIPETTES_TrashBinInStagingAreaCol3].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a01a35c14a][Flex_X_v2_16_NO_PIPETTES_TrashBinInStagingAreaCol3].json @@ -101,7 +101,21 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot", + "stagingAreaSlotWithMagneticBlockV1" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a08c261369][Flex_S_v2_16_P1000_96_GRIP_DeckConfiguration1NoModulesNoFixtures].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a08c261369][Flex_S_v2_16_P1000_96_GRIP_DeckConfiguration1NoModulesNoFixtures].json index c5cd979e87d..cb5cbe88578 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a08c261369][Flex_S_v2_16_P1000_96_GRIP_DeckConfiguration1NoModulesNoFixtures].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a08c261369][Flex_S_v2_16_P1000_96_GRIP_DeckConfiguration1NoModulesNoFixtures].json @@ -1182,7 +1182,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2356,7 +2369,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2425,7 +2451,22 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3583,7 +3624,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3652,7 +3712,20 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4810,7 +4883,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5966,7 +6056,13 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7122,7 +7218,13 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -9150,7 +9252,39 @@ "newLocation": "offDeck", "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -9166,7 +9300,37 @@ "newLocation": "offDeck", "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -9184,7 +9348,52 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -9202,7 +9411,48 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -9482,7 +9732,33 @@ "newLocation": "offDeck", "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -9498,7 +9774,33 @@ "newLocation": "offDeck", "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" } diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a0b755a1a1][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_north_west].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a0b755a1a1][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_north_west].json index 5113dbf3b85..6de88f47a44 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a0b755a1a1][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_north_west].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a0b755a1a1][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_north_west].json @@ -1160,7 +1160,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1421,7 +1434,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a0dad2eb8e][pl_SamplePrep_MS_Cleanup_Flex_upto96].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a0dad2eb8e][pl_SamplePrep_MS_Cleanup_Flex_upto96].json index a42786e59e3..9dc374a747d 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a0dad2eb8e][pl_SamplePrep_MS_Cleanup_Flex_upto96].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a0dad2eb8e][pl_SamplePrep_MS_Cleanup_Flex_upto96].json @@ -1303,7 +1303,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1827,7 +1842,22 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3111,7 +3141,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3205,7 +3254,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3299,7 +3361,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4644,7 +4719,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5823,7 +5913,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "flexStackerModuleV1WithWasteChuteRightAdapterCovered", + "flexStackerModuleV1WithWasteChuteRightAdapterNoCover", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6982,7 +7089,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8141,7 +8263,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -9300,7 +9435,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -10459,7 +10609,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -11618,7 +11781,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -19752,7 +19928,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "B4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "B4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -19770,7 +19988,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -30335,7 +30593,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -35887,7 +36195,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -39706,7 +40068,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -45258,7 +45670,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -47589,7 +48055,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a3dfca7f0c][Flex_S_v2_19_Illumina_DNA_PCR_Free].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a3dfca7f0c][Flex_S_v2_19_Illumina_DNA_PCR_Free].json index 6da5b62e4ec..157d5c524d9 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a3dfca7f0c][Flex_S_v2_19_Illumina_DNA_PCR_Free].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a3dfca7f0c][Flex_S_v2_19_Illumina_DNA_PCR_Free].json @@ -1693,7 +1693,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2872,7 +2887,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4212,7 +4246,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5848,7 +5897,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7145,7 +7209,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -10098,7 +10175,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -11599,7 +11689,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11736,7 +11872,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12665,7 +12847,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12713,7 +12941,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13959,7 +14233,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -14387,7 +14676,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14840,7 +15175,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15341,7 +15722,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16504,7 +16931,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16629,7 +17102,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16783,7 +17302,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16829,7 +17394,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16922,7 +17533,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -17392,7 +18049,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -17893,7 +18596,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -18423,7 +19172,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -20678,7 +21473,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -21956,7 +22797,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -22821,7 +23708,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -24414,7 +25347,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -25861,7 +26807,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -26551,7 +27543,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a437534569][Flex_S_v2_19_kapahyperplus].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a437534569][Flex_S_v2_19_kapahyperplus].json index 814c874d188..91a2192f6c9 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a437534569][Flex_S_v2_19_kapahyperplus].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a437534569][Flex_S_v2_19_kapahyperplus].json @@ -1693,7 +1693,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2872,7 +2887,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4212,7 +4246,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5391,7 +5440,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6570,7 +6632,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7853,7 +7928,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -10676,7 +10764,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -11679,7 +11780,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11772,7 +11917,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12788,7 +12975,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12895,7 +13126,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14818,7 +15091,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14925,7 +15242,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14985,7 +15344,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16143,7 +16548,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -18308,7 +18728,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -20171,7 +20635,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -21243,7 +21749,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -21622,7 +22172,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -21654,7 +22244,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -21686,7 +22318,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -23328,7 +24006,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -23534,7 +24256,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -23566,7 +24330,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -25744,7 +26554,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -27607,7 +28461,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -28679,7 +29575,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a46928c103][pl_Nanopore_Genomic_Ligation_v5_Final].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a46928c103][pl_Nanopore_Genomic_Ligation_v5_Final].json index 8faa3209168..ca7c7f6a268 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a46928c103][pl_Nanopore_Genomic_Ligation_v5_Final].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a46928c103][pl_Nanopore_Genomic_Ligation_v5_Final].json @@ -2126,7 +2126,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3410,7 +3425,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4629,7 +4657,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5787,7 +5828,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7077,7 +7133,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8235,7 +8306,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -9393,7 +9477,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -10551,7 +10650,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -13482,7 +13596,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14499,7 +14659,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16865,7 +17071,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -17180,7 +17432,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -17432,7 +17730,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -19708,7 +20052,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -20182,7 +20572,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -20511,7 +20947,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -20985,7 +21467,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -21314,7 +21842,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -21972,7 +22546,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -22287,7 +22907,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -22459,7 +23125,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a4d3b3a2d3][pl_96_ch_demo_rtp_with_hs].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a4d3b3a2d3][pl_96_ch_demo_rtp_with_hs].json index 0c84054c2ff..5479f430569 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a4d3b3a2d3][pl_96_ch_demo_rtp_with_hs].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a4d3b3a2d3][pl_96_ch_demo_rtp_with_hs].json @@ -532,7 +532,22 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "heaterShakerV1B1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -615,7 +630,20 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1773,7 +1801,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "A1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1842,7 +1887,20 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3000,7 +3058,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4158,7 +4233,21 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot", + "stagingAreaSlotWithMagneticBlockV1" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4227,7 +4316,20 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5511,7 +5613,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6795,7 +6910,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7974,7 +8104,21 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot", + "stagingAreaSlotWithMagneticBlockV1" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -9153,7 +9297,23 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot", + "stagingAreaSlotWithMagneticBlockV1", + "stagingAreaSlotWithWasteChuteRightAdapterCovered", + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -9248,7 +9408,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -9343,7 +9516,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -9590,7 +9776,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -10151,7 +10350,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1B1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1B1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -10258,7 +10509,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1B1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -10463,7 +10764,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -10497,7 +10840,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1B1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1B1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -10604,7 +11001,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1B1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -10809,7 +11256,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11071,7 +11564,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1B1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1B1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11178,7 +11723,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1B1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11383,7 +11978,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11417,7 +12054,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1B1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1B1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11524,7 +12215,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1B1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11729,7 +12470,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11775,7 +12562,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "B4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "B4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11793,7 +12620,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11811,7 +12678,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11829,7 +12736,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11847,7 +12794,55 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "A3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "A3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "A4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12109,7 +13104,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1B1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1B1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12216,7 +13263,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1B1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12408,7 +13505,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12442,7 +13581,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1B1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1B1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12549,7 +13740,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1B1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12741,7 +13982,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a5ba8297e3][Flex_X_v2_21_plate_reader_no_trash].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a5ba8297e3][Flex_X_v2_21_plate_reader_no_trash].json index f10341a2a2a..b1f9e0900f6 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a5ba8297e3][Flex_X_v2_21_plate_reader_no_trash].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a5ba8297e3][Flex_X_v2_21_plate_reader_no_trash].json @@ -1166,7 +1166,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2370,7 +2383,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2453,7 +2479,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "absorbanceReaderV1B3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "absorbanceReaderV1B3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" } diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a8528e52b4][Flex_S_v2_20_96_None_SINGLE_HappyPathSouthSide].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a8528e52b4][Flex_S_v2_20_96_None_SINGLE_HappyPathSouthSide].json index aa07f2c7074..53f9f55ce8b 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a8528e52b4][Flex_S_v2_20_96_None_SINGLE_HappyPathSouthSide].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a8528e52b4][Flex_S_v2_20_96_None_SINGLE_HappyPathSouthSide].json @@ -1167,7 +1167,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2379,7 +2392,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3554,7 +3580,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6468,7 +6507,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7643,7 +7695,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a8a5ad823d][pl_cherrypicking_flex_v3].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a8a5ad823d][pl_cherrypicking_flex_v3].json index 9be279fa95e..ebc92c0620b 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a8a5ad823d][pl_cherrypicking_flex_v3].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a8a5ad823d][pl_cherrypicking_flex_v3].json @@ -100,7 +100,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1274,7 +1287,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1520,7 +1546,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2803,7 +2842,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2897,7 +2949,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "flexStackerModuleV1WithWasteChuteRightAdapterCovered", + "flexStackerModuleV1WithWasteChuteRightAdapterNoCover", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4055,7 +4124,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5213,7 +5297,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6371,7 +6468,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7529,7 +7639,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8687,7 +8812,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -9845,7 +9983,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a94f22054f][Flex_S_v2_18_kapahyperplus].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a94f22054f][Flex_S_v2_18_kapahyperplus].json index 784df7d0aa1..a8c68685ea5 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a94f22054f][Flex_S_v2_18_kapahyperplus].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a94f22054f][Flex_S_v2_18_kapahyperplus].json @@ -1693,7 +1693,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2872,7 +2887,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4212,7 +4246,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5391,7 +5440,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6570,7 +6632,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7853,7 +7928,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -10676,7 +10764,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -11679,7 +11780,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11772,7 +11917,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12788,7 +12975,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12895,7 +13126,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14818,7 +15091,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14925,7 +15242,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14985,7 +15344,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16143,7 +16548,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -18308,7 +18728,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -20171,7 +20635,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -21243,7 +21749,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -21622,7 +22172,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -21654,7 +22244,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -21686,7 +22318,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -23328,7 +24006,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -23534,7 +24256,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -23566,7 +24330,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -25744,7 +26554,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -27607,7 +28461,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -28679,7 +29575,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[aa61eee0bf][pl_sigdx_part2].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[aa61eee0bf][pl_sigdx_part2].json index 6c5410c683b..74ae3462b1f 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[aa61eee0bf][pl_sigdx_part2].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[aa61eee0bf][pl_sigdx_part2].json @@ -1750,7 +1750,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3615,7 +3630,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4898,7 +4926,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6076,7 +6117,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7241,7 +7295,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8419,7 +8486,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -9577,7 +9661,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -10735,7 +10832,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -11893,7 +12003,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -13051,7 +13176,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -14209,7 +14349,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -15367,7 +15520,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -16525,7 +16691,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -17683,7 +17862,23 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot", + "stagingAreaSlotWithMagneticBlockV1", + "stagingAreaSlotWithWasteChuteRightAdapterCovered", + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -20998,7 +21193,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -21279,7 +21518,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -22585,7 +22866,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -22820,7 +23145,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -24126,7 +24493,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -24616,7 +25027,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -25964,7 +26417,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -26245,7 +26742,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -27565,7 +28108,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -27800,7 +28389,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -29120,7 +29755,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -29610,7 +30291,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -29690,7 +30413,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -31010,7 +31777,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -31245,7 +32058,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -32565,7 +33424,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -32800,7 +33705,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -34120,7 +35071,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -34610,7 +35607,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -40735,7 +41774,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -41713,7 +42796,40 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "gripperWasteChute", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "A3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -41731,7 +42847,40 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "gripperWasteChute", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -41749,7 +42898,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "A3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "A3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -41767,7 +42956,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -42257,7 +43486,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -43594,7 +44865,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[ac5a46e74b][pl_langone_pt2_ribo].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[ac5a46e74b][pl_langone_pt2_ribo].json index f4bafb81e72..aafe1a78b71 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[ac5a46e74b][pl_langone_pt2_ribo].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[ac5a46e74b][pl_langone_pt2_ribo].json @@ -1316,7 +1316,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2492,7 +2507,13 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3668,7 +3689,13 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5323,7 +5350,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2D3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6501,7 +6543,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7680,7 +7741,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -9481,7 +9555,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -9741,7 +9830,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -10899,7 +11001,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -12057,7 +12172,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -13215,7 +13343,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -14373,7 +14514,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -21671,7 +21827,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -22783,7 +22985,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -23860,7 +24108,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -23892,7 +24186,44 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -24118,7 +24449,35 @@ "newLocation": "offDeck", "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -27598,7 +27957,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -28646,7 +29051,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -29723,7 +30174,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -29755,7 +30252,44 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[ac886d7768][Flex_S_v2_15_P1000_96_GRIP_HS_MB_TC_TM_IDTXgen96Part1to3].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[ac886d7768][Flex_S_v2_15_P1000_96_GRIP_HS_MB_TC_TM_IDTXgen96Part1to3].json index b5cf2f13f52..2e70b878673 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[ac886d7768][Flex_S_v2_15_P1000_96_GRIP_HS_MB_TC_TM_IDTXgen96Part1to3].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[ac886d7768][Flex_S_v2_15_P1000_96_GRIP_HS_MB_TC_TM_IDTXgen96Part1to3].json @@ -1210,7 +1210,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2493,7 +2506,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3667,7 +3693,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "flexStackerModuleV1WithWasteChuteRightAdapterCovered", + "flexStackerModuleV1WithWasteChuteRightAdapterNoCover", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5011,7 +5054,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5080,7 +5136,22 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6238,7 +6309,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7412,7 +7502,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8695,7 +8798,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8764,7 +8880,22 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -9922,7 +10053,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -11205,7 +11355,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -12125,7 +12288,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12153,7 +12360,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12181,7 +12428,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "B1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "B1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13025,7 +13314,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[acefe91275][OT2_X_v2_20_8_Overrides_InvalidConfigs_Override_eight_partial_column_bottom_left].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[acefe91275][OT2_X_v2_20_8_Overrides_InvalidConfigs_Override_eight_partial_column_bottom_left].json index 752268901b8..fc388442310 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[acefe91275][OT2_X_v2_20_8_Overrides_InvalidConfigs_Override_eight_partial_column_bottom_left].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[acefe91275][OT2_X_v2_20_8_Overrides_InvalidConfigs_Override_eight_partial_column_bottom_left].json @@ -1160,7 +1160,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2312,7 +2325,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[ad627dcedf][OT2_S_v6_P300M_P20S_HS_Smoke620release].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[ad627dcedf][OT2_S_v6_P300M_P20S_HS_Smoke620release].json index da74d2b109e..7b509edf406 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[ad627dcedf][OT2_S_v6_P300M_P20S_HS_Smoke620release].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[ad627dcedf][OT2_S_v6_P300M_P20S_HS_Smoke620release].json @@ -1656,7 +1656,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2917,7 +2930,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "addressableAreaName": "1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3274,7 +3304,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "6", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout6", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4431,7 +4474,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "9", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout9", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4525,7 +4581,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "7", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout7", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5679,7 +5748,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "8", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout8", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[adc0621263][Flex_X_v2_16_P1000_96_TC_pipetteCollisionWithThermocyclerLid].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[adc0621263][Flex_X_v2_16_P1000_96_TC_pipetteCollisionWithThermocyclerLid].json index 2a342fcb3b8..440bed88a3f 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[adc0621263][Flex_X_v2_16_P1000_96_TC_pipetteCollisionWithThermocyclerLid].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[adc0621263][Flex_X_v2_16_P1000_96_TC_pipetteCollisionWithThermocyclerLid].json @@ -77,7 +77,22 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1235,7 +1250,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2393,7 +2427,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "flexStackerModuleV1WithWasteChuteRightAdapterCovered", + "flexStackerModuleV1WithWasteChuteRightAdapterNoCover", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3579,7 +3630,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4746,7 +4810,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6029,7 +6106,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[afd5d372a9][Flex_X_v2_20_96_and_8_Overrides_InvalidConfigs_Override_return_tip_error].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[afd5d372a9][Flex_X_v2_20_96_and_8_Overrides_InvalidConfigs_Override_return_tip_error].json index 6fe758b1dcf..0426ed34db3 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[afd5d372a9][Flex_X_v2_20_96_and_8_Overrides_InvalidConfigs_Override_return_tip_error].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[afd5d372a9][Flex_X_v2_20_96_and_8_Overrides_InvalidConfigs_Override_return_tip_error].json @@ -1166,7 +1166,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2379,7 +2392,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3553,7 +3579,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "flexStackerModuleV1WithWasteChuteRightAdapterCovered", + "flexStackerModuleV1WithWasteChuteRightAdapterNoCover", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[b0ce7dde5d][Flex_X_v2_16_P1000_96_TC_PartialTipPickupTryToReturnTip].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[b0ce7dde5d][Flex_X_v2_16_P1000_96_TC_PartialTipPickupTryToReturnTip].json index 9149f86b3eb..228a323b235 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[b0ce7dde5d][Flex_X_v2_16_P1000_96_TC_PartialTipPickupTryToReturnTip].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[b0ce7dde5d][Flex_X_v2_16_P1000_96_TC_PartialTipPickupTryToReturnTip].json @@ -1166,7 +1166,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2352,7 +2367,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3519,7 +3547,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[b48407ff98][pl_cherrypicking_csv_airgap].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[b48407ff98][pl_cherrypicking_csv_airgap].json index 96dab168388..1f72c507e73 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[b48407ff98][pl_cherrypicking_csv_airgap].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[b48407ff98][pl_cherrypicking_csv_airgap].json @@ -1187,7 +1187,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2366,7 +2379,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3545,7 +3571,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4724,7 +4763,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6362,7 +6414,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6454,7 +6521,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7612,7 +7694,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[b777168ac1][Flex_S_v2_19_Illumina_Stranded_total_RNA_Ribo_Zero].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[b777168ac1][Flex_S_v2_19_Illumina_Stranded_total_RNA_Ribo_Zero].json index 7fa95382fb8..1628f68f661 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[b777168ac1][Flex_S_v2_19_Illumina_Stranded_total_RNA_Ribo_Zero].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[b777168ac1][Flex_S_v2_19_Illumina_Stranded_total_RNA_Ribo_Zero].json @@ -1632,7 +1632,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2810,7 +2825,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4270,7 +4304,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[b79134ab8a][OT2_X_v2_20_8_Overrides_InvalidConfigs_Override_drop_tip_with_location].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[b79134ab8a][OT2_X_v2_20_8_Overrides_InvalidConfigs_Override_drop_tip_with_location].json index d55cf157f22..e3379a71c69 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[b79134ab8a][OT2_X_v2_20_8_Overrides_InvalidConfigs_Override_drop_tip_with_location].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[b79134ab8a][OT2_X_v2_20_8_Overrides_InvalidConfigs_Override_drop_tip_with_location].json @@ -1160,7 +1160,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2312,7 +2325,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3525,7 +3551,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout4", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4699,7 +4738,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "5", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout5", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[b91d31eaa2][pl_MagMax_RNA_Cells_Flex_96_Channel].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[b91d31eaa2][pl_MagMax_RNA_Cells_Flex_96_Channel].json index 9256b703b2c..820e2cb4a96 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[b91d31eaa2][pl_MagMax_RNA_Cells_Flex_96_Channel].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[b91d31eaa2][pl_MagMax_RNA_Cells_Flex_96_Channel].json @@ -532,7 +532,22 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1816,7 +1831,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5182,7 +5216,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6361,7 +6410,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7706,7 +7774,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -9021,7 +9104,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -12033,7 +12129,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -15045,7 +15156,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -18057,7 +18183,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -20964,7 +21103,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -23871,7 +24023,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -27396,7 +27561,20 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -28554,7 +28732,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "A1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -28623,7 +28818,20 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -29781,7 +29989,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -33356,7 +33581,49 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -33419,7 +33686,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -33719,7 +34036,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -34005,7 +34376,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -34245,7 +34666,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -34531,7 +35006,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -34771,7 +35296,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -37917,7 +38496,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -38217,7 +38846,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -38503,7 +39186,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -38743,7 +39476,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -39029,7 +39816,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -39269,7 +40106,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -39555,7 +40446,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -39795,7 +40736,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -40843,7 +41838,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[ba14bd77a8][Flex_X_v2_21_plate_reader_bad_slot].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[ba14bd77a8][Flex_X_v2_21_plate_reader_bad_slot].json index d9a486fcf9a..40e5899a456 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[ba14bd77a8][Flex_X_v2_21_plate_reader_bad_slot].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[ba14bd77a8][Flex_X_v2_21_plate_reader_bad_slot].json @@ -1166,7 +1166,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "flexStackerModuleV1WithWasteChuteRightAdapterCovered", + "flexStackerModuleV1WithWasteChuteRightAdapterNoCover", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2370,7 +2387,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[baf79d9b4a][Flex_S_v2_15_P1000S_None_SimpleNormalizeLongRight].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[baf79d9b4a][Flex_S_v2_15_P1000S_None_SimpleNormalizeLongRight].json index 6ca11baef34..04a98796703 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[baf79d9b4a][Flex_S_v2_15_P1000S_None_SimpleNormalizeLongRight].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[baf79d9b4a][Flex_S_v2_15_P1000S_None_SimpleNormalizeLongRight].json @@ -282,7 +282,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1456,7 +1469,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "flexStackerModuleV1WithWasteChuteRightAdapterCovered", + "flexStackerModuleV1WithWasteChuteRightAdapterNoCover", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2614,7 +2644,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3772,7 +3815,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4946,7 +5002,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6104,7 +6175,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7262,7 +7346,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8436,7 +8533,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -9594,7 +9706,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -10752,7 +10877,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[bc049301c1][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_transfer_destination_collision].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[bc049301c1][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_transfer_destination_collision].json index 588a958e032..6e5ef29bcb4 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[bc049301c1][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_transfer_destination_collision].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[bc049301c1][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_transfer_destination_collision].json @@ -1160,7 +1160,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1421,7 +1434,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2595,7 +2623,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3769,7 +3810,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "flexStackerModuleV1WithWasteChuteRightAdapterCovered", + "flexStackerModuleV1WithWasteChuteRightAdapterNoCover", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[c0435f08da][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_north].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[c0435f08da][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_north].json index 6caf8361175..4a3d59acab3 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[c0435f08da][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_north].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[c0435f08da][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_north].json @@ -1160,7 +1160,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1421,7 +1434,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[c064d0de2c][OT2_S_v6_P1000S_None_SimpleTransfer].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[c064d0de2c][OT2_S_v6_P1000S_None_SimpleTransfer].json index 3bca981777a..7a5e5ae0cb5 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[c064d0de2c][OT2_S_v6_P1000S_None_SimpleTransfer].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[c064d0de2c][OT2_S_v6_P1000S_None_SimpleTransfer].json @@ -1180,7 +1180,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1274,7 +1287,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "7", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout7", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1522,7 +1548,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "8", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout8", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1673,7 +1712,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[c343dfb5a0][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_bottom_right_edge].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[c343dfb5a0][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_bottom_right_edge].json index eeef20742b5..3d07c2879b6 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[c343dfb5a0][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_bottom_right_edge].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[c343dfb5a0][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_bottom_right_edge].json @@ -1160,7 +1160,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "flexStackerModuleV1WithWasteChuteRightAdapterCovered", + "flexStackerModuleV1WithWasteChuteRightAdapterNoCover", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[c745e5824a][Flex_S_v2_16_P1000_96_GRIP_DeckConfiguration1NoModules].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[c745e5824a][Flex_S_v2_16_P1000_96_GRIP_DeckConfiguration1NoModules].json index ee6ea8de744..6c94e826100 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[c745e5824a][Flex_S_v2_16_P1000_96_GRIP_DeckConfiguration1NoModules].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[c745e5824a][Flex_S_v2_16_P1000_96_GRIP_DeckConfiguration1NoModules].json @@ -1182,7 +1182,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2356,7 +2369,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2425,7 +2451,22 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3583,7 +3624,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3652,7 +3712,20 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4810,7 +4883,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5966,7 +6056,13 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7122,7 +7218,13 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8280,7 +8382,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -9438,7 +9553,21 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterCovered", + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -11491,7 +11620,44 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "gripperWasteChute", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11509,7 +11675,44 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "gripperWasteChute", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11527,7 +11730,55 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11545,7 +11796,55 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11850,7 +12149,44 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "gripperWasteChute", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11868,7 +12204,44 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "gripperWasteChute", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11886,7 +12259,48 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11904,7 +12318,48 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12208,7 +12663,40 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "gripperWasteChute", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12226,7 +12714,40 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "gripperWasteChute", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" } diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[c8d2ca0089][Flex_S_v2_18_QIASeq_FX_48x].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[c8d2ca0089][Flex_S_v2_18_QIASeq_FX_48x].json index c7cc6586b5d..c5950b63071 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[c8d2ca0089][Flex_S_v2_18_QIASeq_FX_48x].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[c8d2ca0089][Flex_S_v2_18_QIASeq_FX_48x].json @@ -1341,7 +1341,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2965,7 +2980,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4144,7 +4174,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4391,7 +4440,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6131,7 +6193,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7601,7 +7678,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -12120,7 +12212,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -19760,7 +19867,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -23511,7 +23664,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -28293,7 +28461,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -28998,7 +29212,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -29816,7 +30076,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -31086,7 +31392,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -34530,7 +34849,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -40035,7 +40400,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -43270,7 +43648,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -44484,7 +44908,21 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterCovered", + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -44503,7 +44941,42 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "gripperWasteChute", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -44521,7 +44994,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -45300,7 +45817,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -50214,7 +50777,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -51428,7 +52037,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -51447,7 +52069,42 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "gripperWasteChute", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -51465,7 +52122,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -55490,7 +56191,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -61037,7 +61784,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -61056,7 +61816,40 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "gripperWasteChute", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -61074,7 +61867,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -64350,7 +65183,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -65157,7 +66036,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[cb5adc3d23][OT2_S_v6_P20S_P300M_TransferReTransferLiquid].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[cb5adc3d23][OT2_S_v6_P20S_P300M_TransferReTransferLiquid].json index a2fa133144c..7e8db0b6191 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[cb5adc3d23][OT2_S_v6_P20S_P300M_TransferReTransferLiquid].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[cb5adc3d23][OT2_S_v6_P20S_P300M_TransferReTransferLiquid].json @@ -1196,7 +1196,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2350,7 +2363,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2610,7 +2636,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "10", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout10", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3767,7 +3806,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "8", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout8", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3993,7 +4045,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "6", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout6", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[cc26c104b4][Flex_S_v2_20_8_None_SINGLE_HappyPath].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[cc26c104b4][Flex_S_v2_20_8_None_SINGLE_HappyPath].json index 00720d8483b..12535a9fdec 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[cc26c104b4][Flex_S_v2_20_8_None_SINGLE_HappyPath].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[cc26c104b4][Flex_S_v2_20_8_None_SINGLE_HappyPath].json @@ -1167,7 +1167,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2495,7 +2510,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3670,7 +3698,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[cecd51c8ee][pl_ExpressPlex_96_final].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[cecd51c8ee][pl_ExpressPlex_96_final].json index e899cd56b74..5acabd2d71e 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[cecd51c8ee][pl_ExpressPlex_96_final].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[cecd51c8ee][pl_ExpressPlex_96_final].json @@ -1630,7 +1630,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "heaterShakerV1A1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2789,7 +2804,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3948,7 +3976,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5106,7 +5147,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "flexStackerModuleV1WithWasteChuteRightAdapterCovered", + "flexStackerModuleV1WithWasteChuteRightAdapterNoCover", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5175,7 +5233,20 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6333,7 +6404,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6402,7 +6490,20 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7560,7 +7661,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -13132,7 +13250,59 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13223,7 +13393,39 @@ "newLocation": "offDeck", "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d0154b1493][Flex_X_v2_20_96_and_8_Overrides_InvalidConfigs_Override_eight_partial_column_bottom_right].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d0154b1493][Flex_X_v2_20_96_and_8_Overrides_InvalidConfigs_Override_eight_partial_column_bottom_right].json index 376f1a9c3d3..f7d14fc8d98 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d0154b1493][Flex_X_v2_20_96_and_8_Overrides_InvalidConfigs_Override_eight_partial_column_bottom_right].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d0154b1493][Flex_X_v2_20_96_and_8_Overrides_InvalidConfigs_Override_eight_partial_column_bottom_right].json @@ -1166,7 +1166,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d14738bdfe][pl_Zymo_Magbead_DNA_Cells_Flex_multi].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d14738bdfe][pl_Zymo_Magbead_DNA_Cells_Flex_multi].json index c8f00ac080e..dc3ff326133 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d14738bdfe][pl_Zymo_Magbead_DNA_Cells_Flex_multi].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d14738bdfe][pl_Zymo_Magbead_DNA_Cells_Flex_multi].json @@ -532,7 +532,22 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1816,7 +1831,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3454,7 +3488,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4633,7 +4682,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4789,7 +4857,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5036,7 +5119,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5283,7 +5379,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6442,7 +6551,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7601,7 +7723,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8760,7 +8895,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -12776,7 +12924,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13256,7 +13454,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14148,7 +14400,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14628,7 +14930,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14945,7 +15301,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15395,7 +15801,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15712,7 +16172,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16162,7 +16672,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16479,7 +17043,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16929,7 +17543,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -17532,7 +18200,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d29d74d7fb][pl_QIASeq_FX_48x_v8].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d29d74d7fb][pl_QIASeq_FX_48x_v8].json index a9306a86942..b4bec996125 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d29d74d7fb][pl_QIASeq_FX_48x_v8].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d29d74d7fb][pl_QIASeq_FX_48x_v8].json @@ -1341,7 +1341,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2965,7 +2980,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4144,7 +4174,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4391,7 +4440,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6131,7 +6193,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7601,7 +7678,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -12120,7 +12212,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -19727,7 +19834,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -23436,7 +23589,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -28176,7 +28344,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -29289,7 +29503,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -30107,7 +30367,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -31377,7 +31683,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -34821,7 +35140,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -40284,7 +40649,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -43974,7 +44352,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -45188,7 +45612,21 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterCovered", + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -45207,7 +45645,42 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "gripperWasteChute", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -45225,7 +45698,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -46412,7 +46929,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -51326,7 +51889,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -55142,7 +55751,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -55161,7 +55783,42 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "gripperWasteChute", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -55179,7 +55836,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -56569,7 +57270,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -62900,7 +63647,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -62919,7 +63679,40 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "gripperWasteChute", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -62937,7 +63730,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -65345,7 +66178,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -66560,7 +67439,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -67788,7 +68713,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -67807,7 +68745,40 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "gripperWasteChute", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "A3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -67825,7 +68796,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "A3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "A3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "A4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d2c818bf00][Flex_S_v2_20_P50_LPD].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d2c818bf00][Flex_S_v2_20_P50_LPD].json index 28841e807c1..9ac317f03ef 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d2c818bf00][Flex_S_v2_20_P50_LPD].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d2c818bf00][Flex_S_v2_20_P50_LPD].json @@ -1166,7 +1166,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2324,7 +2337,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3502,7 +3528,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3595,7 +3636,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "flexStackerModuleV1WithWasteChuteRightAdapterCovered", + "flexStackerModuleV1WithWasteChuteRightAdapterNoCover", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3841,7 +3899,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d391213095][Flex_S_v2_15_P1000_96_GRIP_HS_TM_QuickZymoMagbeadRNAExtractionCellsOrBacteria].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d391213095][Flex_S_v2_15_P1000_96_GRIP_HS_TM_QuickZymoMagbeadRNAExtractionCellsOrBacteria].json index 426c94558c1..ca1019b01e2 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d391213095][Flex_S_v2_15_P1000_96_GRIP_HS_TM_QuickZymoMagbeadRNAExtractionCellsOrBacteria].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d391213095][Flex_S_v2_15_P1000_96_GRIP_HS_TM_QuickZymoMagbeadRNAExtractionCellsOrBacteria].json @@ -532,7 +532,22 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1816,7 +1831,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3440,7 +3474,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2D3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4619,7 +4668,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5964,7 +6032,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7248,7 +7329,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8532,7 +8626,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -9816,7 +9925,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -11100,7 +11222,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -12384,7 +12519,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -12453,7 +12603,20 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -13611,7 +13774,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "A1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -13680,7 +13860,20 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -14838,7 +15031,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -19314,7 +19524,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -19523,7 +19783,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -22133,7 +22447,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -22342,7 +22706,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -22664,7 +23082,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -22843,7 +23311,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -23165,7 +23687,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -23344,7 +23916,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -23666,7 +24292,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -23845,7 +24521,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -24167,7 +24897,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -24346,7 +25126,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -24916,7 +25750,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d3b28ea1d7][pl_Zymo_Magbead_DNA_Cells_Flex_96_channel].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d3b28ea1d7][pl_Zymo_Magbead_DNA_Cells_Flex_96_channel].json index 9214cce5922..ca64b177c47 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d3b28ea1d7][pl_Zymo_Magbead_DNA_Cells_Flex_96_channel].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d3b28ea1d7][pl_Zymo_Magbead_DNA_Cells_Flex_96_channel].json @@ -532,7 +532,22 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1816,7 +1831,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3440,7 +3474,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4619,7 +4668,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5964,7 +6032,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -10704,7 +10785,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -15444,7 +15538,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -18456,7 +18565,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -21468,7 +21590,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -24480,7 +24615,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -28005,7 +28155,20 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -29163,7 +29326,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "A1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -29232,7 +29412,20 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -30390,7 +30583,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -34866,7 +35076,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -35075,7 +35335,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -37685,7 +37999,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -37894,7 +38258,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -38216,7 +38634,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -38425,7 +38893,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -38747,7 +39269,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -38956,7 +39528,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -39278,7 +39904,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -39487,7 +40163,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -39809,7 +40539,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -40018,7 +40798,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -40588,7 +41422,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d48bc4f0c9][OT2_S_v2_17_P300M_P20S_HS_TC_TM_SmokeTestV3].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d48bc4f0c9][OT2_S_v2_17_P300M_P20S_HS_TC_TM_SmokeTestV3].json index c7cb1821806..f87dcd6b750 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d48bc4f0c9][OT2_S_v2_17_P300M_P20S_HS_TC_TM_SmokeTestV3].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d48bc4f0c9][OT2_S_v2_17_P300M_P20S_HS_TC_TM_SmokeTestV3].json @@ -1231,7 +1231,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "5", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout5", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2384,7 +2397,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout4", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4619,7 +4645,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "addressableAreaName": "9", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout9", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5794,7 +5837,28 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "addressableAreaName": "9", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout9", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6959,7 +7023,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "addressableAreaName": "1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8133,7 +8214,28 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "addressableAreaName": "1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -9307,7 +9409,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "addressableAreaName": "7", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout7", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -9431,7 +9550,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "6", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout6", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -10606,7 +10738,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -10853,7 +10998,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -11007,7 +11165,33 @@ "newLocation": "offDeck", "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11025,7 +11209,47 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11089,7 +11313,47 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11153,7 +11417,47 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "6", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout6", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11217,7 +11521,47 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "6", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout6", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "6", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout6", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11281,7 +11625,40 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d61739e6a3][Flex_S_v2_19_IDT_xGen_EZ_48x].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d61739e6a3][Flex_S_v2_19_IDT_xGen_EZ_48x].json index a8f00e1a0f1..4f014440404 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d61739e6a3][Flex_S_v2_19_IDT_xGen_EZ_48x].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d61739e6a3][Flex_S_v2_19_IDT_xGen_EZ_48x].json @@ -1341,7 +1341,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2965,7 +2980,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4144,7 +4174,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4391,7 +4440,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6131,7 +6193,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7601,7 +7678,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -15277,7 +15369,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -26457,7 +26564,53 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -30304,7 +30457,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -35848,7 +36016,53 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -36757,7 +36971,53 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -40170,7 +40430,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -43565,7 +43838,53 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -47018,7 +47337,53 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -51060,7 +51425,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -56508,7 +56886,53 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -57722,7 +58146,21 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterCovered", + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -57741,7 +58179,42 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "gripperWasteChute", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -57759,7 +58232,51 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -58640,7 +59157,53 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d6389183c0][pl_AMPure_XP_48x_v8].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d6389183c0][pl_AMPure_XP_48x_v8].json index a19d8ed0c76..e8a6d3a17e4 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d6389183c0][pl_AMPure_XP_48x_v8].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d6389183c0][pl_AMPure_XP_48x_v8].json @@ -1786,7 +1786,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2965,7 +2980,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3212,7 +3246,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3736,7 +3783,22 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5019,7 +5081,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6381,7 +6462,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8011,7 +8107,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -11233,7 +11344,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12156,7 +12317,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15405,7 +15620,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -19334,7 +19599,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -23759,7 +24039,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -24968,7 +25302,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -26196,7 +26580,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d8cb88b3b2][Flex_S_v2_16_P1000_96_TC_PartialTipPickupSingle].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d8cb88b3b2][Flex_S_v2_16_P1000_96_TC_PartialTipPickupSingle].json index 1587a2ce11d..f43a71b98ce 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d8cb88b3b2][Flex_S_v2_16_P1000_96_TC_PartialTipPickupSingle].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d8cb88b3b2][Flex_S_v2_16_P1000_96_TC_PartialTipPickupSingle].json @@ -1166,7 +1166,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2352,7 +2367,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3519,7 +3547,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d979799443][OT2_S_v2_20_8_None_SINGLE_HappyPath].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d979799443][OT2_S_v2_20_8_None_SINGLE_HappyPath].json index 30710e984f2..53978a0130c 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d979799443][OT2_S_v2_20_8_None_SINGLE_HappyPath].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d979799443][OT2_S_v2_20_8_None_SINGLE_HappyPath].json @@ -1161,7 +1161,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "8", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout8", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2373,7 +2386,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3548,7 +3574,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6462,7 +6501,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout4", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[da326082e1][pl_Hyperplus_tiptracking_V4_final].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[da326082e1][pl_Hyperplus_tiptracking_V4_final].json index b3678fd89b2..aa76a03a6d3 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[da326082e1][pl_Hyperplus_tiptracking_V4_final].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[da326082e1][pl_Hyperplus_tiptracking_V4_final].json @@ -1693,7 +1693,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2872,7 +2887,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4212,7 +4246,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5391,7 +5440,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6570,7 +6632,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7853,7 +7928,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -10676,7 +10764,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -11679,7 +11780,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11772,7 +11917,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12788,7 +12975,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12895,7 +13126,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14818,7 +15091,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14925,7 +15242,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14985,7 +15344,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16143,7 +16548,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -18308,7 +18728,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -20171,7 +20635,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -21243,7 +21749,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -21622,7 +22172,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -21654,7 +22244,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -21686,7 +22318,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -23328,7 +24006,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -23534,7 +24256,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -23566,7 +24330,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -25744,7 +26554,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -27607,7 +28461,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -28679,7 +29575,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[dabb7872d8][Flex_S_v2_19_P1000_96_GRIP_HS_MB_TC_TM_Smoke].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[dabb7872d8][Flex_S_v2_19_P1000_96_GRIP_HS_MB_TC_TM_Smoke].json index 775b6e2b658..13e013b8c95 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[dabb7872d8][Flex_S_v2_19_P1000_96_GRIP_HS_MB_TC_TM_Smoke].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[dabb7872d8][Flex_S_v2_19_P1000_96_GRIP_HS_MB_TC_TM_Smoke].json @@ -2296,7 +2296,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3461,7 +3476,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3554,7 +3584,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4728,7 +4771,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4797,7 +4853,20 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5955,7 +6024,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7113,7 +7199,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8271,7 +8372,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -10098,7 +10212,33 @@ "newLocation": "offDeck", "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -10372,7 +10512,37 @@ "newLocation": "offDeck", "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -10390,7 +10560,55 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11167,7 +11385,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11185,7 +11443,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11203,7 +11501,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11221,7 +11559,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11239,7 +11617,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11257,7 +11675,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11275,7 +11733,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11293,7 +11795,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11311,7 +11855,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11329,7 +11917,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11347,7 +11977,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11365,7 +12047,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11383,7 +12111,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11401,7 +12181,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11419,16 +12245,56 @@ }, "strategy": "usingGripper" }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "moveLabware", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "d371cbd83b68cbffb7be6e25c3b68254", + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "d371cbd83b68cbffb7be6e25c3b68254", "notes": [], "params": { "labwareId": "UUID", @@ -11437,7 +12303,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11455,7 +12361,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11473,7 +12419,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11491,7 +12481,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11509,7 +12541,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11527,7 +12603,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11545,7 +12663,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11563,7 +12733,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11581,7 +12797,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11599,7 +12867,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11617,7 +12931,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11635,7 +12989,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11653,7 +13047,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11671,7 +13105,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11689,7 +13167,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11707,7 +13227,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11725,7 +13289,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11743,7 +13349,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11761,7 +13419,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11779,7 +13483,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11797,7 +13553,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11815,7 +13617,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11833,7 +13679,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11851,7 +13743,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11869,7 +13807,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11887,7 +13879,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11905,7 +13947,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11923,7 +14019,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11941,7 +14087,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11959,7 +14151,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11977,7 +14215,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11995,7 +14279,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12013,7 +14351,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12031,7 +14419,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12049,7 +14491,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12067,7 +14559,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12085,7 +14631,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12103,7 +14699,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12121,7 +14771,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12139,7 +14839,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12157,7 +14911,65 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12175,7 +14987,65 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12193,7 +15063,65 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12211,7 +15139,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12229,7 +15207,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12247,7 +15279,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12265,7 +15347,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12283,7 +15419,65 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12301,7 +15495,65 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12319,7 +15571,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12591,7 +15889,47 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12607,7 +15945,33 @@ "newLocation": "offDeck", "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12702,6 +16066,19 @@ }, "result": { "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], "offsetId": "UUID" }, "startedAt": "TIMESTAMP", @@ -12767,7 +16144,47 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12829,6 +16246,19 @@ }, "result": { "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], "offsetId": "UUID" }, "startedAt": "TIMESTAMP", @@ -12895,7 +16325,46 @@ "strategy": "manualMoveWithPause" }, "result": { - "offsetId": "UUID" + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "offsetId": "UUID", + "originLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -12960,7 +16429,40 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13069,7 +16571,40 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "gripperWasteChute", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13087,7 +16622,40 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "gripperWasteChute", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" } diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[db1fae41ec][Flex_X_v2_20_96_and_8_Overrides_InvalidConfigs_Override_ninety_six_partial_column_3].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[db1fae41ec][Flex_X_v2_20_96_and_8_Overrides_InvalidConfigs_Override_ninety_six_partial_column_3].json index dd86269548a..843c95e83a9 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[db1fae41ec][Flex_X_v2_20_96_and_8_Overrides_InvalidConfigs_Override_ninety_six_partial_column_3].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[db1fae41ec][Flex_X_v2_20_96_and_8_Overrides_InvalidConfigs_Override_ninety_six_partial_column_3].json @@ -1166,7 +1166,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[e0b0133ffb][pl_Illumina_Stranded_total_RNA_Ribo_Zero_protocol].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[e0b0133ffb][pl_Illumina_Stranded_total_RNA_Ribo_Zero_protocol].json index 590ca209392..60d0e3eb9a7 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[e0b0133ffb][pl_Illumina_Stranded_total_RNA_Ribo_Zero_protocol].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[e0b0133ffb][pl_Illumina_Stranded_total_RNA_Ribo_Zero_protocol].json @@ -1632,7 +1632,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2810,7 +2825,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4270,7 +4304,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5421,7 +5468,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6572,7 +6632,21 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot", + "stagingAreaSlotWithMagneticBlockV1" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7751,7 +7825,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8930,7 +9017,21 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot", + "stagingAreaSlotWithMagneticBlockV1" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -10089,7 +10190,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -11248,7 +11362,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -12407,7 +12534,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -13566,7 +13706,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -14725,7 +14878,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -15884,7 +16050,21 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterCovered", + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -17005,7 +17185,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -20614,7 +20838,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -23384,7 +23650,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -24432,7 +24742,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -26096,7 +26448,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -26409,7 +26805,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -27369,7 +27807,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -30239,7 +30721,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -34734,7 +35258,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -35816,7 +36384,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -37825,7 +38435,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -38061,7 +38715,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[e18bdd6f5d][Flex_S_2_15_P1000M_P50M_GRIP_HS_TM_MB_TC_KAPALibraryQuantv4_8].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[e18bdd6f5d][Flex_S_2_15_P1000M_P50M_GRIP_HS_TM_MB_TC_KAPALibraryQuantv4_8].json index 9c502809377..0099997c526 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[e18bdd6f5d][Flex_S_2_15_P1000M_P50M_GRIP_HS_TM_MB_TC_KAPALibraryQuantv4_8].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[e18bdd6f5d][Flex_S_2_15_P1000M_P50M_GRIP_HS_TM_MB_TC_KAPALibraryQuantv4_8].json @@ -1658,7 +1658,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2836,7 +2851,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7185,7 +7219,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8809,7 +8856,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2D3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -9987,7 +10049,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -11226,7 +11307,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -11472,7 +11568,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -12630,7 +12739,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -13924,7 +14048,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -15082,7 +15221,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -16240,7 +16392,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -17398,7 +17565,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[e4b5b30b2e][Flex_S_v2_18_Illumina_DNA_PCR_Free].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[e4b5b30b2e][Flex_S_v2_18_Illumina_DNA_PCR_Free].json index 4459fe971fd..4c48c53013a 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[e4b5b30b2e][Flex_S_v2_18_Illumina_DNA_PCR_Free].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[e4b5b30b2e][Flex_S_v2_18_Illumina_DNA_PCR_Free].json @@ -1693,7 +1693,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2872,7 +2887,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4212,7 +4246,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5848,7 +5897,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7145,7 +7209,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -10098,7 +10175,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -11599,7 +11689,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11736,7 +11872,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12665,7 +12847,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12713,7 +12941,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13959,7 +14233,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -14387,7 +14676,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14840,7 +15175,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15341,7 +15722,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16504,7 +16931,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16629,7 +17102,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16783,7 +17302,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16829,7 +17394,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16922,7 +17533,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -17392,7 +18049,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -17893,7 +18596,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -18423,7 +19172,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -20678,7 +21473,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -21956,7 +22797,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -22821,7 +23708,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -24414,7 +25347,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -25861,7 +26807,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -26551,7 +27543,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[e71b031f47][pl_Illumina_DNA_PCR_Free].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[e71b031f47][pl_Illumina_DNA_PCR_Free].json index cffdb1bb54c..2205b00e18e 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[e71b031f47][pl_Illumina_DNA_PCR_Free].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[e71b031f47][pl_Illumina_DNA_PCR_Free].json @@ -1693,7 +1693,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2872,7 +2887,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4212,7 +4246,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5848,7 +5897,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7145,7 +7209,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -10098,7 +10175,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -11599,7 +11689,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11736,7 +11872,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12665,7 +12847,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12713,7 +12941,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13959,7 +14233,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -14387,7 +14676,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14840,7 +15175,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15341,7 +15722,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16504,7 +16931,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16629,7 +17102,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16783,7 +17302,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16829,7 +17394,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16922,7 +17533,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -17392,7 +18049,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -17893,7 +18596,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -18423,7 +19172,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -20678,7 +21473,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -21956,7 +22797,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -22821,7 +23708,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -24414,7 +25347,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -25861,7 +26807,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -26551,7 +27543,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1D2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[e84e23a4ea][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_top_edge].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[e84e23a4ea][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_top_edge].json index b7124e15878..3e8b86ef522 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[e84e23a4ea][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_top_edge].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[e84e23a4ea][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_top_edge].json @@ -1160,7 +1160,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[e8f451df45][Flex_S_v2_20_96_None_Column3_SINGLE_].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[e8f451df45][Flex_S_v2_20_96_None_Column3_SINGLE_].json index 44a1b40bdff..ada10205ceb 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[e8f451df45][Flex_S_v2_20_96_None_Column3_SINGLE_].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[e8f451df45][Flex_S_v2_20_96_None_Column3_SINGLE_].json @@ -1186,7 +1186,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2345,7 +2358,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3504,7 +3530,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4663,7 +4702,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5174,7 +5226,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "A3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "A3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -5192,7 +5288,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16172,7 +16312,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "B1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "B1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "A3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16190,7 +16372,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -17858,7 +18082,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -17876,7 +18144,55 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "flexStackerModuleV1WithWasteChuteRightAdapterCovered", + "flexStackerModuleV1WithWasteChuteRightAdapterNoCover", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "flexStackerModuleV1WithWasteChuteRightAdapterCovered", + "flexStackerModuleV1WithWasteChuteRightAdapterNoCover", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[ed26635ff7][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_consolidate_source_collision].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[ed26635ff7][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_consolidate_source_collision].json index 5b9053fbea9..268ad43202b 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[ed26635ff7][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_consolidate_source_collision].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[ed26635ff7][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_consolidate_source_collision].json @@ -1160,7 +1160,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1421,7 +1434,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2595,7 +2621,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3769,7 +3808,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "flexStackerModuleV1WithWasteChuteRightAdapterCovered", + "flexStackerModuleV1WithWasteChuteRightAdapterNoCover", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[ed2f3800b6][Flex_S_2_18_P1000M_P50M_GRIP_HS_TM_MB_TC_IlluminaDNAPrep24xV4_7].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[ed2f3800b6][Flex_S_2_18_P1000M_P50M_GRIP_HS_TM_MB_TC_IlluminaDNAPrep24xV4_7].json index 0dbe3c3fa57..cb2ecd6b18b 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[ed2f3800b6][Flex_S_2_18_P1000M_P50M_GRIP_HS_TM_MB_TC_IlluminaDNAPrep24xV4_7].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[ed2f3800b6][Flex_S_2_18_P1000M_P50M_GRIP_HS_TM_MB_TC_IlluminaDNAPrep24xV4_7].json @@ -1644,7 +1644,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2822,7 +2837,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3068,7 +3102,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4692,7 +4739,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2D3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5870,7 +5932,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7089,7 +7170,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8247,7 +8341,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -9521,7 +9630,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -10679,7 +10801,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -11837,7 +11974,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -14226,7 +14376,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -17207,7 +17407,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -18470,7 +18716,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -19873,7 +20173,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -21017,7 +21367,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -22420,7 +22824,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -23564,7 +24018,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -24967,7 +25475,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -26543,7 +27101,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -29242,7 +29854,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -30746,7 +31408,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -33354,7 +34070,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -39576,7 +40342,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -40143,7 +40963,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f0efddcd7d][Flex_X_v2_16_P1000_96_DropTipsWithNoTrash].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f0efddcd7d][Flex_X_v2_16_P1000_96_DropTipsWithNoTrash].json index f7d8523d4ed..0019ea1ab96 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f0efddcd7d][Flex_X_v2_16_P1000_96_DropTipsWithNoTrash].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f0efddcd7d][Flex_X_v2_16_P1000_96_DropTipsWithNoTrash].json @@ -101,7 +101,21 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot", + "stagingAreaSlotWithMagneticBlockV1" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -170,7 +184,24 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "flexStackerModuleV1WithWasteChuteRightAdapterCovered", + "flexStackerModuleV1WithWasteChuteRightAdapterNoCover", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1328,7 +1359,28 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "D3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "flexStackerModuleV1WithWasteChuteRightAdapterCovered", + "flexStackerModuleV1WithWasteChuteRightAdapterNoCover", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f24bb0b4d9][Flex_S_v2_15_P1000_96_GRIP_HS_MB_TC_TM_IlluminaDNAPrep96PART3].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f24bb0b4d9][Flex_S_v2_15_P1000_96_GRIP_HS_MB_TC_TM_IlluminaDNAPrep96PART3].json index 1c7b1c8237d..168cf5bb864 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f24bb0b4d9][Flex_S_v2_15_P1000_96_GRIP_HS_MB_TC_TM_IlluminaDNAPrep96PART3].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f24bb0b4d9][Flex_S_v2_15_P1000_96_GRIP_HS_MB_TC_TM_IlluminaDNAPrep96PART3].json @@ -1653,7 +1653,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1722,7 +1737,20 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2880,7 +2908,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4513,7 +4558,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2D3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5857,7 +5917,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7140,7 +7213,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8430,7 +8518,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8499,7 +8602,20 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -9657,7 +9773,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -10940,7 +11073,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -12223,7 +12371,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -13352,7 +13513,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "heaterShakerV1D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14921,7 +15128,13 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -16077,7 +16290,13 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -16094,7 +16313,37 @@ "newLocation": "offDeck", "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16110,7 +16359,37 @@ "newLocation": "offDeck", "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16128,7 +16407,48 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -16146,7 +16466,48 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f301704f56][OT2_S_v6_P300M_P300S_HS_HS_NormalUseWithTransfer].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f301704f56][OT2_S_v6_P300M_P300S_HS_HS_NormalUseWithTransfer].json index 3e8b4c50dea..2b99e53d290 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f301704f56][OT2_S_v6_P300M_P300S_HS_HS_NormalUseWithTransfer].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f301704f56][OT2_S_v6_P300M_P300S_HS_HS_NormalUseWithTransfer].json @@ -1656,7 +1656,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2917,7 +2930,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "addressableAreaName": "1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3274,7 +3304,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "6", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout6", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4431,7 +4474,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "9", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout9", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4525,7 +4581,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "7", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout7", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f51172f73b][Flex_S_v2_16_P1000_96_GRIP_HS_MB_TC_TM_Smoke].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f51172f73b][Flex_S_v2_16_P1000_96_GRIP_HS_MB_TC_TM_Smoke].json index f7c55d75c85..d3bf92c892b 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f51172f73b][Flex_S_v2_16_P1000_96_GRIP_HS_MB_TC_TM_Smoke].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f51172f73b][Flex_S_v2_16_P1000_96_GRIP_HS_MB_TC_TM_Smoke].json @@ -2296,7 +2296,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3461,7 +3476,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3554,7 +3584,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4728,7 +4771,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4797,7 +4853,20 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5955,7 +6024,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7113,7 +7199,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8271,7 +8372,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -10073,7 +10187,42 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "gripperWasteChute", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1WithWasteChuteRightAdapterNoCover", + "stagingAreaSlotWithWasteChuteRightAdapterNoCover", + "wasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -10869,7 +11018,37 @@ "newLocation": "offDeck", "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -10887,7 +11066,55 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11386,7 +11613,37 @@ "newLocation": "offDeck", "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11404,7 +11661,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11422,7 +11719,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11440,7 +11777,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11458,7 +11835,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11476,7 +11893,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11494,7 +11951,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11512,7 +12009,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11530,7 +12067,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11548,7 +12125,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11566,7 +12183,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11584,7 +12241,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11602,7 +12299,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11620,7 +12357,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11638,7 +12415,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11656,11 +12473,51 @@ }, "strategy": "usingGripper" }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { "commandType": "moveLabware", "completedAt": "TIMESTAMP", "createdAt": "TIMESTAMP", @@ -11674,7 +12531,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11692,7 +12593,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11710,7 +12653,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11728,7 +12723,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11746,7 +12787,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11764,7 +12857,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11782,7 +12921,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11800,7 +12983,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11818,7 +13043,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11836,7 +13105,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11854,7 +13177,65 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11872,7 +13253,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11890,7 +13321,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11908,7 +13381,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11926,7 +13439,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11944,7 +13497,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11962,7 +13555,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11980,7 +13613,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -11998,7 +13671,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12016,7 +13729,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12034,7 +13787,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12052,7 +13845,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12070,7 +13903,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12088,7 +13961,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12106,7 +14019,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12124,7 +14077,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12142,7 +14135,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12160,7 +14193,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12178,7 +14251,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12196,7 +14313,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12214,7 +14373,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12232,7 +14443,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12250,7 +14507,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12268,7 +14577,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12286,7 +14641,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12304,7 +14703,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12322,7 +14763,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12340,7 +14825,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12358,7 +14897,65 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12376,12 +14973,62 @@ }, "strategy": "usingGripper" }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "moveLabware", + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "moveLabware", "completedAt": "TIMESTAMP", "createdAt": "TIMESTAMP", "id": "UUID", @@ -12394,7 +15041,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12412,7 +15101,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12430,7 +15159,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12448,7 +15217,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12466,7 +15275,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12484,7 +15333,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12502,7 +15391,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12520,7 +15449,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12538,7 +15507,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12556,7 +15565,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12574,7 +15623,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12592,7 +15681,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12610,7 +15739,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12628,7 +15797,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12646,7 +15855,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12664,7 +15913,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12682,7 +15971,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12700,7 +16029,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12718,7 +16091,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12736,17 +16151,69 @@ }, "strategy": "usingGripper" }, - "result": {}, - "startedAt": "TIMESTAMP", - "status": "succeeded" - }, - { - "commandType": "moveLabware", - "completedAt": "TIMESTAMP", - "createdAt": "TIMESTAMP", - "id": "UUID", - "key": "1019dd8c9734cfc1a86aee1116797130", - "notes": [], + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, + "startedAt": "TIMESTAMP", + "status": "succeeded" + }, + { + "commandType": "moveLabware", + "completedAt": "TIMESTAMP", + "createdAt": "TIMESTAMP", + "id": "UUID", + "key": "1019dd8c9734cfc1a86aee1116797130", + "notes": [], "params": { "labwareId": "UUID", "newLocation": { @@ -12754,7 +16221,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12772,7 +16285,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12790,7 +16355,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12808,7 +16419,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12826,7 +16481,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12844,7 +16541,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12862,7 +16603,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12880,7 +16675,65 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12898,7 +16751,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12916,7 +16819,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12934,7 +16879,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12952,7 +16941,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12970,7 +17001,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -12988,7 +17063,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13006,7 +17123,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13024,7 +17185,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13042,7 +17245,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13060,7 +17303,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13078,7 +17365,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13096,7 +17425,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13114,7 +17487,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13132,7 +17547,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13150,7 +17609,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13168,7 +17669,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13186,7 +17731,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13204,7 +17791,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13222,7 +17853,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13240,7 +17913,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13258,7 +17971,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13276,7 +18033,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13294,7 +18097,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13312,7 +18161,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13330,7 +18233,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13348,7 +18301,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13366,7 +18373,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13384,7 +18441,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13402,7 +18505,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13420,7 +18577,65 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13438,7 +18653,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13456,7 +18721,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13474,7 +18785,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13492,7 +18845,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13510,7 +18907,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13528,7 +18967,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13546,7 +19029,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13564,7 +19089,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13582,7 +19147,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13600,7 +19209,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13618,7 +19269,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13636,7 +19331,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13654,7 +19391,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13672,7 +19453,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13690,7 +19513,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13708,7 +19575,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13726,7 +19635,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13744,7 +19697,49 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13762,7 +19757,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13780,7 +19815,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13798,7 +19877,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13816,7 +19941,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13834,7 +20005,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13852,7 +20077,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13870,7 +20145,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13888,7 +20217,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13906,7 +20285,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13924,7 +20349,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13942,7 +20421,65 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13960,7 +20497,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13978,7 +20565,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13996,7 +20637,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14014,7 +20701,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14032,7 +20771,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14050,7 +20835,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14068,7 +20905,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14086,7 +20969,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14104,7 +21027,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14122,7 +21097,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14140,7 +21161,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14158,7 +21231,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14176,7 +21295,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14194,7 +21365,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14212,7 +21429,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14230,7 +21499,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14248,7 +21563,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14266,7 +21633,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14284,7 +21697,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14302,7 +21755,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14320,7 +21825,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14338,7 +21893,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14356,7 +21965,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14374,7 +22033,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14392,7 +22105,65 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14410,7 +22181,65 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14428,7 +22257,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14446,7 +22325,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14464,7 +22389,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14482,7 +22461,65 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14500,7 +22537,65 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14518,7 +22613,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14536,7 +22677,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14554,7 +22747,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14572,7 +22811,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14590,7 +22881,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14608,7 +22945,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14626,7 +23003,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14644,7 +23073,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14662,7 +23137,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14680,7 +23207,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14698,7 +23271,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14716,7 +23341,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14734,7 +23405,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14752,7 +23475,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14770,7 +23539,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14788,7 +23609,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14806,7 +23673,47 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14824,7 +23731,59 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14842,7 +23801,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14860,7 +23869,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14878,7 +23941,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14896,7 +24009,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14914,7 +24081,65 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14932,7 +24157,65 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14950,7 +24233,57 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14968,7 +24301,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14986,7 +24365,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1C1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15004,7 +24437,65 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2D1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -15307,7 +24798,47 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" } diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f5f3b9c5bb][Flex_X_v2_16_P1000_96_TM_ModuleAndWasteChuteConflict].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f5f3b9c5bb][Flex_X_v2_16_P1000_96_TM_ModuleAndWasteChuteConflict].json index 48d7508e005..b8baa3c92d1 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f5f3b9c5bb][Flex_X_v2_16_P1000_96_TM_ModuleAndWasteChuteConflict].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f5f3b9c5bb][Flex_X_v2_16_P1000_96_TM_ModuleAndWasteChuteConflict].json @@ -77,7 +77,20 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1235,7 +1248,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "A1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f6c1ddbb32][pl_ExpressPlex_Pooling_Final].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f6c1ddbb32][pl_ExpressPlex_Pooling_Final].json index 6ca5fe984f2..31f814e366e 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f6c1ddbb32][pl_ExpressPlex_Pooling_Final].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f6c1ddbb32][pl_ExpressPlex_Pooling_Final].json @@ -1630,7 +1630,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "heaterShakerV1A1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2788,7 +2803,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3155,7 +3183,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4334,7 +4375,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "heaterShakerV1A1", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5514,7 +5574,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6672,7 +6745,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7852,7 +7938,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -9010,7 +9109,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -10190,7 +10302,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "flexStackerModuleV1WithWasteChuteRightAdapterCovered", + "flexStackerModuleV1WithWasteChuteRightAdapterNoCover", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -11348,7 +11477,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -12528,7 +12672,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -13686,7 +13843,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f7085d7134][Flex_X_v2_16_P1000_96_TC_pipetteCollisionWithThermocyclerLidClips].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f7085d7134][Flex_X_v2_16_P1000_96_TC_pipetteCollisionWithThermocyclerLidClips].json index 81a870ec2c9..24f8a0c0ec0 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f7085d7134][Flex_X_v2_16_P1000_96_TC_pipetteCollisionWithThermocyclerLidClips].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f7085d7134][Flex_X_v2_16_P1000_96_TC_pipetteCollisionWithThermocyclerLidClips].json @@ -1282,7 +1282,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "A2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f834b97da1][Flex_S_v2_16_P1000_96_GRIP_HS_MB_TC_TM_DeckConfiguration1].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f834b97da1][Flex_S_v2_16_P1000_96_GRIP_HS_MB_TC_TM_DeckConfiguration1].json index 6d3153af4eb..6731bd374ab 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f834b97da1][Flex_S_v2_16_P1000_96_GRIP_HS_MB_TC_TM_DeckConfiguration1].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f834b97da1][Flex_S_v2_16_P1000_96_GRIP_HS_MB_TC_TM_DeckConfiguration1].json @@ -1809,7 +1809,22 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "temperatureModuleV2B3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2983,7 +2998,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4157,7 +4185,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -4226,7 +4267,22 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5384,7 +5440,26 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -5453,7 +5528,20 @@ "version": 1, "wells": {} }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -6611,7 +6699,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -7767,7 +7872,13 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -8923,7 +9034,13 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -10081,7 +10198,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -11239,7 +11369,21 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterCovered", + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -13292,7 +13436,44 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "gripperWasteChute", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13310,7 +13491,44 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "gripperWasteChute", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13328,7 +13546,55 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13346,7 +13612,55 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "D4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13651,7 +13965,44 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "gripperWasteChute", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13669,7 +14020,44 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "gripperWasteChute", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13687,7 +14075,48 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "C3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaRightSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -13705,7 +14134,48 @@ }, "strategy": "manualMoveWithPause" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ], + "originLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14023,7 +14493,51 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14041,7 +14555,53 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "thermocyclerModuleV2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14059,7 +14619,61 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2B3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "immediateDestinationLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2B3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "magneticBlockV1A2", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutA2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14077,7 +14691,40 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "gripperWasteChute", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" }, @@ -14095,7 +14742,46 @@ }, "strategy": "usingGripper" }, - "result": {}, + "result": { + "eventualDestinationLocationSequence": [ + { + "kind": "notOnDeck", + "logicalLocationName": "offDeck" + } + ], + "immediateDestinationLocationSequence": [ + { + "addressableAreaName": "gripperWasteChute", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "stagingAreaSlotWithWasteChuteRightAdapterNoCover" + ] + } + ], + "originLocationSequence": [ + { + "kind": "onLabware", + "labwareId": "UUID" + }, + { + "addressableAreaName": "temperatureModuleV2B3", + "kind": "onAddressableArea" + }, + { + "kind": "onModule", + "moduleId": "UUID" + }, + { + "cutoutId": "cutoutB3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [] + } + ] + }, "startedAt": "TIMESTAMP", "status": "succeeded" } diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f86713b4d4][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_distribute_source_collision].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f86713b4d4][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_distribute_source_collision].json index 044d6d802f4..bbcfd21f11e 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f86713b4d4][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_distribute_source_collision].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f86713b4d4][Flex_X_v2_20_96_None_Overrides_TooTallLabware_Override_distribute_source_collision].json @@ -1160,7 +1160,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "B2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutB2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1421,7 +1434,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C1", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC1", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleLeftSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2595,7 +2621,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -3769,7 +3808,24 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "flexStackerModuleV1", + "flexStackerModuleV1WithWasteChuteRightAdapterCovered", + "flexStackerModuleV1WithWasteChuteRightAdapterNoCover", + "singleRightSlot", + "stagingAreaRightSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[fc60ef9cbd][OT2_S_v2_16_P300M_P20S_HS_TC_TM_dispense_changes].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[fc60ef9cbd][OT2_S_v2_16_P300M_P20S_HS_TC_TM_dispense_changes].json index da344f2c829..80c34323cea 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[fc60ef9cbd][OT2_S_v2_16_P300M_P20S_HS_TC_TM_dispense_changes].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[fc60ef9cbd][OT2_S_v2_16_P300M_P20S_HS_TC_TM_dispense_changes].json @@ -1231,7 +1231,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "5", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout5", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2384,7 +2397,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "4", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout4", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2668,7 +2694,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "3", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout3", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -2914,7 +2953,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutout2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleStandardSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[fd26a20b4c][Flex_X_v2_21_plate_reader_wrong_plate].json b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[fd26a20b4c][Flex_X_v2_21_plate_reader_wrong_plate].json index 39c5598de8b..dd0f19a0b42 100644 --- a/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[fd26a20b4c][Flex_X_v2_21_plate_reader_wrong_plate].json +++ b/analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[fd26a20b4c][Flex_X_v2_21_plate_reader_wrong_plate].json @@ -1166,7 +1166,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "D2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutD2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" @@ -1427,7 +1440,20 @@ } } }, - "labwareId": "UUID" + "labwareId": "UUID", + "locationSequence": [ + { + "addressableAreaName": "C2", + "kind": "onAddressableArea" + }, + { + "cutoutId": "cutoutC2", + "kind": "onCutoutFixture", + "possibleCutoutFixtureIds": [ + "singleCenterSlot" + ] + } + ] }, "startedAt": "TIMESTAMP", "status": "succeeded" diff --git a/analyses-snapshot-testing/tests/custom_json_snapshot_extension.py b/analyses-snapshot-testing/tests/custom_json_snapshot_extension.py index bf7004e1ae4..3c0e00d5eb6 100644 --- a/analyses-snapshot-testing/tests/custom_json_snapshot_extension.py +++ b/analyses-snapshot-testing/tests/custom_json_snapshot_extension.py @@ -17,15 +17,7 @@ def __init__(self) -> None: (r"line \d+,", "line N,"), ], } - self.id_keys_to_replace = [ - "id", - "pipetteId", - "labwareId", - "serialNumber", - "moduleId", - "liquidId", - "offsetId", - ] + self.id_keys_to_replace = ["id", "pipetteId", "labwareId", "serialNumber", "moduleId", "liquidId", "offsetId", "lidId"] self.timestamp_keys_to_replace = [ "createdAt", "startedAt", diff --git a/api/src/opentrons/protocol_engine/commands/flex_stacker/retrieve.py b/api/src/opentrons/protocol_engine/commands/flex_stacker/retrieve.py index 2b723304017..4586926753d 100644 --- a/api/src/opentrons/protocol_engine/commands/flex_stacker/retrieve.py +++ b/api/src/opentrons/protocol_engine/commands/flex_stacker/retrieve.py @@ -1,4 +1,5 @@ """Command models to retrieve a labware from a Flex Stacker.""" + from __future__ import annotations from typing import Optional, Literal, TYPE_CHECKING from typing_extensions import Type @@ -12,7 +13,12 @@ LocationIsOccupiedError, ) from ...state import update_types -from ...types import ModuleLocation +from ...types import ( + ModuleLocation, + OnAddressableAreaLocationSequenceComponent, + OnModuleLocationSequenceComponent, + LabwareLocationSequence, +) if TYPE_CHECKING: from opentrons.protocol_engine.state.state import StateView @@ -37,6 +43,12 @@ class RetrieveResult(BaseModel): ..., description="The labware ID of the retrieved labware.", ) + originLocationSequence: LabwareLocationSequence | None = Field( + None, description="The origin location of the labware." + ) + eventualDestinationLocationSequence: LabwareLocationSequence | None = Field( + None, description="The eventual destination of the labware." + ) class RetrieveImpl(AbstractCommandImpl[RetrieveParams, SuccessData[RetrieveResult]]): @@ -83,17 +95,24 @@ async def execute(self, params: RetrieveParams) -> SuccessData[RetrieveResult]: # Get the labware dimensions for the labware being retrieved, # which is the first one in the hopper labware id list lw_id = stacker_state.hopper_labware_ids[0] + original_location_sequence = self._state_view.geometry.get_location_sequence( + lw_id + ) + labware = self._state_view.labware.get(lw_id) + labware_height = self._state_view.labware.get_dimensions(labware_id=lw_id).z + if labware.lid_id is not None: + lid_def = self._state_view.labware.get_definition(labware.lid_id) + offset = self._state_view.labware.get_labware_overlap_offsets( + lid_def, labware.loadName + ).z + labware_height = labware_height + lid_def.dimensions.zDimension - offset + if stacker_hw is not None: - labware = self._state_view.labware.get(lw_id) - labware_height = self._state_view.labware.get_dimensions(labware_id=lw_id).z - if labware.lid_id is not None: - lid_def = self._state_view.labware.get_definition(labware.lid_id) - offset = self._state_view.labware.get_labware_overlap_offsets( - lid_def, labware.loadName - ).z - labware_height = labware_height + lid_def.dimensions.zDimension - offset await stacker_hw.dispense_labware(labware_height=labware_height) + own_addressable_area = self._state_view.modules.get_provided_addressable_area( + params.moduleId + ) # update the state to reflect the labware is now in the flex stacker slot state_update.set_labware_location( labware_id=lw_id, @@ -104,7 +123,17 @@ async def execute(self, params: RetrieveParams) -> SuccessData[RetrieveResult]: module_id=params.moduleId, labware_id=lw_id ) return SuccessData( - public=RetrieveResult(labware_id=lw_id), state_update=state_update + public=RetrieveResult( + labware_id=lw_id, + originLocationSequence=original_location_sequence, + eventualDestinationLocationSequence=[ + OnModuleLocationSequenceComponent(moduleId=params.moduleId), + OnAddressableAreaLocationSequenceComponent( + addressableAreaName=own_addressable_area, + ), + ], + ), + state_update=state_update, ) diff --git a/api/src/opentrons/protocol_engine/commands/flex_stacker/store.py b/api/src/opentrons/protocol_engine/commands/flex_stacker/store.py index c2ef3e67f3e..17aee9eb44d 100644 --- a/api/src/opentrons/protocol_engine/commands/flex_stacker/store.py +++ b/api/src/opentrons/protocol_engine/commands/flex_stacker/store.py @@ -1,4 +1,5 @@ """Command models to retrieve a labware from a Flex Stacker.""" + from __future__ import annotations from typing import Optional, Literal, TYPE_CHECKING from typing_extensions import Type @@ -12,7 +13,12 @@ LabwareNotLoadedOnModuleError, ) from ...state import update_types -from ...types import OFF_DECK_LOCATION +from ...types import ( + OFF_DECK_LOCATION, + NotOnDeckLocationSequenceComponent, + OnModuleLocationSequenceComponent, + LabwareLocationSequence, +) if TYPE_CHECKING: @@ -35,6 +41,14 @@ class StoreParams(BaseModel): class StoreResult(BaseModel): """Result data from a labware storage command.""" + eventualDestinationLocationSequence: LabwareLocationSequence | None = Field( + None, + description=("The full location in which this labware will eventually reside."), + ) + originLocationSequence: LabwareLocationSequence | None = Field( + None, description=("The origin location of the labware.") + ) + class StoreImpl(AbstractCommandImpl[StoreParams, SuccessData[StoreResult]]): """Implementation of a labware storage command.""" @@ -68,18 +82,21 @@ async def execute(self, params: StoreParams) -> SuccessData[StoreResult]: "Cannot store labware if Flex Stacker carriage is empty" ) + original_location_sequence = self._state_view.geometry.get_location_sequence( + lw_id + ) + labware = self._state_view.labware.get(lw_id) + labware_height = self._state_view.labware.get_dimensions(labware_id=lw_id).z + if labware.lid_id is not None: + lid_def = self._state_view.labware.get_definition(labware.lid_id) + offset = self._state_view.labware.get_labware_overlap_offsets( + lid_def, labware.loadName + ).z + labware_height = labware_height + lid_def.dimensions.zDimension - offset # TODO: check the type of the labware should match that already in the stack state_update = update_types.StateUpdate() if stacker_hw is not None: - labware = self._state_view.labware.get(lw_id) - labware_height = self._state_view.labware.get_dimensions(labware_id=lw_id).z - if labware.lid_id is not None: - lid_def = self._state_view.labware.get_definition(labware.lid_id) - offset = self._state_view.labware.get_labware_overlap_offsets( - lid_def, labware.loadName - ).z - labware_height = labware_height + lid_def.dimensions.zDimension - offset await stacker_hw.store_labware(labware_height=labware_height) # update the state to reflect the labware is store in the stack @@ -92,7 +109,18 @@ async def execute(self, params: StoreParams) -> SuccessData[StoreResult]: module_id=params.moduleId, labware_id=lw_id ) - return SuccessData(public=StoreResult(), state_update=state_update) + return SuccessData( + public=StoreResult( + originLocationSequence=original_location_sequence, + eventualDestinationLocationSequence=[ + OnModuleLocationSequenceComponent(moduleId=params.moduleId), + NotOnDeckLocationSequenceComponent( + logicalLocationName=OFF_DECK_LOCATION + ), + ], + ), + state_update=state_update, + ) class Store(BaseCommand[StoreParams, StoreResult, ErrorOccurrence]): diff --git a/api/src/opentrons/protocol_engine/commands/labware_handling_common.py b/api/src/opentrons/protocol_engine/commands/labware_handling_common.py new file mode 100644 index 00000000000..cafa4583539 --- /dev/null +++ b/api/src/opentrons/protocol_engine/commands/labware_handling_common.py @@ -0,0 +1,24 @@ +"""Helpers for commands that alter the position of labware.""" + +from pydantic import BaseModel, Field + +from ..types import LabwareLocationSequence + + +class LabwareHandlingResultMixin(BaseModel): + """A result for commands that create a labware entity.""" + + labwareId: str = Field(..., description="The id of the labware.") + locationSequence: LabwareLocationSequence | None = Field( + None, + description="The full location down to the deck on which this labware exists.", + ) + + +class LabwarePositionResultMixin(LabwareHandlingResultMixin): + """A result for commands that create an offsetable labware entity.""" + + offsetId: str | None = Field( + None, + description="An ID referencing the labware offset that will apply to this labware in this location.", + ) diff --git a/api/src/opentrons/protocol_engine/commands/load_labware.py b/api/src/opentrons/protocol_engine/commands/load_labware.py index 981ca04a11e..85c267f69e1 100644 --- a/api/src/opentrons/protocol_engine/commands/load_labware.py +++ b/api/src/opentrons/protocol_engine/commands/load_labware.py @@ -1,4 +1,5 @@ """Load labware command request, result, and implementation models.""" + from __future__ import annotations from typing import TYPE_CHECKING, Optional, Type, Any @@ -22,6 +23,7 @@ ) from .command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData +from .labware_handling_common import LabwarePositionResultMixin from ..errors.error_occurrence import ErrorOccurrence from ..state.update_types import StateUpdate @@ -73,30 +75,13 @@ class LoadLabwareParams(BaseModel): ) -class LoadLabwareResult(BaseModel): +class LoadLabwareResult(LabwarePositionResultMixin): """Result data from the execution of a LoadLabware command.""" - labwareId: str = Field( - ..., - description="An ID to reference this labware in subsequent commands.", - ) definition: LabwareDefinition = Field( ..., description="The full definition data for this labware.", ) - offsetId: Optional[str] = Field( - # Default `None` instead of `...` so this field shows up as non-required in - # OpenAPI. The server is allowed to omit it or make it null. - None, - description=( - "An ID referencing the labware offset that will apply" - " to the newly-placed labware." - " This offset will be in effect until the labware is moved" - " with a `moveLabware` command." - " Null or undefined means no offset applies," - " so the default of (0, 0, 0) will be used." - ), - ) class LoadLabwareImplementation( @@ -236,6 +221,9 @@ async def execute( # noqa: C901 labwareId=loaded_labware.labware_id, definition=loaded_labware.definition, offsetId=loaded_labware.offsetId, + locationSequence=self._state_view.geometry.get_predicted_location_sequence( + params.location + ), ), state_update=state_update, ) diff --git a/api/src/opentrons/protocol_engine/commands/load_lid.py b/api/src/opentrons/protocol_engine/commands/load_lid.py index 529ee5b0e03..a379fca909a 100644 --- a/api/src/opentrons/protocol_engine/commands/load_lid.py +++ b/api/src/opentrons/protocol_engine/commands/load_lid.py @@ -1,4 +1,5 @@ """Load lid command request, result, and implementation models.""" + from __future__ import annotations from pydantic import BaseModel, Field from typing import TYPE_CHECKING, Optional, Type @@ -11,8 +12,10 @@ from ..types import ( LabwareLocation, OnLabwareLocation, + OnLabwareLocationSequenceComponent, ) +from .labware_handling_common import LabwareHandlingResultMixin from .command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData from ..errors.error_occurrence import ErrorOccurrence from ..state.update_types import StateUpdate @@ -46,13 +49,9 @@ class LoadLidParams(BaseModel): ) -class LoadLidResult(BaseModel): +class LoadLidResult(LabwareHandlingResultMixin): """Result data from the execution of a LoadLabware command.""" - labwareId: str = Field( - ..., - description="An ID to reference this lid labware in subsequent commands.", - ) definition: LabwareDefinition = Field( ..., description="The full definition data for this lid labware.", @@ -122,6 +121,18 @@ async def execute(self, params: LoadLidParams) -> SuccessData[LoadLidResult]: public=LoadLidResult( labwareId=loaded_labware.labware_id, definition=loaded_labware.definition, + # Note: the lid is not yet loaded and therefore won't be found as the lid id for the + # labware onto which we're loading it, so build that part of the location sequence + # here and then build the rest of the sequence from the parent labware + locationSequence=[ + OnLabwareLocationSequenceComponent( + labwareId=params.location.labwareId, + lidId=loaded_labware.labware_id, + ) + ] + + self._state_view.geometry.get_location_sequence( + params.location.labwareId + ), ), state_update=state_update, ) diff --git a/api/src/opentrons/protocol_engine/commands/load_lid_stack.py b/api/src/opentrons/protocol_engine/commands/load_lid_stack.py index b879ec11084..9c5db1f8089 100644 --- a/api/src/opentrons/protocol_engine/commands/load_lid_stack.py +++ b/api/src/opentrons/protocol_engine/commands/load_lid_stack.py @@ -1,4 +1,5 @@ """Load lid stack command request, result, and implementation models.""" + from __future__ import annotations from pydantic import BaseModel, Field from typing import TYPE_CHECKING, Optional, Type, List, Any @@ -15,6 +16,8 @@ OnLabwareLocation, DeckSlotLocation, AddressableAreaLocation, + LabwareLocationSequence, + OnLabwareLocationSequenceComponent, ) from .command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData @@ -80,7 +83,7 @@ class LoadLidStackResult(BaseModel): stackLabwareId: str = Field( ..., - description="An ID to reference the Protocol Engine Labware Lid Stack in subsequent commands.", + description="An ID to reference the lid stack labware object created.", ) labwareIds: List[str] = Field( ..., @@ -93,6 +96,14 @@ class LoadLidStackResult(BaseModel): location: LabwareLocation = Field( ..., description="The Location that the stack of lid labware has been loaded." ) + stackLocationSequence: LabwareLocationSequence | None = Field( + None, + description="The location sequence for the lid stack labware object created.", + ) + locationSequences: List[LabwareLocationSequence] | None = Field( + None, + description="The location sequences for the lids just loaded into the stack. These are in the same order as labwareIds.", + ) class LoadLidStackImplementation( @@ -106,10 +117,7 @@ def __init__( self._equipment = equipment self._state_view = state_view - async def execute( - self, params: LoadLidStackParams - ) -> SuccessData[LoadLidStackResult]: - """Load definition and calibration data necessary for a lid stack.""" + def _validate_location(self, params: LoadLidStackParams) -> LabwareLocation: if isinstance(params.location, AddressableAreaLocation): area_name = params.location.addressableAreaName if not ( @@ -130,11 +138,72 @@ async def execute( raise ProtocolEngineError( message="Lid Stack Labware Object with quantity 0 must be loaded onto System Location." ) + return self._state_view.geometry.ensure_location_not_occupied(params.location) + + def _format_results( + self, + verified_location: LabwareLocation, + lid_stack_object: LoadedLabwareData, + loaded_lid_labwares: list[LoadedLabwareData], + lid_labware_definition: LabwareDefinition | None, + ) -> SuccessData[LoadLidStackResult]: + stack_location_sequence = ( + self._state_view.geometry.get_predicted_location_sequence(verified_location) + ) + loaded_lid_locations_by_id: dict[str, OnLabwareLocation] = {} + loaded_lid_ids_ordered: list[str] = [] + loaded_lid_location_sequences_ordered: list[LabwareLocationSequence] = [] + lid_location_sequence_accumulated: LabwareLocationSequence = [ + OnLabwareLocationSequenceComponent( + labwareId=lid_stack_object.labware_id, lidId=None + ) + ] + stack_location_sequence + load_location = OnLabwareLocation(labwareId=lid_stack_object.labware_id) + last_lid_id: str | None = None + for loaded_lid in loaded_lid_labwares: + loaded_lid_locations_by_id[loaded_lid.labware_id] = load_location + loaded_lid_ids_ordered.append(loaded_lid.labware_id) + if last_lid_id is None: + last_lid_id = loaded_lid.labware_id + else: + lid_location_sequence_accumulated = [ + OnLabwareLocationSequenceComponent( + labwareId=last_lid_id, lidId=None + ) + ] + lid_location_sequence_accumulated + last_lid_id = loaded_lid.labware_id + loaded_lid_location_sequences_ordered.append( + [loc for loc in lid_location_sequence_accumulated] + ) + load_location = OnLabwareLocation(labwareId=loaded_lid.labware_id) - verified_location = self._state_view.geometry.ensure_location_not_occupied( - params.location + state_update = StateUpdate() + state_update.set_loaded_lid_stack( + stack_id=lid_stack_object.labware_id, + stack_object_definition=lid_stack_object.definition, + stack_location=verified_location, + locations=loaded_lid_locations_by_id, + labware_definition=lid_labware_definition, ) + return SuccessData( + public=LoadLidStackResult( + stackLabwareId=lid_stack_object.labware_id, + labwareIds=loaded_lid_ids_ordered, + definition=lid_labware_definition, + location=verified_location, + stackLocationSequence=stack_location_sequence, + locationSequences=loaded_lid_location_sequences_ordered, + ), + state_update=state_update, + ) + + async def execute( + self, params: LoadLidStackParams + ) -> SuccessData[LoadLidStackResult]: + """Load definition and calibration data necessary for a lid stack.""" + verified_location = self._validate_location(params) + lid_stack_object = await self._equipment.load_labware( load_name=_LID_STACK_PE_LABWARE, namespace=_LID_STACK_PE_NAMESPACE, @@ -150,8 +219,8 @@ async def execute( message="Lid Stack Labware Object Labware Definition does not contain required allowed role 'system'." ) - loaded_lid_labwares: List[LoadedLabwareData] = [] - lid_labware_definition = None + loaded_lid_labwares: list[LoadedLabwareData] = [] + lid_labware_definition: LabwareDefinition | None = None if params.quantity > 0: loaded_lid_labwares = await self._equipment.load_lids( @@ -162,40 +231,18 @@ async def execute( quantity=params.quantity, labware_ids=params.labwareIds, ) - - lid_labware_definition = loaded_lid_labwares[0].definition - + lid_labware_definition = loaded_lid_labwares[-1].definition if isinstance(verified_location, OnLabwareLocation): self._state_view.labware.raise_if_labware_cannot_be_stacked( - top_labware_definition=loaded_lid_labwares[ - params.quantity - 1 - ].definition, + top_labware_definition=lid_labware_definition, bottom_labware_id=verified_location.labwareId, ) - loaded_lid_locations_by_id = {} - load_location = OnLabwareLocation(labwareId=lid_stack_object.labware_id) - for loaded_lid in loaded_lid_labwares: - loaded_lid_locations_by_id[loaded_lid.labware_id] = load_location - load_location = OnLabwareLocation(labwareId=loaded_lid.labware_id) - - state_update = StateUpdate() - state_update.set_loaded_lid_stack( - stack_id=lid_stack_object.labware_id, - stack_object_definition=lid_stack_object.definition, - stack_location=verified_location, - locations=loaded_lid_locations_by_id, - labware_definition=lid_labware_definition, - ) - - return SuccessData( - public=LoadLidStackResult( - stackLabwareId=lid_stack_object.labware_id, - labwareIds=list(loaded_lid_locations_by_id.keys()), - definition=lid_labware_definition, - location=params.location, - ), - state_update=state_update, + return self._format_results( + verified_location, + lid_stack_object, + loaded_lid_labwares, + lid_labware_definition, ) diff --git a/api/src/opentrons/protocol_engine/commands/move_labware.py b/api/src/opentrons/protocol_engine/commands/move_labware.py index 6b10fc1ec8d..9bf71018e78 100644 --- a/api/src/opentrons/protocol_engine/commands/move_labware.py +++ b/api/src/opentrons/protocol_engine/commands/move_labware.py @@ -2,6 +2,7 @@ from __future__ import annotations from typing import TYPE_CHECKING, Optional, Type, Any, List +from typing_extensions import TypedDict # note: need this instead of typing for py<3.12 from pydantic.json_schema import SkipJsonSchema from pydantic import BaseModel, Field @@ -26,6 +27,9 @@ LabwareMovementStrategy, LabwareOffsetVector, LabwareMovementOffsetData, + LabwareLocationSequence, + NotOnDeckLocationSequenceComponent, + OFF_DECK_LOCATION, ) from ..errors import ( LabwareMovementNotAllowedError, @@ -100,6 +104,31 @@ class MoveLabwareResult(BaseModel): " so the default of (0, 0, 0) will be used." ), ) + eventualDestinationLocationSequence: LabwareLocationSequence | None = Field( + None, + description=( + "The full location in which this labware will eventually reside. This will typically be the same as its " + "immediate destination, but if this labware is going to the trash then this field will be off deck." + ), + ) + immediateDestinationLocationSequence: LabwareLocationSequence | None = Field( + None, + description=( + "The full location to which this labware is being moved, right now." + ), + ) + originLocationSequence: LabwareLocationSequence | None = Field( + None, + description="The full location down to the deck of the labware before this command.", + ) + + +class ErrorDetails(TypedDict): + """Location details for a failed gripper move.""" + + originLocationSequence: LabwareLocationSequence + immediateDestinationLocationSequence: LabwareLocationSequence + eventualDestinationLocationSequence: LabwareLocationSequence class GripperMovementError(ErrorOccurrence): @@ -112,6 +141,8 @@ class GripperMovementError(ErrorOccurrence): errorType: Literal["gripperMovement"] = "gripperMovement" + errorInfo: ErrorDetails + _ExecuteReturn = SuccessData[MoveLabwareResult] | DefinedErrorData[GripperMovementError] @@ -152,6 +183,11 @@ async def execute(self, params: MoveLabwareParams) -> _ExecuteReturn: # noqa: C f"Cannot move fixed trash labware '{current_labware_definition.parameters.loadName}'." ) + origin_location_sequence = self._state_view.geometry.get_location_sequence( + params.labwareId + ) + eventual_destination_location_sequence: LabwareLocationSequence | None = None + if isinstance(params.newLocation, AddressableAreaLocation): area_name = params.newLocation.addressableAreaName if ( @@ -181,9 +217,19 @@ async def execute(self, params: MoveLabwareParams) -> _ExecuteReturn: # noqa: C y=0, z=0, ) + eventual_destination_location_sequence = [ + NotOnDeckLocationSequenceComponent( + logicalLocationName=OFF_DECK_LOCATION + ) + ] elif fixture_validation.is_trash(area_name): # When dropping labware in the trash bins we want to ensure they are lids # and enforce a y-axis drop offset to ensure they fall within the trash bin + eventual_destination_location_sequence = [ + NotOnDeckLocationSequenceComponent( + logicalLocationName=OFF_DECK_LOCATION + ) + ] if labware_validation.validate_definition_is_lid( self._state_view.labware.get_definition(params.labwareId) ): @@ -298,6 +344,16 @@ async def execute(self, params: MoveLabwareParams) -> _ExecuteReturn: # noqa: C if trash_lid_drop_offset: user_offset_data.dropOffset += trash_lid_drop_offset + immediate_destination_location_sequence = ( + self._state_view.geometry.get_predicted_location_sequence( + validated_new_loc + ) + ) + if eventual_destination_location_sequence is None: + eventual_destination_location_sequence = ( + immediate_destination_location_sequence + ) + try: # Skips gripper moves when using virtual gripper await self._labware_movement.move_labware_with_gripper( @@ -314,20 +370,23 @@ async def execute(self, params: MoveLabwareParams) -> _ExecuteReturn: # noqa: C # todo(mm, 2024-09-26): Catch LabwareNotPickedUpError when that exists and # move_labware_with_gripper() raises it. ) as exception: - gripper_movement_error: GripperMovementError | None = ( - GripperMovementError( - id=self._model_utils.generate_id(), - createdAt=self._model_utils.get_timestamp(), - errorCode=exception.code.value.code, - detail=exception.code.value.detail, - wrappedErrors=[ - ErrorOccurrence.from_failed( - id=self._model_utils.generate_id(), - createdAt=self._model_utils.get_timestamp(), - error=exception, - ) - ], - ) + gripper_movement_error: GripperMovementError | None = GripperMovementError( + id=self._model_utils.generate_id(), + createdAt=self._model_utils.get_timestamp(), + errorCode=exception.code.value.code, + detail=exception.code.value.detail, + errorInfo={ + "originLocationSequence": origin_location_sequence, + "immediateDestinationLocationSequence": immediate_destination_location_sequence, + "eventualDestinationLocationSequence": eventual_destination_location_sequence, + }, + wrappedErrors=[ + ErrorOccurrence.from_failed( + id=self._model_utils.generate_id(), + createdAt=self._model_utils.get_timestamp(), + error=exception, + ) + ], ) else: gripper_movement_error = None @@ -343,7 +402,27 @@ async def execute(self, params: MoveLabwareParams) -> _ExecuteReturn: # noqa: C elif params.strategy == LabwareMovementStrategy.MANUAL_MOVE_WITH_PAUSE: # Pause to allow for manual labware movement + immediate_destination_location_sequence = ( + self._state_view.geometry.get_predicted_location_sequence( + params.newLocation + ) + ) + if eventual_destination_location_sequence is None: + eventual_destination_location_sequence = ( + immediate_destination_location_sequence + ) + await self._run_control.wait_for_resume() + else: + immediate_destination_location_sequence = ( + self._state_view.geometry.get_predicted_location_sequence( + params.newLocation + ) + ) + if eventual_destination_location_sequence is None: + eventual_destination_location_sequence = ( + immediate_destination_location_sequence + ) # We may have just moved the labware that contains the current well out from # under the pipette. Clear the current location to reflect the fact that the @@ -398,7 +477,12 @@ async def execute(self, params: MoveLabwareParams) -> _ExecuteReturn: # noqa: C ) return SuccessData( - public=MoveLabwareResult(offsetId=new_offset_id), + public=MoveLabwareResult( + offsetId=new_offset_id, + originLocationSequence=origin_location_sequence, + immediateDestinationLocationSequence=immediate_destination_location_sequence, + eventualDestinationLocationSequence=eventual_destination_location_sequence, + ), state_update=state_update, ) diff --git a/api/src/opentrons/protocol_engine/commands/reload_labware.py b/api/src/opentrons/protocol_engine/commands/reload_labware.py index 07d70957cdb..0adc330e94c 100644 --- a/api/src/opentrons/protocol_engine/commands/reload_labware.py +++ b/api/src/opentrons/protocol_engine/commands/reload_labware.py @@ -1,9 +1,11 @@ """Reload labware command request, result, and implementation models.""" + from __future__ import annotations from pydantic import BaseModel, Field from typing import TYPE_CHECKING, Optional, Type from typing_extensions import Literal +from .labware_handling_common import LabwarePositionResultMixin from .command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData from ..errors.error_occurrence import ErrorOccurrence from ..state.update_types import StateUpdate @@ -24,27 +26,9 @@ class ReloadLabwareParams(BaseModel): ) -class ReloadLabwareResult(BaseModel): +class ReloadLabwareResult(LabwarePositionResultMixin): """Result data from the execution of a LoadLabware command.""" - labwareId: str = Field( - ..., - description="An ID to reference this labware in subsequent commands. Same as the one in the parameters.", - ) - offsetId: Optional[str] = Field( - # Default `None` instead of `...` so this field shows up as non-required in - # OpenAPI. The server is allowed to omit it or make it null. - None, - description=( - "An ID referencing the labware offset that will apply" - " to the reloaded labware." - " This offset will be in effect until the labware is moved" - " with a `moveLabware` command." - " Null or undefined means no offset applies," - " so the default of (0, 0, 0) will be used." - ), - ) - class ReloadLabwareImplementation( AbstractCommandImpl[ReloadLabwareParams, SuccessData[ReloadLabwareResult]] @@ -77,6 +61,9 @@ async def execute( public=ReloadLabwareResult( labwareId=params.labwareId, offsetId=reloaded_labware.offsetId, + locationSequence=self._state_view.geometry.get_predicted_location_sequence( + reloaded_labware.location + ), ), state_update=state_update, ) diff --git a/api/src/opentrons/protocol_engine/state/addressable_areas.py b/api/src/opentrons/protocol_engine/state/addressable_areas.py index c227fa72285..bbad97db7b5 100644 --- a/api/src/opentrons/protocol_engine/state/addressable_areas.py +++ b/api/src/opentrons/protocol_engine/state/addressable_areas.py @@ -625,3 +625,36 @@ def raise_if_area_not_in_deck_configuration( raise AreaNotInDeckConfigurationError( f"{addressable_area_name} not provided by deck configuration." ) + + def get_current_potential_cutout_fixtures_for_addressable_area( + self, addressable_area_name: str + ) -> tuple[str, Set[PotentialCutoutFixture]]: + """Get the set of cutout fixtures that might provide a given addressable area. + + This takes into account the constraints already established by load commands or by a loaded deck + configuration, and may therefore return different results for the same addressable area at + different points in the protocol after deck configuration constraints have changed. + + This returns the common cutout id and the potential fixtures. + """ + ( + cutout_id, + base_potential_fixtures, + ) = deck_configuration_provider.get_potential_cutout_fixtures( + addressable_area_name, self._state.deck_definition + ) + try: + loaded_potential_fixtures = ( + self._state.potential_cutout_fixtures_by_cutout_id[cutout_id] + ) + return cutout_id, loaded_potential_fixtures.intersection( + base_potential_fixtures + ) + except KeyError: + # If there was a key error here, it's because this function was (eventually) called + # from the body of a command implementation whose state update will load the + # addressable area it's querying... but that state update has not been submitted + # and processed, so nothing has created the entry for this cutout id yet. Do what + # we'll do when we actually get to that state update, which is apply the base + # potential fixtures from the deck def. + return cutout_id, base_potential_fixtures diff --git a/api/src/opentrons/protocol_engine/state/geometry.py b/api/src/opentrons/protocol_engine/state/geometry.py index 3f44712600d..7da794bf3e6 100644 --- a/api/src/opentrons/protocol_engine/state/geometry.py +++ b/api/src/opentrons/protocol_engine/state/geometry.py @@ -1,5 +1,6 @@ """Geometry state getters.""" +from logging import getLogger import enum from numpy import array, dot, double as npdouble from numpy.typing import NDArray @@ -22,6 +23,7 @@ LabwareNotLoadedOnModuleError, LabwareMovementNotAllowedError, OperationLocationNotInWellError, + WrongModuleTypeError, ) from ..resources import fixture_validation, labware_validation from ..types import ( @@ -55,7 +57,15 @@ OnModuleOffsetLocationSequenceComponent, OnAddressableAreaOffsetLocationSequenceComponent, OnLabwareOffsetLocationSequenceComponent, + OnLabwareLocationSequenceComponent, ModuleModel, + LabwareLocationSequence, + OnModuleLocationSequenceComponent, + OnAddressableAreaLocationSequenceComponent, + OnCutoutFixtureLocationSequenceComponent, + NotOnDeckLocationSequenceComponent, + labware_location_is_off_deck, + labware_location_is_system, ) from .config import Config from .labware import LabwareView @@ -70,6 +80,7 @@ from ._well_math import wells_covered_by_pipette_configuration, nozzles_per_well +_LOG = getLogger(__name__) SLOT_WIDTH = 128 _PIPETTE_HOMED_POSITION_Z = ( 248.0 # Height of the bottom of the nozzle without the tip attached when homed @@ -1364,6 +1375,161 @@ def _labware_gripper_offsets( labware_id=labware_id, slot_name=None ) + def get_location_sequence(self, labware_id: str) -> LabwareLocationSequence: + """Provide the LocationSequence specifying the current position of the labware. + + Elements in this sequence contain instance IDs of things. The chain is valid only until the + labware is moved. + """ + return self.get_predicted_location_sequence( + self._labware.get_location(labware_id) + ) + + def get_predicted_location_sequence( + self, labware_location: LabwareLocation + ) -> LabwareLocationSequence: + """Get the location sequence for this location. Useful for a labware that hasn't been loaded.""" + return self._recurse_labware_location(labware_location, []) + + def _cutout_fixture_location_sequence_from_addressable_area( + self, addressable_area_name: str + ) -> OnCutoutFixtureLocationSequenceComponent: + ( + cutout_id, + potential_fixtures, + ) = self._addressable_areas.get_current_potential_cutout_fixtures_for_addressable_area( + addressable_area_name + ) + return OnCutoutFixtureLocationSequenceComponent( + possibleCutoutFixtureIds=sorted( + [fixture.cutout_fixture_id for fixture in potential_fixtures] + ), + cutoutId=cutout_id, + ) + + def _recurse_labware_location_from_aa_component( + self, + labware_location: AddressableAreaLocation, + building: LabwareLocationSequence, + ) -> LabwareLocationSequence: + cutout_location = self._cutout_fixture_location_sequence_from_addressable_area( + labware_location.addressableAreaName + ) + # If the labware is loaded on an AA that is a module, we want to respect the convention + # of giving it an OnModuleLocation. + possible_module = self._modules.get_by_addressable_area( + labware_location.addressableAreaName + ) + if possible_module is not None: + return building + [ + OnAddressableAreaLocationSequenceComponent( + addressableAreaName=labware_location.addressableAreaName + ), + OnModuleLocationSequenceComponent(moduleId=possible_module.id), + cutout_location, + ] + else: + return building + [ + OnAddressableAreaLocationSequenceComponent( + addressableAreaName=labware_location.addressableAreaName, + ), + cutout_location, + ] + + def _recurse_labware_location_from_module_component( + self, labware_location: ModuleLocation, building: LabwareLocationSequence + ) -> LabwareLocationSequence: + module_id = labware_location.moduleId + module_aa = self._modules.get_provided_addressable_area(module_id) + base_location: ( + OnCutoutFixtureLocationSequenceComponent + | NotOnDeckLocationSequenceComponent + ) = self._cutout_fixture_location_sequence_from_addressable_area(module_aa) + try: + self._modules.get_flex_stacker_substate(labware_location.moduleId) + base_location = NotOnDeckLocationSequenceComponent( + logicalLocationName=OFF_DECK_LOCATION + ) + except WrongModuleTypeError: + pass + + if self._modules.get_deck_supports_module_fixtures(): + # On a deck with modules as cutout fixtures, we want, in order, + # - the addressable area of the module + # - the module with its module id, which is what clients want + # - the cutout + loc = self._modules.get_location(module_id) + model = self._modules.get_connected_model(module_id) + module_aa = self._modules.ensure_and_convert_module_fixture_location( + loc.slotName, model + ) + return building + [ + OnAddressableAreaLocationSequenceComponent( + addressableAreaName=module_aa + ), + OnModuleLocationSequenceComponent(moduleId=module_id), + base_location, + ] + else: + # If the module isn't a cutout fixture, then we want + # - the module + # - the addressable area the module is loaded on + # - the cutout + location = self._modules.get_location(module_id) + return building + [ + OnModuleLocationSequenceComponent(moduleId=module_id), + OnAddressableAreaLocationSequenceComponent( + addressableAreaName=location.slotName.value + ), + base_location, + ] + + def _recurse_labware_location( + self, + labware_location: LabwareLocation, + building: LabwareLocationSequence, + ) -> LabwareLocationSequence: + if isinstance(labware_location, AddressableAreaLocation): + return self._recurse_labware_location_from_aa_component( + labware_location, building + ) + elif labware_location_is_off_deck( + labware_location + ) or labware_location_is_system(labware_location): + return building + [ + NotOnDeckLocationSequenceComponent(logicalLocationName=labware_location) + ] + + elif isinstance(labware_location, OnLabwareLocation): + return self._recurse_labware_location( + self._labware.get_location(labware_location.labwareId), + building + + [ + OnLabwareLocationSequenceComponent( + labwareId=labware_location.labwareId, + lidId=self._labware.get_lid_id_by_labware_id( + labware_location.labwareId + ), + ) + ], + ) + elif isinstance(labware_location, ModuleLocation): + return self._recurse_labware_location_from_module_component( + labware_location, building + ) + elif isinstance(labware_location, DeckSlotLocation): + return building + [ + OnAddressableAreaLocationSequenceComponent( + addressableAreaName=labware_location.slotName.value, + ), + self._cutout_fixture_location_sequence_from_addressable_area( + labware_location.slotName.value + ), + ] + else: + _LOG.warn(f"Unhandled labware location kind: {labware_location}") + return building + def get_offset_location( self, labware_id: str ) -> Optional[LabwareOffsetLocationSequence]: diff --git a/api/src/opentrons/protocol_engine/state/labware.py b/api/src/opentrons/protocol_engine/state/labware.py index 553538895e5..6560ebe35a1 100644 --- a/api/src/opentrons/protocol_engine/state/labware.py +++ b/api/src/opentrons/protocol_engine/state/labware.py @@ -487,9 +487,13 @@ def get_labware_stack( return self.get_labware_stack(labware_stack) return labware_stack + def get_lid_id_by_labware_id(self, labware_id: str) -> str | None: + """Get the ID of a lid labware on top of a given labware, if any.""" + return self._state.labware_by_id[labware_id].lid_id + def get_lid_by_labware_id(self, labware_id: str) -> LoadedLabware | None: """Get the Lid Labware that is currently on top of a given labware, if there is one.""" - lid_id = self._state.labware_by_id[labware_id].lid_id + lid_id = self.get_lid_id_by_labware_id(labware_id) if lid_id: return self._state.labware_by_id[lid_id] else: diff --git a/api/src/opentrons/protocol_engine/state/modules.py b/api/src/opentrons/protocol_engine/state/modules.py index 8fdfd44ee4f..3141530395c 100644 --- a/api/src/opentrons/protocol_engine/state/modules.py +++ b/api/src/opentrons/protocol_engine/state/modules.py @@ -36,7 +36,7 @@ ) from opentrons.types import DeckSlotName, MountType, StagingSlotName from .update_types import AbsorbanceReaderStateUpdate, FlexStackerStateUpdate -from ..errors import ModuleNotConnectedError +from ..errors import ModuleNotConnectedError, AreaNotInDeckConfigurationError from ..types import ( LoadedModule, @@ -676,6 +676,15 @@ def get_by_slot( return None + def get_by_addressable_area( + self, addressable_area_name: str + ) -> Optional[LoadedModule]: + """Get the module associated with this addressable area, if any.""" + for module_id in self._state.slot_by_module_id.keys(): + if addressable_area_name == self.get_provided_addressable_area(module_id): + return self.get(module_id) + return None + def _get_module_substate( self, module_id: str, expected_type: Type[ModuleSubStateT], expected_name: str ) -> ModuleSubStateT: @@ -803,6 +812,26 @@ def get_location(self, module_id: str) -> DeckSlotLocation: ) return location + def get_provided_addressable_area(self, module_id: str) -> str: + """Get the addressable area provided by this module. + + If the current deck does not allow modules to provide locations (i.e., is an OT-2 deck) + then return the addressable area underneath the module. + """ + module = self.get(module_id) + + if isinstance(module.location, DeckSlotLocation): + location = module.location.slotName + elif module.model == ModuleModel.THERMOCYCLER_MODULE_V2: + location = DeckSlotName.SLOT_B1 + else: + raise ValueError( + "Module location invalid for nominal module offset calculation." + ) + if not self.get_deck_supports_module_fixtures(): + return location.value + return self.ensure_and_convert_module_fixture_location(location, module.model) + def get_requested_model(self, module_id: str) -> Optional[ModuleModel]: """Return the model by which this module was requested. @@ -910,18 +939,7 @@ def get_nominal_offset_to_child( z=xformed[2], ) else: - module = self.get(module_id) - if isinstance(module.location, DeckSlotLocation): - location = module.location.slotName - elif module.model == ModuleModel.THERMOCYCLER_MODULE_V2: - location = DeckSlotName.SLOT_B1 - else: - raise ValueError( - "Module location invalid for nominal module offset calculation." - ) - module_addressable_area = self.ensure_and_convert_module_fixture_location( - location, module.model - ) + module_addressable_area = self.get_provided_addressable_area(module_id) module_addressable_area_position = ( addressable_areas.get_addressable_area_offsets_from_cutout( module_addressable_area @@ -1313,7 +1331,7 @@ def ensure_and_convert_module_fixture_location( deck_type = self._state.deck_type if not self.get_deck_supports_module_fixtures(): - raise ValueError( + raise AreaNotInDeckConfigurationError( f"Invalid Deck Type: {deck_type.name} - Does not support modules as fixtures." ) diff --git a/api/src/opentrons/protocol_engine/types/__init__.py b/api/src/opentrons/protocol_engine/types/__init__.py index bf1f524a7a7..6e329c68dd6 100644 --- a/api/src/opentrons/protocol_engine/types/__init__.py +++ b/api/src/opentrons/protocol_engine/types/__init__.py @@ -78,6 +78,14 @@ OnDeckLabwareLocation, NonStackedLocation, DeckPoint, + OnLabwareLocationSequenceComponent, + OnModuleLocationSequenceComponent, + OnAddressableAreaLocationSequenceComponent, + NotOnDeckLocationSequenceComponent, + OnCutoutFixtureLocationSequenceComponent, + LabwareLocationSequence, + labware_location_is_system, + labware_location_is_off_deck, ) from .labware import ( OverlapOffset, @@ -202,6 +210,16 @@ "OnDeckLabwareLocation", "NonStackedLocation", "DeckPoint", + "OffDeckLocationType", + "SystemLocationType", + "OnLabwareLocationSequenceComponent", + "OnModuleLocationSequenceComponent", + "OnAddressableAreaLocationSequenceComponent", + "NotOnDeckLocationSequenceComponent", + "OnCutoutFixtureLocationSequenceComponent", + "LabwareLocationSequence", + "labware_location_is_off_deck", + "labware_location_is_system", # Labware offset location "LegacyLabwareOffsetLocation", "LabwareOffsetLocationSequence", diff --git a/api/src/opentrons/protocol_engine/types/location.py b/api/src/opentrons/protocol_engine/types/location.py index cc174f4bdea..c1eece77549 100644 --- a/api/src/opentrons/protocol_engine/types/location.py +++ b/api/src/opentrons/protocol_engine/types/location.py @@ -1,6 +1,7 @@ """Protocol engine types to deal with locating things on the deck.""" -from typing import Literal, Union +from __future__ import annotations +from typing import Literal, Union, TypeGuard from pydantic import BaseModel, Field @@ -78,6 +79,20 @@ class OnLabwareLocation(BaseModel): SYSTEM_LOCATION: _SystemLocationType = "systemLocation" +def labware_location_is_off_deck( + location: LabwareLocation, +) -> TypeGuard[_OffDeckLocationType]: + """Check if a location is an off deck location.""" + return isinstance(location, str) and location == OFF_DECK_LOCATION + + +def labware_location_is_system( + location: LabwareLocation, +) -> TypeGuard[_SystemLocationType]: + """Check if a location is the system location.""" + return isinstance(location, str) and location == SYSTEM_LOCATION + + class OnLabwareLocationSequenceComponent(BaseModel): """Labware on another labware.""" @@ -98,7 +113,14 @@ class OnAddressableAreaLocationSequenceComponent(BaseModel): kind: Literal["onAddressableArea"] = "onAddressableArea" addressableAreaName: str - slotName: str | None + + +class OnCutoutFixtureLocationSequenceComponent(BaseModel): + """Something on a deck cutout fixture.""" + + kind: Literal["onCutoutFixture"] = "onCutoutFixture" + possibleCutoutFixtureIds: list[str] + cutoutId: str class NotOnDeckLocationSequenceComponent(BaseModel): @@ -113,6 +135,7 @@ class NotOnDeckLocationSequenceComponent(BaseModel): | OnModuleLocationSequenceComponent | OnAddressableAreaLocationSequenceComponent | NotOnDeckLocationSequenceComponent + | OnCutoutFixtureLocationSequenceComponent ] """Labware location specifier.""" diff --git a/api/src/opentrons/protocol_runner/legacy_command_mapper.py b/api/src/opentrons/protocol_runner/legacy_command_mapper.py index f7d50e539d8..afb06075e2a 100644 --- a/api/src/opentrons/protocol_runner/legacy_command_mapper.py +++ b/api/src/opentrons/protocol_runner/legacy_command_mapper.py @@ -663,6 +663,8 @@ def _map_labware_load( labware_load_info.labware_definition ), offsetId=labware_load_info.offset_id, + # These legacy json protocols don't get location sequences because + # to do so we'd have to go back and look up where the module gets loaded ), ) queue_action = pe_actions.QueueCommandAction( diff --git a/api/tests/opentrons/protocol_engine/commands/flex_stacker/test_retrieve.py b/api/tests/opentrons/protocol_engine/commands/flex_stacker/test_retrieve.py index 6f11b2908b7..dcd214dd761 100644 --- a/api/tests/opentrons/protocol_engine/commands/flex_stacker/test_retrieve.py +++ b/api/tests/opentrons/protocol_engine/commands/flex_stacker/test_retrieve.py @@ -1,4 +1,5 @@ """Test Flex Stacker retrieve command implementation.""" + import pytest from decoy import Decoy from contextlib import nullcontext as does_not_raise @@ -28,6 +29,10 @@ ModuleLocation, LoadedLabware, OverlapOffset, + OnModuleLocationSequenceComponent, + OnAddressableAreaLocationSequenceComponent, + NotOnDeckLocationSequenceComponent, + OFF_DECK_LOCATION, ) from opentrons.protocol_engine.errors import CannotPerformModuleAction from opentrons.types import DeckSlotName @@ -95,6 +100,18 @@ async def test_retrieve( decoy.when( equipment.get_module_hardware_api(FlexStackerId("flex-stacker-id")) ).then_return(fs_hardware) + decoy.when(state_view.geometry.get_location_sequence("labware-id")).then_return( + [ + OnModuleLocationSequenceComponent(moduleId="flex-stacker-id"), + NotOnDeckLocationSequenceComponent(logicalLocationName=OFF_DECK_LOCATION), + ] + ) + decoy.when( + state_view.modules.get_provided_addressable_area("flex-stacker-id") + ).then_return("flexStackerV1B4") + decoy.when(state_view.modules.get_location("flex-stacker-id")).then_return( + DeckSlotLocation(slotName=DeckSlotName.SLOT_B3) + ) with expectation: result = await subject.execute(data) @@ -103,7 +120,21 @@ async def test_retrieve( decoy.verify(await fs_hardware.dispense_labware(labware_height=4), times=1) assert result == SuccessData( - public=flex_stacker.RetrieveResult(labware_id="labware-id"), + public=flex_stacker.RetrieveResult( + labware_id="labware-id", + originLocationSequence=[ + OnModuleLocationSequenceComponent(moduleId="flex-stacker-id"), + NotOnDeckLocationSequenceComponent( + logicalLocationName=OFF_DECK_LOCATION + ), + ], + eventualDestinationLocationSequence=[ + OnModuleLocationSequenceComponent(moduleId="flex-stacker-id"), + OnAddressableAreaLocationSequenceComponent( + addressableAreaName="flexStackerV1B4", + ), + ], + ), state_update=StateUpdate( labware_location=LabwareLocationUpdate( labware_id="labware-id", diff --git a/api/tests/opentrons/protocol_engine/commands/flex_stacker/test_store.py b/api/tests/opentrons/protocol_engine/commands/flex_stacker/test_store.py index 1d6ea1b9947..a103adcdcf4 100644 --- a/api/tests/opentrons/protocol_engine/commands/flex_stacker/test_store.py +++ b/api/tests/opentrons/protocol_engine/commands/flex_stacker/test_store.py @@ -1,4 +1,5 @@ """Test Flex Stacker store command implementation.""" + import pytest from decoy import Decoy from contextlib import nullcontext as does_not_raise @@ -29,6 +30,9 @@ OFF_DECK_LOCATION, LoadedLabware, OverlapOffset, + OnModuleLocationSequenceComponent, + OnAddressableAreaLocationSequenceComponent, + NotOnDeckLocationSequenceComponent, ) from opentrons.protocol_engine.errors import CannotPerformModuleAction from opentrons.types import DeckSlotName @@ -100,6 +104,14 @@ async def test_store( decoy.when( equipment.get_module_hardware_api(FlexStackerId("flex-stacker-id")) ).then_return(fs_hardware) + decoy.when(state_view.geometry.get_location_sequence("labware-id")).then_return( + [ + OnModuleLocationSequenceComponent(moduleId="flex-stacker-id"), + OnAddressableAreaLocationSequenceComponent( + addressableAreaName="flexStackerV1B4", + ), + ] + ) with expectation: result = await subject.execute(data) @@ -107,7 +119,20 @@ async def test_store( if not in_static_mode: decoy.verify(await fs_hardware.store_labware(labware_height=4), times=1) assert result == SuccessData( - public=flex_stacker.StoreResult(), + public=flex_stacker.StoreResult( + originLocationSequence=[ + OnModuleLocationSequenceComponent(moduleId="flex-stacker-id"), + OnAddressableAreaLocationSequenceComponent( + addressableAreaName="flexStackerV1B4", + ), + ], + eventualDestinationLocationSequence=[ + OnModuleLocationSequenceComponent(moduleId="flex-stacker-id"), + NotOnDeckLocationSequenceComponent( + logicalLocationName=OFF_DECK_LOCATION + ), + ], + ), state_update=StateUpdate( labware_location=LabwareLocationUpdate( labware_id="labware-id", diff --git a/api/tests/opentrons/protocol_engine/commands/test_load_labware.py b/api/tests/opentrons/protocol_engine/commands/test_load_labware.py index 01a5406731d..438955f63c8 100644 --- a/api/tests/opentrons/protocol_engine/commands/test_load_labware.py +++ b/api/tests/opentrons/protocol_engine/commands/test_load_labware.py @@ -1,4 +1,5 @@ """Test load labware commands.""" + import inspect from typing import Optional from unittest.mock import sentinel @@ -23,6 +24,10 @@ ModuleLocation, ModuleModel, LoadedModule, + OnLabwareLocationSequenceComponent, + OnModuleLocationSequenceComponent, + OnAddressableAreaLocationSequenceComponent, + NotOnDeckLocationSequenceComponent, OFF_DECK_LOCATION, ) from opentrons.protocol_engine.execution import LoadedLabwareData, EquipmentHandler @@ -84,6 +89,15 @@ async def test_load_labware_on_slot_or_addressable_area( version=1, displayName=display_name, ) + decoy.when( + state_view.geometry.get_predicted_location_sequence(location) + ).then_return( + [ + OnAddressableAreaLocationSequenceComponent( + addressableAreaName=expected_addressable_area_name, + ) + ] + ) decoy.when(state_view.geometry.ensure_location_not_occupied(location)).then_return( sentinel.validated_empty_location @@ -115,6 +129,11 @@ async def test_load_labware_on_slot_or_addressable_area( labwareId="labware-id", definition=well_plate_def, offsetId="labware-offset-id", + locationSequence=[ + OnAddressableAreaLocationSequenceComponent( + addressableAreaName=expected_addressable_area_name, + ) + ], ), state_update=StateUpdate( loaded_labware=LoadedLabwareUpdate( @@ -190,6 +209,18 @@ async def test_load_labware_on_labware( offsetId="labware-offset-id", ) ) + decoy.when( + state_view.geometry.get_predicted_location_sequence( + OnLabwareLocation(labwareId="other-labware-id") + ) + ).then_return( + [ + OnLabwareLocationSequenceComponent( + labwareId="other-labware-id", lidId=None + ), + OnAddressableAreaLocationSequenceComponent(addressableAreaName="A3"), + ] + ) decoy.when( labware_validation.validate_definition_is_labware(well_plate_def) @@ -201,6 +232,12 @@ async def test_load_labware_on_labware( labwareId="labware-id", definition=well_plate_def, offsetId="labware-offset-id", + locationSequence=[ + OnLabwareLocationSequenceComponent( + labwareId="other-labware-id", lidId=None + ), + OnAddressableAreaLocationSequenceComponent(addressableAreaName="A3"), + ], ), state_update=StateUpdate( loaded_labware=LoadedLabwareUpdate( @@ -281,6 +318,16 @@ async def test_load_labware_in_flex_stacker( hopper_labware_ids=[], ) ) + decoy.when( + state_view.geometry.get_predicted_location_sequence( + ModuleLocation(moduleId="some-module-id") + ) + ).then_return( + [ + OnModuleLocationSequenceComponent(moduleId="some-module-id"), + NotOnDeckLocationSequenceComponent(logicalLocationName=OFF_DECK_LOCATION), + ] + ) decoy.when( await equipment.load_labware( @@ -305,6 +352,12 @@ async def test_load_labware_in_flex_stacker( labwareId="labware-id", definition=well_plate_def, offsetId="labware-offset-id", + locationSequence=[ + OnModuleLocationSequenceComponent(moduleId="some-module-id"), + NotOnDeckLocationSequenceComponent( + logicalLocationName=OFF_DECK_LOCATION + ), + ], ), state_update=StateUpdate( loaded_labware=LoadedLabwareUpdate( diff --git a/api/tests/opentrons/protocol_engine/commands/test_load_lid.py b/api/tests/opentrons/protocol_engine/commands/test_load_lid.py new file mode 100644 index 00000000000..21eff3e0c25 --- /dev/null +++ b/api/tests/opentrons/protocol_engine/commands/test_load_lid.py @@ -0,0 +1,118 @@ +"""Test the loadLid command.""" + +import inspect + +import pytest +from decoy import Decoy + +from opentrons_shared_data.labware.labware_definition import LabwareDefinition + +from opentrons.protocol_engine.resources import labware_validation +from opentrons.protocol_engine.execution import LoadedLabwareData, EquipmentHandler +from opentrons.protocol_engine.state.state import StateView +from opentrons.protocol_engine.types import ( + OnLabwareLocation, + OnLabwareLocationSequenceComponent, + OnAddressableAreaLocationSequenceComponent, +) +from opentrons.protocol_engine.state.update_types import ( + LabwareLidUpdate, + LoadedLabwareUpdate, + StateUpdate, +) +from opentrons.protocol_engine.commands.command import SuccessData + +from opentrons.protocol_engine.commands.load_lid import ( + LoadLidParams, + LoadLidResult, + LoadLidImplementation, +) + + +@pytest.fixture(autouse=True) +def patch_mock_labware_validation( + decoy: Decoy, monkeypatch: pytest.MonkeyPatch +) -> None: + """Mock out labware_validations.py functions.""" + for name, func in inspect.getmembers(labware_validation, inspect.isfunction): + monkeypatch.setattr(labware_validation, name, decoy.mock(func=func)) + + +async def test_load_lid_on_tiprack( + decoy: Decoy, + tiprack_lid_def: LabwareDefinition, + equipment: EquipmentHandler, + state_view: StateView, +) -> None: + """It should load a lid onto a labware.""" + subject = LoadLidImplementation(equipment=equipment, state_view=state_view) + input_location = OnLabwareLocation(labwareId="some-labware-id") + decoy.when( + state_view.geometry.ensure_location_not_occupied(location=input_location) + ).then_return(input_location) + decoy.when( + await equipment.load_labware( + load_name="someLid", + namespace="someNamespace", + version=1, + location=input_location, + labware_id=None, + ) + ).then_return( + LoadedLabwareData( + labware_id="labware-id", + definition=tiprack_lid_def, + offsetId=None, + ) + ) + + decoy.when( + labware_validation.validate_definition_is_lid(tiprack_lid_def) + ).then_return(True) + + decoy.when( + state_view.labware.raise_if_labware_cannot_be_stacked( + top_labware_definition=tiprack_lid_def, + bottom_labware_id=input_location.labwareId, + ) + ).then_return(True) + decoy.when( + state_view.geometry.get_location_sequence(input_location.labwareId) + ).then_return( + [OnAddressableAreaLocationSequenceComponent(addressableAreaName="someAa")] + ) + + result = await subject.execute( + LoadLidParams( + location=input_location, + loadName="someLid", + namespace="someNamespace", + version=1, + ) + ) + assert result == SuccessData( + public=LoadLidResult( + definition=tiprack_lid_def, + labwareId="labware-id", + locationSequence=[ + OnLabwareLocationSequenceComponent( + labwareId=input_location.labwareId, lidId="labware-id" + ), + OnAddressableAreaLocationSequenceComponent( + addressableAreaName="someAa" + ), + ], + ), + state_update=StateUpdate( + labware_lid=LabwareLidUpdate( + parent_labware_ids=["some-labware-id"], lid_ids=["labware-id"] + ), + loaded_labware=LoadedLabwareUpdate( + definition=tiprack_lid_def, + labware_id="labware-id", + offset_id=None, + display_name=None, + new_location=input_location, + ), + ), + ) diff --git a/api/tests/opentrons/protocol_engine/commands/test_load_lid_stack.py b/api/tests/opentrons/protocol_engine/commands/test_load_lid_stack.py new file mode 100644 index 00000000000..33987b33e86 --- /dev/null +++ b/api/tests/opentrons/protocol_engine/commands/test_load_lid_stack.py @@ -0,0 +1,165 @@ +"""Test the loadLidStack command.""" + +import inspect + +import pytest +from decoy import Decoy + +from opentrons_shared_data.labware.labware_definition import LabwareDefinition + +from opentrons.types import DeckSlotName + +from opentrons.protocol_engine.resources import labware_validation +from opentrons.protocol_engine.execution import LoadedLabwareData, EquipmentHandler +from opentrons.protocol_engine.state.state import StateView +from opentrons.protocol_engine.types import ( + OnLabwareLocation, + DeckSlotLocation, + OnLabwareLocationSequenceComponent, + OnAddressableAreaLocationSequenceComponent, +) +from opentrons.protocol_engine.state.update_types import ( + LoadedLidStackUpdate, + StateUpdate, +) +from opentrons.protocol_engine.commands.command import SuccessData + +from opentrons.protocol_engine.commands.load_lid_stack import ( + LoadLidStackParams, + LoadLidStackResult, + LoadLidStackImplementation, +) + + +@pytest.fixture(autouse=True) +def patch_mock_labware_validation( + decoy: Decoy, monkeypatch: pytest.MonkeyPatch +) -> None: + """Mock out labware_validations.py functions.""" + for name, func in inspect.getmembers(labware_validation, inspect.isfunction): + monkeypatch.setattr(labware_validation, name, decoy.mock(func=func)) + + +async def test_load_lid_stack( + decoy: Decoy, + tiprack_lid_def: LabwareDefinition, + lid_stack_def: LabwareDefinition, + equipment: EquipmentHandler, + state_view: StateView, +) -> None: + """It should load a lid onto a labware.""" + subject = LoadLidStackImplementation(equipment=equipment, state_view=state_view) + input_location = DeckSlotLocation(slotName=DeckSlotName.SLOT_A1) + + data = LoadLidStackParams( + location=input_location, + loadName="someLid", + namespace="someNamespace", + version=1, + quantity=3, + ) + + decoy.when( + state_view.addressable_areas.raise_if_area_not_in_deck_configuration("A1") + ).then_return(True) + decoy.when( + state_view.geometry.ensure_location_not_occupied(location=input_location) + ).then_return(input_location) + + decoy.when( + await equipment.load_labware( + load_name="protocol_engine_lid_stack_object", + namespace="opentrons", + version=1, + location=input_location, + labware_id=None, + ) + ).then_return( + LoadedLabwareData( + labware_id="stack-labware-id", + definition=lid_stack_def, + offsetId=None, + ) + ) + decoy.when( + labware_validation.validate_definition_is_system(lid_stack_def) + ).then_return(True) + + lids = [ + LoadedLabwareData( + labware_id="lid-labware-1", definition=tiprack_lid_def, offsetId=None + ), + LoadedLabwareData( + labware_id="lid-labware-2", + definition=tiprack_lid_def, + offsetId=None, + ), + LoadedLabwareData( + labware_id="lid-labware-3", definition=tiprack_lid_def, offsetId=None + ), + ] + + decoy.when( + await equipment.load_lids( + load_name="someLid", + namespace="someNamespace", + version=1, + location=OnLabwareLocation(labwareId="stack-labware-id"), + quantity=3, + labware_ids=None, + ) + ).then_return(lids) + + stack_loc = OnAddressableAreaLocationSequenceComponent(addressableAreaName="A1") + on_stack_loc = OnLabwareLocationSequenceComponent( + labwareId="stack-labware-id", lidId=None + ) + decoy.when( + state_view.geometry.get_predicted_location_sequence(input_location) + ).then_return([stack_loc]) + + result = await subject.execute(data) + expected_result = SuccessData( + public=LoadLidStackResult( + stackLabwareId="stack-labware-id", + labwareIds=["lid-labware-1", "lid-labware-2", "lid-labware-3"], + definition=tiprack_lid_def, + location=input_location, + stackLocationSequence=[stack_loc], + locationSequences=[ + [on_stack_loc, stack_loc], + [ + OnLabwareLocationSequenceComponent( + labwareId="lid-labware-1", lidId=None + ), + on_stack_loc, + stack_loc, + ], + [ + OnLabwareLocationSequenceComponent( + labwareId="lid-labware-2", lidId=None + ), + OnLabwareLocationSequenceComponent( + labwareId="lid-labware-1", lidId=None + ), + on_stack_loc, + stack_loc, + ], + ], + ), + state_update=StateUpdate( + loaded_lid_stack=LoadedLidStackUpdate( + stack_id="stack-labware-id", + stack_object_definition=lid_stack_def, + stack_location=input_location, + definition=tiprack_lid_def, + new_locations_by_id={ + "lid-labware-1": OnLabwareLocation(labwareId="stack-labware-id"), + "lid-labware-2": OnLabwareLocation(labwareId="lid-labware-1"), + "lid-labware-3": OnLabwareLocation(labwareId="lid-labware-2"), + }, + ) + ), + ) + assert result.public.locationSequences == expected_result.public.locationSequences + assert result == result diff --git a/api/tests/opentrons/protocol_engine/commands/test_move_labware.py b/api/tests/opentrons/protocol_engine/commands/test_move_labware.py index 3a1e8c47b02..82026403e31 100644 --- a/api/tests/opentrons/protocol_engine/commands/test_move_labware.py +++ b/api/tests/opentrons/protocol_engine/commands/test_move_labware.py @@ -36,6 +36,11 @@ LabwareMovementOffsetData, DeckType, AddressableAreaLocation, + OnAddressableAreaLocationSequenceComponent, + OnLabwareLocationSequenceComponent, + NotOnDeckLocationSequenceComponent, + OFF_DECK_LOCATION, + LabwareLocationSequence, ) from opentrons.protocol_engine.state.state import StateView from opentrons.protocol_engine.commands.command import DefinedErrorData, SuccessData @@ -123,6 +128,12 @@ async def test_manual_move_labware_implementation( labware_location=DeckSlotLocation(slotName=DeckSlotName.SLOT_5), ) ).then_return("wowzers-a-new-offset-id") + decoy.when( + state_view.geometry.get_location_sequence("my-cool-labware-id") + ).then_return([OnAddressableAreaLocationSequenceComponent(addressableAreaName="5")]) + decoy.when( + state_view.geometry.get_predicted_location_sequence(new_location) + ).then_return([OnAddressableAreaLocationSequenceComponent(addressableAreaName="4")]) result = await subject.execute(data) decoy.verify(await run_control.wait_for_resume(), times=times_pause_called) @@ -132,6 +143,15 @@ async def test_manual_move_labware_implementation( assert result == SuccessData( public=MoveLabwareResult( offsetId="wowzers-a-new-offset-id", + originLocationSequence=[ + OnAddressableAreaLocationSequenceComponent(addressableAreaName="5") + ], + immediateDestinationLocationSequence=[ + OnAddressableAreaLocationSequenceComponent(addressableAreaName="4") + ], + eventualDestinationLocationSequence=[ + OnAddressableAreaLocationSequenceComponent(addressableAreaName="4") + ], ), state_update=update_types.StateUpdate( labware_location=update_types.LabwareLocationUpdate( @@ -185,6 +205,19 @@ async def test_move_labware_implementation_on_labware( labware_location=OnLabwareLocation(labwareId="my-even-cooler-labware-id"), ) ).then_return("wowzers-a-new-offset-id") + decoy.when( + state_view.geometry.get_location_sequence("my-cool-labware-id") + ).then_return([OnAddressableAreaLocationSequenceComponent(addressableAreaName="1")]) + decoy.when( + state_view.geometry.get_predicted_location_sequence( + OnLabwareLocation(labwareId="new-labware-id") + ) + ).then_return( + [ + OnLabwareLocationSequenceComponent(labwareId="new-labware-id", lidId=None), + OnAddressableAreaLocationSequenceComponent(addressableAreaName="2"), + ] + ) result = await subject.execute(data) decoy.verify( @@ -200,6 +233,21 @@ async def test_move_labware_implementation_on_labware( assert result == SuccessData( public=MoveLabwareResult( offsetId="wowzers-a-new-offset-id", + originLocationSequence=[ + OnAddressableAreaLocationSequenceComponent(addressableAreaName="1") + ], + immediateDestinationLocationSequence=[ + OnLabwareLocationSequenceComponent( + labwareId="new-labware-id", lidId=None + ), + OnAddressableAreaLocationSequenceComponent(addressableAreaName="2"), + ], + eventualDestinationLocationSequence=[ + OnLabwareLocationSequenceComponent( + labwareId="new-labware-id", lidId=None + ), + OnAddressableAreaLocationSequenceComponent(addressableAreaName="2"), + ], ), state_update=update_types.StateUpdate( labware_location=update_types.LabwareLocationUpdate( @@ -264,6 +312,20 @@ async def test_gripper_move_labware_implementation( decoy.when( labware_validation.validate_gripper_compatible(sentinel.labware_definition) ).then_return(True) + decoy.when( + state_view.geometry.get_location_sequence("my-cool-labware-id") + ).then_return( + [ + OnAddressableAreaLocationSequenceComponent( + addressableAreaName="1", + ) + ] + ) + decoy.when( + state_view.geometry.get_predicted_location_sequence( + sentinel.new_location_validated_for_gripper + ) + ).then_return([OnAddressableAreaLocationSequenceComponent(addressableAreaName="5")]) result = await subject.execute(data) decoy.verify( @@ -282,6 +344,15 @@ async def test_gripper_move_labware_implementation( assert result == SuccessData( public=MoveLabwareResult( offsetId="wowzers-a-new-offset-id", + originLocationSequence=[ + OnAddressableAreaLocationSequenceComponent(addressableAreaName="1") + ], + immediateDestinationLocationSequence=[ + OnAddressableAreaLocationSequenceComponent(addressableAreaName="5") + ], + eventualDestinationLocationSequence=[ + OnAddressableAreaLocationSequenceComponent(addressableAreaName="5") + ], ), state_update=update_types.StateUpdate( pipette_location=update_types.CLEAR, @@ -321,7 +392,7 @@ async def test_gripper_error( labware_def = LabwareDefinition.model_construct( # type: ignore[call-arg] namespace=labware_namespace, ) - original_location = DeckSlotLocation(slotName=DeckSlotName.SLOT_A1) + origin_location = DeckSlotLocation(slotName=DeckSlotName.SLOT_A1) new_location = DeckSlotLocation(slotName=DeckSlotName.SLOT_A2) error_id = "error-id" error_created_at = datetime.now() @@ -335,13 +406,13 @@ async def test_gripper_error( id=labware_id, loadName=labware_load_name, definitionUri=labware_definition_uri, - location=original_location, + location=origin_location, offsetId=None, ) ) decoy.when( - state_view.geometry.ensure_valid_gripper_location(original_location) - ).then_return(original_location) + state_view.geometry.ensure_valid_gripper_location(origin_location) + ).then_return(origin_location) decoy.when( state_view.geometry.ensure_valid_gripper_location(new_location) ).then_return(new_location) @@ -363,7 +434,7 @@ async def test_gripper_error( decoy.when( await labware_movement.move_labware_with_gripper( labware_id=labware_id, - current_location=original_location, + current_location=origin_location, new_location=new_location, user_offset_data=LabwareMovementOffsetData( pickUpOffset=LabwareOffsetVector(x=0, y=0, z=0), @@ -374,6 +445,14 @@ async def test_gripper_error( ).then_raise(underlying_exception) decoy.when(model_utils.get_timestamp()).then_return(error_created_at) decoy.when(model_utils.generate_id()).then_return(error_id) + decoy.when(state_view.geometry.get_location_sequence("labware-id")).then_return( + [OnAddressableAreaLocationSequenceComponent(addressableAreaName="A1")] + ) + decoy.when( + state_view.geometry.get_predicted_location_sequence(new_location) + ).then_return( + [OnAddressableAreaLocationSequenceComponent(addressableAreaName="A2")] + ) result = await subject.execute(params) @@ -383,6 +462,17 @@ async def test_gripper_error( createdAt=error_created_at, errorCode=underlying_exception.code.value.code, detail=underlying_exception.code.value.detail, + errorInfo={ + "originLocationSequence": [ + OnAddressableAreaLocationSequenceComponent(addressableAreaName="A1") + ], + "immediateDestinationLocationSequence": [ + OnAddressableAreaLocationSequenceComponent(addressableAreaName="A2") + ], + "eventualDestinationLocationSequence": [ + OnAddressableAreaLocationSequenceComponent(addressableAreaName="A2") + ], + }, wrappedErrors=[matchers.Anything()], ), state_update=update_types.StateUpdate( @@ -429,6 +519,12 @@ async def test_clears_location_if_current_labware_moved_from_under_pipette( pipette_id="pipette-id", labware_id=current_labware_id, well_name="A1" ) ) + decoy.when(state_view.geometry.get_location_sequence(moved_labware_id)).then_return( + [] + ) + decoy.when( + state_view.geometry.get_predicted_location_sequence(to_location) + ).then_return([]) result = await subject.execute( params=MoveLabwareParams( @@ -458,6 +554,17 @@ async def test_gripper_move_to_waste_chute_implementation( expected_slide_offset = Point( x=labware_width / 2 + GRIPPER_PADDLE_WIDTH / 2 + 8, y=0, z=0 ) + from_loc_sequence: LabwareLocationSequence = [ + OnAddressableAreaLocationSequenceComponent(addressableAreaName="1") + ] + immediate_dest_loc_sequence: LabwareLocationSequence = [ + OnAddressableAreaLocationSequenceComponent( + addressableAreaName="gripperWasteChute" + ) + ] + eventual_dest_loc_sequence: LabwareLocationSequence = [ + NotOnDeckLocationSequenceComponent(logicalLocationName=OFF_DECK_LOCATION) + ] data = MoveLabwareParams( labwareId="my-cool-labware-id", @@ -475,6 +582,12 @@ async def test_gripper_move_to_waste_chute_implementation( decoy.when( state_view.labware.get_definition(labware_id="my-cool-labware-id") ).then_return(labware_def) + decoy.when( + state_view.geometry.get_location_sequence("my-cool-labware-id") + ).then_return(from_loc_sequence) + decoy.when( + state_view.geometry.get_predicted_location_sequence(new_location) + ).then_return(immediate_dest_loc_sequence) decoy.when(state_view.labware.get(labware_id="my-cool-labware-id")).then_return( LoadedLabware( id="my-cool-labware-id", @@ -523,6 +636,9 @@ async def test_gripper_move_to_waste_chute_implementation( assert result == SuccessData( public=MoveLabwareResult( offsetId="wowzers-a-new-offset-id", + originLocationSequence=from_loc_sequence, + immediateDestinationLocationSequence=immediate_dest_loc_sequence, + eventualDestinationLocationSequence=eventual_dest_loc_sequence, ), state_update=update_types.StateUpdate( pipette_location=update_types.CLEAR, diff --git a/api/tests/opentrons/protocol_engine/commands/test_reload_labware.py b/api/tests/opentrons/protocol_engine/commands/test_reload_labware.py index 6b13f464e77..c24582aae3e 100644 --- a/api/tests/opentrons/protocol_engine/commands/test_reload_labware.py +++ b/api/tests/opentrons/protocol_engine/commands/test_reload_labware.py @@ -1,4 +1,5 @@ """Test load labware commands.""" + import inspect import pytest @@ -14,6 +15,7 @@ from opentrons.protocol_engine.types import ( DeckSlotLocation, + OnAddressableAreaLocationSequenceComponent, ) from opentrons.protocol_engine.execution import ReloadedLabwareData, EquipmentHandler from opentrons.protocol_engine.resources import labware_validation @@ -59,6 +61,11 @@ async def test_reload_labware_implementation( offsetId="labware-offset-id", ) ) + decoy.when( + state_view.geometry.get_predicted_location_sequence( + DeckSlotLocation(slotName=DeckSlotName.SLOT_4) + ) + ).then_return([OnAddressableAreaLocationSequenceComponent(addressableAreaName="4")]) result = await subject.execute(data) @@ -66,6 +73,9 @@ async def test_reload_labware_implementation( public=ReloadLabwareResult( labwareId="my-labware-id", offsetId="labware-offset-id", + locationSequence=[ + OnAddressableAreaLocationSequenceComponent(addressableAreaName="4") + ], ), state_update=StateUpdate( labware_location=LabwareLocationUpdate( diff --git a/api/tests/opentrons/protocol_engine/conftest.py b/api/tests/opentrons/protocol_engine/conftest.py index c09d082afa2..2a6ee664d87 100644 --- a/api/tests/opentrons/protocol_engine/conftest.py +++ b/api/tests/opentrons/protocol_engine/conftest.py @@ -1,4 +1,5 @@ """ProtocolEngine shared test fixtures.""" + from __future__ import annotations import pytest @@ -155,6 +156,14 @@ def adapter_def() -> LabwareDefinition: ) +@pytest.fixture(scope="session") +def lid_stack_def() -> LabwareDefinition: + """Get the definition of the opentrons tiprack lid.""" + return LabwareDefinition.model_validate( + load_definition("protocol_engine_lid_stack_object", 1, schema=3) + ) + + @pytest.fixture(scope="session") def falcon_tuberack_def() -> LabwareDefinition: """Get the definition of the 6-well Falcon tuberack.""" diff --git a/api/tests/opentrons/protocol_engine/state/command_fixtures.py b/api/tests/opentrons/protocol_engine/state/command_fixtures.py index 6b12960be0c..bb37c280a0e 100644 --- a/api/tests/opentrons/protocol_engine/state/command_fixtures.py +++ b/api/tests/opentrons/protocol_engine/state/command_fixtures.py @@ -4,7 +4,6 @@ from pydantic import BaseModel from typing import Optional, cast, Dict -from opentrons_shared_data.labware.labware_definition import LabwareDefinition from opentrons_shared_data.pipette.types import PipetteNameType from opentrons.types import MountType from opentrons.protocol_engine import ErrorOccurrence, commands as cmd @@ -141,39 +140,6 @@ def create_comment_command(command_id: str = "command-id") -> cmd.Comment: ) -def create_load_labware_command( - labware_id: str, - location: LabwareLocation, - definition: LabwareDefinition, - offset_id: Optional[str], - display_name: Optional[str], -) -> cmd.LoadLabware: - """Create a completed LoadLabware command.""" - params = cmd.LoadLabwareParams( - loadName=definition.parameters.loadName, - namespace=definition.namespace, - version=definition.version, - location=location, - labwareId=None, - displayName=display_name, - ) - - result = cmd.LoadLabwareResult( - labwareId=labware_id, - definition=definition, - offsetId=offset_id, - ) - - return cmd.LoadLabware( - id="command-id", - key="command-key", - status=cmd.CommandStatus.SUCCEEDED, - createdAt=datetime.now(), - params=params, - result=result, - ) - - def create_load_pipette_command( pipette_id: str, pipette_name: PipetteNameType, diff --git a/api/tests/opentrons/protocol_engine/state/test_geometry_view.py b/api/tests/opentrons/protocol_engine/state/test_geometry_view.py index 3c214923e25..7413ce4c8fe 100644 --- a/api/tests/opentrons/protocol_engine/state/test_geometry_view.py +++ b/api/tests/opentrons/protocol_engine/state/test_geometry_view.py @@ -14,6 +14,9 @@ from opentrons.protocol_engine.state.update_types import ( LoadedLabwareUpdate, StateUpdate, + FlexStackerLoadHopperLabware, + FlexStackerStateUpdate, + AddressableAreaUsedUpdate, ) from opentrons_shared_data import get_shared_data_root, load_shared_data @@ -68,6 +71,11 @@ OnAddressableAreaOffsetLocationSequenceComponent, OnModuleOffsetLocationSequenceComponent, OnLabwareOffsetLocationSequenceComponent, + OnAddressableAreaLocationSequenceComponent, + OnModuleLocationSequenceComponent, + OnLabwareLocationSequenceComponent, + NotOnDeckLocationSequenceComponent, + OnCutoutFixtureLocationSequenceComponent, ) from opentrons.protocol_engine.commands import ( CommandStatus, @@ -319,9 +327,9 @@ def my_cool_test(subject: GeometryView) -> None: well_view=mock_well_view if use_mocks else well_view, module_view=mock_module_view if use_mocks else module_view, pipette_view=mock_pipette_view if use_mocks else pipette_view, - addressable_area_view=mock_addressable_area_view - if use_mocks - else addressable_area_view, + addressable_area_view=( + mock_addressable_area_view if use_mocks else addressable_area_view + ), ) @@ -3660,3 +3668,363 @@ def _get_labware_def() -> LabwareDefinition: ) assert isclose(found_volume_bottom, expected_volume_bottom, rel_tol=0.01) assert isclose(found_volume_top, expected_volume_top, rel_tol=0.01) + + +@pytest.mark.parametrize("use_mocks", [False]) +def test_get_location_sequence_deck_slot( + decoy: Decoy, + labware_store: LabwareStore, + addressable_area_store: AddressableAreaStore, + nice_labware_definition: LabwareDefinition, + subject: GeometryView, +) -> None: + """Test if you can get the location sequence of a labware in a deck slot.""" + action = SucceedCommandAction( + command=LoadLabware( + id="load-labware-1", + createdAt=datetime.now(), + key="load-labware-1", + status=CommandStatus.SUCCEEDED, + result=LoadLabwareResult( + labwareId="labware-id-1", + definition=nice_labware_definition, + offsetId=None, + ), + params=LoadLabwareParams( + location=DeckSlotLocation(slotName=DeckSlotName.SLOT_C2), + loadName=nice_labware_definition.parameters.loadName, + namespace=nice_labware_definition.namespace, + version=nice_labware_definition.version, + ), + ), + state_update=StateUpdate( + loaded_labware=LoadedLabwareUpdate( + labware_id="labware-id-1", + definition=nice_labware_definition, + offset_id=None, + new_location=DeckSlotLocation(slotName=DeckSlotName.SLOT_C2), + display_name=None, + ), + addressable_area_used=AddressableAreaUsedUpdate(addressable_area_name="C2"), + ), + ) + labware_store.handle_action(action) + addressable_area_store.handle_action(action) + location_sequence = subject.get_location_sequence("labware-id-1") + assert location_sequence == [ + OnAddressableAreaLocationSequenceComponent(addressableAreaName="C2"), + OnCutoutFixtureLocationSequenceComponent( + cutoutId="cutoutC2", possibleCutoutFixtureIds=["singleCenterSlot"] + ), + ] + + +@pytest.mark.parametrize("use_mocks", [False]) +def test_get_location_sequence_module( + decoy: Decoy, + labware_store: LabwareStore, + module_store: ModuleStore, + addressable_area_store: AddressableAreaStore, + nice_labware_definition: LabwareDefinition, + tempdeck_v2_def: ModuleDefinition, + subject: GeometryView, +) -> None: + """Test if you can get the location sequence of a labware directly on a module.""" + load_module = SucceedCommandAction( + command=LoadModule( + params=LoadModuleParams( + location=DeckSlotLocation(slotName=DeckSlotName.SLOT_A3), + model=ModuleModel.TEMPERATURE_MODULE_V2, + ), + id="load-module-1", + createdAt=datetime.now(), + key="load-module-1", + status=CommandStatus.SUCCEEDED, + result=LoadModuleResult( + moduleId="module-id-1", + definition=tempdeck_v2_def, + model=tempdeck_v2_def.model, + ), + ), + state_update=StateUpdate( + addressable_area_used=AddressableAreaUsedUpdate( + addressable_area_name="temperatureModuleV2A3" + ) + ), + ) + load_labware = SucceedCommandAction( + command=LoadLabware( + id="load-labware-1", + createdAt=datetime.now(), + key="load-labware-1", + status=CommandStatus.SUCCEEDED, + result=LoadLabwareResult( + labwareId="labware-id-1", + definition=nice_labware_definition, + offsetId=None, + ), + params=LoadLabwareParams( + location=ModuleLocation(moduleId="module-id-1"), + loadName=nice_labware_definition.parameters.loadName, + namespace=nice_labware_definition.namespace, + version=nice_labware_definition.version, + ), + ), + state_update=StateUpdate( + loaded_labware=LoadedLabwareUpdate( + labware_id="labware-id-1", + definition=nice_labware_definition, + offset_id=None, + new_location=ModuleLocation(moduleId="module-id-1"), + display_name=None, + ) + ), + ) + + module_store.handle_action(load_module) + addressable_area_store.handle_action(load_module) + labware_store.handle_action(load_labware) + + location_sequence = subject.get_location_sequence("labware-id-1") + assert location_sequence == [ + OnAddressableAreaLocationSequenceComponent( + addressableAreaName="temperatureModuleV2A3" + ), + OnModuleLocationSequenceComponent(moduleId="module-id-1"), + OnCutoutFixtureLocationSequenceComponent( + cutoutId="cutoutA3", possibleCutoutFixtureIds=["temperatureModuleV2"] + ), + ] + + +@pytest.mark.parametrize("use_mocks", [False]) +def test_get_location_sequence_module_with_adapter( + decoy: Decoy, + labware_store: LabwareStore, + module_store: ModuleStore, + addressable_area_store: AddressableAreaStore, + nice_labware_definition: LabwareDefinition, + nice_adapter_definition: LabwareDefinition, + tempdeck_v2_def: ModuleDefinition, + labware_view: LabwareView, + subject: GeometryView, +) -> None: + """Test if you can get the location sequence of a labware directly on a module.""" + load_module = SucceedCommandAction( + command=LoadModule( + params=LoadModuleParams( + location=DeckSlotLocation(slotName=DeckSlotName.SLOT_A3), + model=ModuleModel.TEMPERATURE_MODULE_V2, + ), + id="load-module-1", + createdAt=datetime.now(), + key="load-module-1", + status=CommandStatus.SUCCEEDED, + result=LoadModuleResult( + moduleId="module-id-1", + definition=tempdeck_v2_def, + model=tempdeck_v2_def.model, + ), + ), + state_update=StateUpdate( + addressable_area_used=AddressableAreaUsedUpdate( + addressable_area_name="temperatureModuleV2A3" + ) + ), + ) + load_adapter = SucceedCommandAction( + command=LoadLabware( + id="load-adapter-1", + createdAt=datetime.now(), + key="load-adapter-1", + status=CommandStatus.SUCCEEDED, + result=LoadLabwareResult( + labwareId="adapter-id-1", + definition=nice_adapter_definition, + offsetId=None, + ), + params=LoadLabwareParams( + location=ModuleLocation(moduleId="module-id-1"), + loadName=nice_adapter_definition.parameters.loadName, + namespace=nice_adapter_definition.namespace, + version=nice_adapter_definition.version, + ), + ), + state_update=StateUpdate( + loaded_labware=LoadedLabwareUpdate( + labware_id="adapter-id-1", + definition=nice_adapter_definition, + offset_id=None, + new_location=ModuleLocation(moduleId="module-id-1"), + display_name=None, + ), + ), + ) + load_labware = SucceedCommandAction( + command=LoadLabware( + id="load-labware-1", + createdAt=datetime.now(), + key="load-labware-1", + status=CommandStatus.SUCCEEDED, + result=LoadLabwareResult( + labwareId="labware-id-1", + definition=nice_labware_definition, + offsetId=None, + ), + params=LoadLabwareParams( + location=OnLabwareLocation(labwareId="adapter-id-1"), + loadName=nice_labware_definition.parameters.loadName, + namespace=nice_labware_definition.namespace, + version=nice_labware_definition.version, + ), + ), + state_update=StateUpdate( + loaded_labware=LoadedLabwareUpdate( + labware_id="labware-id-1", + definition=nice_labware_definition, + offset_id=None, + new_location=OnLabwareLocation(labwareId="adapter-id-1"), + display_name=None, + ) + ), + ) + module_store.handle_action(load_module) + addressable_area_store.handle_action(load_module) + labware_store.handle_action(load_adapter) + labware_store.handle_action(load_labware) + location_sequence = subject.get_location_sequence("labware-id-1") + assert location_sequence == [ + OnLabwareLocationSequenceComponent(labwareId="adapter-id-1", lidId=None), + OnAddressableAreaLocationSequenceComponent( + addressableAreaName="temperatureModuleV2A3" + ), + OnModuleLocationSequenceComponent(moduleId="module-id-1"), + OnCutoutFixtureLocationSequenceComponent( + cutoutId="cutoutA3", possibleCutoutFixtureIds=["temperatureModuleV2"] + ), + ] + + +@pytest.mark.parametrize("use_mocks", [False]) +def test_get_location_sequence_off_deck( + decoy: Decoy, + labware_store: LabwareStore, + nice_labware_definition: LabwareDefinition, + subject: GeometryView, +) -> None: + """You cannot get the location sequence for a labware loaded OFF_DECK.""" + action = SucceedCommandAction( + command=LoadLabware( + id="load-labware-1", + createdAt=datetime.now(), + key="load-labware-1", + status=CommandStatus.SUCCEEDED, + result=LoadLabwareResult( + labwareId="labware-id-1", + definition=nice_labware_definition, + offsetId=None, + ), + params=LoadLabwareParams( + location=OFF_DECK_LOCATION, + loadName=nice_labware_definition.parameters.loadName, + namespace=nice_labware_definition.namespace, + version=nice_labware_definition.version, + ), + ), + state_update=StateUpdate( + loaded_labware=LoadedLabwareUpdate( + labware_id="labware-id-1", + definition=nice_labware_definition, + offset_id=None, + new_location=OFF_DECK_LOCATION, + display_name=None, + ) + ), + ) + labware_store.handle_action(action) + location_sequence = subject.get_location_sequence("labware-id-1") + assert location_sequence == [ + NotOnDeckLocationSequenceComponent(logicalLocationName=OFF_DECK_LOCATION) + ] + + +@pytest.mark.parametrize("use_mocks", [False]) +def test_get_location_sequence_stacker_hopper( + decoy: Decoy, + labware_store: LabwareStore, + module_store: ModuleStore, + addressable_area_store: AddressableAreaStore, + nice_labware_definition: LabwareDefinition, + flex_stacker_v1_def: ModuleDefinition, + subject: GeometryView, +) -> None: + """Test if you can get the location sequence of a labware in the stacker hopper.""" + load_module = SucceedCommandAction( + command=LoadModule( + params=LoadModuleParams( + location=DeckSlotLocation(slotName=DeckSlotName.SLOT_A3), + model=ModuleModel.FLEX_STACKER_MODULE_V1, + ), + id="load-module-1", + createdAt=datetime.now(), + key="load-module-1", + status=CommandStatus.SUCCEEDED, + result=LoadModuleResult( + moduleId="module-id-1", + definition=flex_stacker_v1_def, + model=flex_stacker_v1_def.model, + ), + ), + state_update=StateUpdate( + addressable_area_used=AddressableAreaUsedUpdate( + addressable_area_name="flexStackerModuleV1A4" + ) + ), + ) + load_labware = SucceedCommandAction( + command=LoadLabware( + id="load-labware-1", + createdAt=datetime.now(), + key="load-labware-1", + status=CommandStatus.SUCCEEDED, + result=LoadLabwareResult( + labwareId="labware-id-1", + definition=nice_labware_definition, + offsetId=None, + ), + params=LoadLabwareParams( + location=ModuleLocation(moduleId="module-id-1"), + loadName=nice_labware_definition.parameters.loadName, + namespace=nice_labware_definition.namespace, + version=nice_labware_definition.version, + ), + ), + state_update=StateUpdate( + loaded_labware=LoadedLabwareUpdate( + labware_id="labware-id-1", + definition=nice_labware_definition, + offset_id=None, + new_location=ModuleLocation(moduleId="module-id-1"), + display_name=None, + ), + flex_stacker_state_update=FlexStackerStateUpdate( + module_id="module-id-1", + hopper_labware_update=FlexStackerLoadHopperLabware( + labware_id="labware-id-1" + ), + ), + ), + ) + + module_store.handle_action(load_module) + addressable_area_store.handle_action(load_module) + module_store.handle_action(load_labware) + labware_store.handle_action(load_labware) + location_sequence = subject.get_location_sequence("labware-id-1") + assert location_sequence == [ + OnAddressableAreaLocationSequenceComponent( + addressableAreaName="flexStackerModuleV1A4" + ), + OnModuleLocationSequenceComponent(moduleId="module-id-1"), + NotOnDeckLocationSequenceComponent(logicalLocationName=OFF_DECK_LOCATION), + ] diff --git a/api/tests/opentrons/protocol_runner/test_legacy_command_mapper.py b/api/tests/opentrons/protocol_runner/test_legacy_command_mapper.py index a91066c01f8..151fecd1d03 100644 --- a/api/tests/opentrons/protocol_runner/test_legacy_command_mapper.py +++ b/api/tests/opentrons/protocol_runner/test_legacy_command_mapper.py @@ -1,4 +1,5 @@ """Tests for the PythonAndLegacyRunner's LegacyCommandMapper.""" + import inspect from datetime import datetime from typing import cast diff --git a/robot-server/tests/integration/http_api/protocols/test_v6_json_upload.tavern.yaml b/robot-server/tests/integration/http_api/protocols/test_v6_json_upload.tavern.yaml index 4d3f655a929..6b6de70fb72 100644 --- a/robot-server/tests/integration/http_api/protocols/test_v6_json_upload.tavern.yaml +++ b/robot-server/tests/integration/http_api/protocols/test_v6_json_upload.tavern.yaml @@ -207,6 +207,15 @@ stages: result: labwareId: sourcePlateId definition: !anydict + locationSequence: + - kind: onModule + moduleId: temperatureModuleId + - kind: onAddressableArea + addressableAreaName: '1' + - kind: onCutoutFixture + cutoutId: cutout1 + possibleCutoutFixtureIds: + - 'singleStandardSlot' notes: [] startedAt: !re_fullmatch "\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d+(Z|([+-]\\d{2}:\\d{2}))" completedAt: !re_fullmatch "\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d+(Z|([+-]\\d{2}:\\d{2}))" @@ -226,6 +235,15 @@ stages: result: labwareId: destPlateId definition: !anydict + locationSequence: + - kind: onModule + moduleId: magneticModuleId + - kind: onAddressableArea + addressableAreaName: '3' + - kind: onCutoutFixture + cutoutId: cutout3 + possibleCutoutFixtureIds: + - 'singleStandardSlot' notes: [] startedAt: !re_fullmatch "\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d+(Z|([+-]\\d{2}:\\d{2}))" completedAt: !re_fullmatch "\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d+(Z|([+-]\\d{2}:\\d{2}))" @@ -245,6 +263,13 @@ stages: result: labwareId: tipRackId definition: !anydict + locationSequence: + - kind: onAddressableArea + addressableAreaName: '8' + - kind: onCutoutFixture + cutoutId: cutout8 + possibleCutoutFixtureIds: + - 'singleStandardSlot' notes: [] startedAt: !re_fullmatch "\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d+(Z|([+-]\\d{2}:\\d{2}))" completedAt: !re_fullmatch "\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d+(Z|([+-]\\d{2}:\\d{2}))" diff --git a/robot-server/tests/integration/http_api/protocols/test_v8_json_upload_flex.tavern.yaml b/robot-server/tests/integration/http_api/protocols/test_v8_json_upload_flex.tavern.yaml index ff42ba79367..c3afd71907e 100644 --- a/robot-server/tests/integration/http_api/protocols/test_v8_json_upload_flex.tavern.yaml +++ b/robot-server/tests/integration/http_api/protocols/test_v8_json_upload_flex.tavern.yaml @@ -92,15 +92,16 @@ stages: runTimeParameters: [] commandAnnotations: - annotationType: custom - commandKeys: [ - 1abc123, - 2abc123, - 3abc123, - 4abc123, - 5abc123, - 6abc123, - 7abc123, - ] + commandKeys: + [ + 1abc123, + 2abc123, + 3abc123, + 4abc123, + 5abc123, + 6abc123, + 7abc123, + ] pipettes: - id: pipetteId pipetteName: p1000_96 @@ -217,6 +218,20 @@ stages: result: labwareId: sourcePlateId definition: !anydict + locationSequence: + - kind: onAddressableArea + addressableAreaName: temperatureModuleV2D1 + - kind: onModule + moduleId: temperatureModuleId + - kind: onCutoutFixture + cutoutId: cutoutD1 + # note: this is not how it should work and happens because the loadModule + # command always loads onto an addressable area, presenting a conflict between + # the cutout fixture required by the module being present and the cutout fixture + # required by the deck slot addressable area that was used to load the module + # being present. other work will fix this, and once that other work is merged + # this value should be ["temperatureModuleV2"] + possibleCutoutFixtureIds: [] notes: [] startedAt: !re_fullmatch "\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d+(Z|([+-]\\d{2}:\\d{2}))" completedAt: !re_fullmatch "\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d+(Z|([+-]\\d{2}:\\d{2}))" @@ -236,6 +251,15 @@ stages: result: labwareId: destPlateId definition: !anydict + locationSequence: + - kind: onAddressableArea + addressableAreaName: magneticBlockV1D3 + - kind: onModule + moduleId: magneticBlockId + - kind: onCutoutFixture + cutoutId: cutoutD3 + # note: this should be ["magneticBlockV1"], see above + possibleCutoutFixtureIds: [] notes: [] startedAt: !re_fullmatch "\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d+(Z|([+-]\\d{2}:\\d{2}))" completedAt: !re_fullmatch "\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d+(Z|([+-]\\d{2}:\\d{2}))" @@ -255,6 +279,13 @@ stages: result: labwareId: tipRackId definition: !anydict + locationSequence: + - kind: onAddressableArea + addressableAreaName: B2 + - kind: onCutoutFixture + cutoutId: cutoutB2 + possibleCutoutFixtureIds: + - singleCenterSlot notes: [] startedAt: !re_fullmatch "\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d+(Z|([+-]\\d{2}:\\d{2}))" completedAt: !re_fullmatch "\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d+(Z|([+-]\\d{2}:\\d{2}))" @@ -274,6 +305,15 @@ stages: result: labwareId: fixedTrash definition: !anydict + locationSequence: + - kind: onAddressableArea + addressableAreaName: A3 + - kind: onCutoutFixture + cutoutId: cutoutA3 + possibleCutoutFixtureIds: + - flexStackerModuleV1 + - singleRightSlot + - stagingAreaRightSlot notes: [] startedAt: !re_fullmatch "\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d+(Z|([+-]\\d{2}:\\d{2}))" completedAt: !re_fullmatch "\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d+(Z|([+-]\\d{2}:\\d{2}))" diff --git a/robot-server/tests/integration/http_api/protocols/test_v8_json_upload_ot2.tavern.yaml b/robot-server/tests/integration/http_api/protocols/test_v8_json_upload_ot2.tavern.yaml index 456dd76089d..a4e20528280 100644 --- a/robot-server/tests/integration/http_api/protocols/test_v8_json_upload_ot2.tavern.yaml +++ b/robot-server/tests/integration/http_api/protocols/test_v8_json_upload_ot2.tavern.yaml @@ -90,15 +90,16 @@ stages: runTimeParameters: [] commandAnnotations: - annotationType: custom - commandKeys: [ - 1abc123, - 2abc123, - 3abc123, - 4abc123, - 5abc123, - 6abc123, - 7abc123, - ] + commandKeys: + [ + 1abc123, + 2abc123, + 3abc123, + 4abc123, + 5abc123, + 6abc123, + 7abc123, + ] pipettes: - id: pipetteId pipetteName: p10_single @@ -217,6 +218,15 @@ stages: result: labwareId: sourcePlateId definition: !anydict + locationSequence: + - kind: onModule + moduleId: temperatureModuleId + - kind: onAddressableArea + addressableAreaName: '1' + - kind: onCutoutFixture + cutoutId: cutout1 + possibleCutoutFixtureIds: + - singleStandardSlot notes: [] startedAt: !re_fullmatch "\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d+(Z|([+-]\\d{2}:\\d{2}))" completedAt: !re_fullmatch "\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d+(Z|([+-]\\d{2}:\\d{2}))" @@ -236,6 +246,15 @@ stages: result: labwareId: destPlateId definition: !anydict + locationSequence: + - kind: onModule + moduleId: magneticModuleId + - kind: onAddressableArea + addressableAreaName: '3' + - kind: onCutoutFixture + cutoutId: cutout3 + possibleCutoutFixtureIds: + - singleStandardSlot notes: [] startedAt: !re_fullmatch "\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d+(Z|([+-]\\d{2}:\\d{2}))" completedAt: !re_fullmatch "\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d+(Z|([+-]\\d{2}:\\d{2}))" @@ -255,6 +274,13 @@ stages: result: labwareId: tipRackId definition: !anydict + locationSequence: + - kind: onAddressableArea + addressableAreaName: '8' + - kind: onCutoutFixture + cutoutId: cutout8 + possibleCutoutFixtureIds: + - singleStandardSlot notes: [] startedAt: !re_fullmatch "\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d+(Z|([+-]\\d{2}:\\d{2}))" completedAt: !re_fullmatch "\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d+(Z|([+-]\\d{2}:\\d{2}))" @@ -274,6 +300,13 @@ stages: result: labwareId: fixedTrash definition: !anydict + locationSequence: + - kind: onAddressableArea + addressableAreaName: '12' + - kind: onCutoutFixture + cutoutId: cutout12 + possibleCutoutFixtureIds: + - singleStandardSlot notes: [] startedAt: !re_fullmatch "\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d+(Z|([+-]\\d{2}:\\d{2}))" completedAt: !re_fullmatch "\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d+(Z|([+-]\\d{2}:\\d{2}))" diff --git a/shared-data/command/types/setup.ts b/shared-data/command/types/setup.ts index 7180abfd6f9..c112c5e9b33 100644 --- a/shared-data/command/types/setup.ts +++ b/shared-data/command/types/setup.ts @@ -144,6 +144,43 @@ export type NonStackedLocation = export interface ModuleLocation { slotName: string } + +export interface OnLabwareLocationSequenceComponent { + kind: 'onLabware' + labwareId: string + lidId: string | null +} + +export interface OnModuleLocationSequenceComponent { + kind: 'onModule' + moduleId: string +} + +export interface OnAddressableAreaLocationSequenceComponent { + kind: 'onAddressableArea' + addressableAreaName: string +} + +export interface NotOnDeckLocationSequenceComponent { + kind: 'notOnDeck' + logicalLocationName: 'offDeck' | 'systemLocation' +} + +export interface OnCutoutFixtureLocationSequenceComponent { + kind: 'onCutoutFixture' + cutoutId: string + possibleCutoutFixtureIds: string[] +} + +export type LocationSequenceComponent = + | OnLabwareLocationSequenceComponent + | OnModuleLocationSequenceComponent + | OnAddressableAreaLocationSequenceComponent + | NotOnDeckLocationSequenceComponent + | OnCutoutFixtureLocationSequenceComponent + +export type LabwareLocationSequence = LocationSequenceComponent[] + export interface LoadPipetteParams { pipetteName: string pipetteId: string @@ -166,10 +203,12 @@ interface LoadLabwareResult { // todo(mm, 2024-08-19): This does not match the server-returned offsetId field. // Confirm nothing client-side is trying to use this, then replace it with offsetId. offset: LabwareOffset + locationSequence?: LabwareLocationSequence } interface ReloadLabwareResult { labwareId: string offsetId?: string | null + locationSequence?: LabwareLocationSequence } export type LabwareMovementStrategy = @@ -184,6 +223,9 @@ export interface MoveLabwareParams { } interface MoveLabwareResult { offsetId: string + eventualDestinationLocationSequence?: LabwareLocationSequence + immediateDestinationLocationSequence?: LabwareLocationSequence + originLocationSequence?: LabwareLocationSequence } interface LoadModuleParams { moduleId?: string @@ -238,6 +280,8 @@ interface LoadLidStackResult { labwareIds: string[] definition: LabwareDefinition2 location: LabwareLocation + stackLocationSequence?: LabwareLocationSequence + locationSequences?: LabwareLocationSequence[] } interface LoadLidParams { @@ -250,4 +294,5 @@ interface LoadLidParams { interface LoadLidResult { labwareId: string definition: LabwareDefinition2 + locationSequence?: LabwareLocationSequence } From 875346d9d3433f80259633fa5c86b88b54cf8387 Mon Sep 17 00:00:00 2001 From: Jethary Alcid <66035149+jerader@users.noreply.github.com> Date: Tue, 11 Feb 2025 11:01:58 -0500 Subject: [PATCH 113/150] feat(protocol-designer): load module in python file (#17483) addresses a bit of AUTH-1092 --- .../file-data/__tests__/createFile.test.ts | 20 +++++-- .../file-data/__tests__/pythonFile.test.ts | 57 ++++++++++++++++++- .../src/file-data/selectors/fileCreator.ts | 24 ++++---- .../src/file-data/selectors/pythonFile.ts | 39 ++++++++++++- 4 files changed, 118 insertions(+), 22 deletions(-) diff --git a/protocol-designer/src/file-data/__tests__/createFile.test.ts b/protocol-designer/src/file-data/__tests__/createFile.test.ts index 527e1cccf20..4b3ad1103ca 100644 --- a/protocol-designer/src/file-data/__tests__/createFile.test.ts +++ b/protocol-designer/src/file-data/__tests__/createFile.test.ts @@ -70,6 +70,12 @@ describe('createFile selector', () => { afterEach(() => { vi.restoreAllMocks() }) + const entities = { + moduleEntities: v7Fixture.moduleEntities, + labwareEntities, + pipetteEntities, + liquidEntities: ingredients, + } it('should return a schema-valid JSON V8 protocol', () => { // @ts-expect-error(sa, 2021-6-15): resultFunc not part of Selector type const result = createFile.resultFunc( @@ -78,16 +84,13 @@ describe('createFile selector', () => { v7Fixture.robotStateTimeline, OT2_ROBOT_TYPE, dismissedWarnings, - ingredients, ingredLocations, v7Fixture.savedStepForms, v7Fixture.orderedStepIds, - labwareEntities, - v7Fixture.moduleEntities, - pipetteEntities, labwareNicknamesById, labwareDefsByURI, - {} + {}, + entities ) expectResultToMatchSchema(result) @@ -99,7 +102,12 @@ describe('createFile selector', () => { it('should return a valid Python protocol file', () => { // @ts-expect-error(sa, 2021-6-15): resultFunc not part of Selector type - const result = createPythonFile.resultFunc(fileMetadata, OT2_ROBOT_TYPE, {}) + const result = createPythonFile.resultFunc( + fileMetadata, + OT2_ROBOT_TYPE, + entities, + v7Fixture.initialRobotState + ) // This is just a quick smoke test to make sure createPythonFile() produces // something that looks like a Python file. The individual sections of the // generated Python will be tested in separate unit tests. diff --git a/protocol-designer/src/file-data/__tests__/pythonFile.test.ts b/protocol-designer/src/file-data/__tests__/pythonFile.test.ts index cb7f526606f..27fb606865d 100644 --- a/protocol-designer/src/file-data/__tests__/pythonFile.test.ts +++ b/protocol-designer/src/file-data/__tests__/pythonFile.test.ts @@ -1,6 +1,19 @@ import { describe, it, expect } from 'vitest' -import { FLEX_ROBOT_TYPE, OT2_ROBOT_TYPE } from '@opentrons/shared-data' -import { pythonMetadata, pythonRequirements } from '../selectors/pythonFile' +import { + FLEX_ROBOT_TYPE, + HEATERSHAKER_MODULE_TYPE, + HEATERSHAKER_MODULE_V1, + MAGNETIC_BLOCK_TYPE, + MAGNETIC_BLOCK_V1, + OT2_ROBOT_TYPE, +} from '@opentrons/shared-data' +import { + getLoadModules, + pythonMetadata, + pythonRequirements, +} from '../selectors/pythonFile' +import type { TimelineFrame } from '@opentrons/step-generation' +import type { ModuleEntities } from '../../step-forms' describe('pythonMetadata', () => { it('should generate metadata section', () => { @@ -50,3 +63,43 @@ requirements = { ) }) }) + +describe('getLoadModules', () => { + it('should generate loadModules', () => { + const moduleId = '1' + const moduleId2 = '2' + const moduleId3 = '3' + const mockModuleEntities: ModuleEntities = { + [moduleId]: { + id: moduleId, + model: MAGNETIC_BLOCK_V1, + type: MAGNETIC_BLOCK_TYPE, + pythonName: 'magnetic_block_1', + }, + [moduleId2]: { + id: moduleId2, + model: HEATERSHAKER_MODULE_V1, + type: HEATERSHAKER_MODULE_TYPE, + pythonName: 'heater_shaker_1', + }, + [moduleId3]: { + id: moduleId3, + model: MAGNETIC_BLOCK_V1, + type: MAGNETIC_BLOCK_TYPE, + pythonName: 'magnetic_block_2', + }, + } + const modules: TimelineFrame['modules'] = { + [moduleId]: { slot: 'B1', moduleState: {} as any }, + [moduleId2]: { slot: 'A1', moduleState: {} as any }, + [moduleId3]: { slot: 'A2', moduleState: {} as any }, + } + + expect(getLoadModules(mockModuleEntities, modules)).toBe( + `# Load Modules: +magnetic_block_1 = protocol.load_module("magneticBlockV1", "B1") +heater_shaker_1 = protocol.load_module("heaterShakerModuleV1", "A1") +magnetic_block_2 = protocol.load_module("magneticBlockV1", "A2")` + ) + }) +}) diff --git a/protocol-designer/src/file-data/selectors/fileCreator.ts b/protocol-designer/src/file-data/selectors/fileCreator.ts index a12547a3b70..2a0d99c8cc3 100644 --- a/protocol-designer/src/file-data/selectors/fileCreator.ts +++ b/protocol-designer/src/file-data/selectors/fileCreator.ts @@ -99,34 +99,34 @@ export const createFile: Selector = createSelector( getRobotStateTimeline, getRobotType, dismissSelectors.getAllDismissedWarnings, - stepFormSelectors.getLiquidEntities, ingredSelectors.getLiquidsByLabwareId, stepFormSelectors.getSavedStepForms, stepFormSelectors.getOrderedStepIds, - stepFormSelectors.getLabwareEntities, - stepFormSelectors.getModuleEntities, - stepFormSelectors.getPipetteEntities, uiLabwareSelectors.getLabwareNicknamesById, labwareDefSelectors.getLabwareDefsByURI, getStepGroups, + stepFormSelectors.getInvariantContext, ( fileMetadata, initialRobotState, robotStateTimeline, robotType, dismissedWarnings, - liquidEntities, ingredLocations, savedStepForms, orderedStepIds, - labwareEntities, - moduleEntities, - pipetteEntities, labwareNicknamesById, labwareDefsByURI, - stepGroups + stepGroups, + invariantContext ) => { const { author, description, created } = fileMetadata + const { + pipetteEntities, + labwareEntities, + liquidEntities, + moduleEntities, + } = invariantContext const loadCommands = getLoadCommands( initialRobotState, @@ -308,14 +308,16 @@ export const createFile: Selector = createSelector( export const createPythonFile: Selector = createSelector( getFileMetadata, getRobotType, - (fileMetadata, robotType) => { + stepFormSelectors.getInvariantContext, + getInitialRobotState, + (fileMetadata, robotType, invariantContext, robotState) => { return ( [ // Here are the sections of the Python file: pythonImports(), pythonMetadata(fileMetadata), pythonRequirements(robotType), - pythonDefRun(), + pythonDefRun(invariantContext, robotState), ] .filter(section => section) // skip any blank sections .join('\n\n') + '\n' diff --git a/protocol-designer/src/file-data/selectors/pythonFile.ts b/protocol-designer/src/file-data/selectors/pythonFile.ts index e4d9e63eec0..59d8b747d6f 100644 --- a/protocol-designer/src/file-data/selectors/pythonFile.ts +++ b/protocol-designer/src/file-data/selectors/pythonFile.ts @@ -3,11 +3,17 @@ import { FLEX_ROBOT_TYPE, OT2_ROBOT_TYPE } from '@opentrons/shared-data' import { formatPyDict, + formatPyStr, indentPyLines, PROTOCOL_CONTEXT_NAME, } from '@opentrons/step-generation' -import type { FileMetadataFields } from '../types' +import type { + InvariantContext, + ModuleEntities, + TimelineFrame, +} from '@opentrons/step-generation' import type { RobotType } from '@opentrons/shared-data' +import type { FileMetadataFields } from '../types' const PAPI_VERSION = '2.23' // latest version from api/src/opentrons/protocols/api_support/definitions.py @@ -51,9 +57,36 @@ export function pythonRequirements(robotType: RobotType): string { return `requirements = ${formatPyDict(requirements)}` } -export function pythonDefRun(): string { +export function getLoadModules( + moduleEntities: ModuleEntities, + moduleRobotState: TimelineFrame['modules'] +): string { + const hasModules = Object.keys(moduleEntities).length > 0 + const pythonModules = hasModules + ? Object.values(moduleEntities) + .map(module => { + // pythonIdentifier (module.model) from api/src/opentrons/protocol_api/validation.py#L373 + return `${ + module.pythonName + } = ${PROTOCOL_CONTEXT_NAME}.load_module(${formatPyStr( + module.model + )}, ${formatPyStr(moduleRobotState[module.id].slot)})` + }) + .join('\n') + : '' + return hasModules ? `# Load Modules:\n${pythonModules}` : '' +} + +export function pythonDefRun( + invariantContext: InvariantContext, + robotState: TimelineFrame +): string { + const { moduleEntities } = invariantContext + + const loadModules = getLoadModules(moduleEntities, robotState.modules) + const sections: string[] = [ - // loadModules(), + loadModules, // loadLabware(), // loadInstruments(), // defineLiquids(), From 98f71754588b63c35effb4bb3e97b422961dabb4 Mon Sep 17 00:00:00 2001 From: Josh McVey Date: Tue, 11 Feb 2025 11:04:29 -0600 Subject: [PATCH 114/150] chore(ci): update deprecated GitHub actions tools (#17494) --- .github/workflows/components-test-build-deploy.yaml | 4 ++-- .github/workflows/ll-test-build-deploy.yaml | 4 ++-- .github/workflows/pd-test-build-deploy.yaml | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/components-test-build-deploy.yaml b/.github/workflows/components-test-build-deploy.yaml index 3eba5c64a4b..2b10617c283 100644 --- a/.github/workflows/components-test-build-deploy.yaml +++ b/.github/workflows/components-test-build-deploy.yaml @@ -105,7 +105,7 @@ jobs: - name: 'build components' run: make -C components - name: 'upload github artifact' - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: 'components-artifact' path: storybook-static @@ -158,7 +158,7 @@ jobs: const { buildComplexEnvVars } = require(`${process.env.GITHUB_WORKSPACE}/.github/workflows/utils.js`) buildComplexEnvVars(core, context) - name: 'download components build' - uses: 'actions/download-artifact@v3' + uses: 'actions/download-artifact@v4' with: name: components-artifact path: ./dist diff --git a/.github/workflows/ll-test-build-deploy.yaml b/.github/workflows/ll-test-build-deploy.yaml index e00e9b9cab9..35cbc96eced 100644 --- a/.github/workflows/ll-test-build-deploy.yaml +++ b/.github/workflows/ll-test-build-deploy.yaml @@ -164,7 +164,7 @@ jobs: run: | make -C labware-library - name: 'upload github artifact' - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: 'll-artifact' path: labware-library/dist @@ -197,7 +197,7 @@ jobs: const { buildComplexEnvVars } = require(`${process.env.GITHUB_WORKSPACE}/.github/workflows/utils.js`) buildComplexEnvVars(core, context) - name: 'download LL build' - uses: 'actions/download-artifact@v3' + uses: 'actions/download-artifact@v4' with: name: ll-artifact path: ./dist diff --git a/.github/workflows/pd-test-build-deploy.yaml b/.github/workflows/pd-test-build-deploy.yaml index ce28d79e9a5..60a52ec38fd 100644 --- a/.github/workflows/pd-test-build-deploy.yaml +++ b/.github/workflows/pd-test-build-deploy.yaml @@ -58,7 +58,7 @@ jobs: sudo rm -f /etc/apt/sources.list.d/microsoft-prod.list sudo apt-get update && sudo apt-get install libudev-dev - name: 'cache yarn cache' - uses: actions/cache@v2 + uses: actions/cache@v3 with: path: | ${{ github.workspace }}/.yarn-cache @@ -164,7 +164,7 @@ jobs: run: | make -C protocol-designer NODE_ENV=development - name: 'upload github artifact' - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: 'pd-artifact' path: protocol-designer/dist @@ -197,7 +197,7 @@ jobs: const { buildComplexEnvVars } = require(`${process.env.GITHUB_WORKSPACE}/.github/workflows/utils.js`) buildComplexEnvVars(core, context) - name: 'download PD build' - uses: 'actions/download-artifact@v3' + uses: 'actions/download-artifact@v4' with: name: pd-artifact path: ./dist From 024b4e9ed8595935864f9a9f339b5df4e99e61c2 Mon Sep 17 00:00:00 2001 From: Jethary Alcid <66035149+jerader@users.noreply.github.com> Date: Tue, 11 Feb 2025 14:00:59 -0500 Subject: [PATCH 115/150] feat(protocol-designer): loadAdapter and loadLabware python file (#17495) partially addresses AUTH-1092 This pr creates the `load_adapter` and `load_labware` api commands in the python export file. This also fixes a bug with generating the `pythonNames` for adapters in the `createContainer` redux action where the `displayCategory` for the adapter was incorrectly the `displayCategory` for the labware --- .../file-data/__tests__/createFile.test.ts | 5 +- .../file-data/__tests__/pythonFile.test.ts | 141 ++++++++++++++---- .../src/file-data/selectors/pythonFile.ts | 69 ++++++++- .../src/labware-ingred/actions/thunks.ts | 11 +- 4 files changed, 191 insertions(+), 35 deletions(-) diff --git a/protocol-designer/src/file-data/__tests__/createFile.test.ts b/protocol-designer/src/file-data/__tests__/createFile.test.ts index 4b3ad1103ca..cf651c62733 100644 --- a/protocol-designer/src/file-data/__tests__/createFile.test.ts +++ b/protocol-designer/src/file-data/__tests__/createFile.test.ts @@ -129,7 +129,10 @@ requirements = { } def run(protocol: protocol_api.ProtocolContext): - pass + # Load Labware: + mockPythonName = protocol.load_labware("fixture_trash", "12") + mockPythonName = protocol.load_labware("fixture_tiprack_10_ul", "1") + mockPythonName = protocol.load_labware("fixture_96_plate", "7") `.trimStart() ) }) diff --git a/protocol-designer/src/file-data/__tests__/pythonFile.test.ts b/protocol-designer/src/file-data/__tests__/pythonFile.test.ts index 27fb606865d..9492b9be825 100644 --- a/protocol-designer/src/file-data/__tests__/pythonFile.test.ts +++ b/protocol-designer/src/file-data/__tests__/pythonFile.test.ts @@ -6,13 +6,18 @@ import { MAGNETIC_BLOCK_TYPE, MAGNETIC_BLOCK_V1, OT2_ROBOT_TYPE, + fixture96Plate, + fixtureTiprackAdapter, } from '@opentrons/shared-data' import { + getLoadAdapters, + getLoadLabware, getLoadModules, pythonMetadata, pythonRequirements, } from '../selectors/pythonFile' -import type { TimelineFrame } from '@opentrons/step-generation' +import type { LabwareDefinition2 } from '@opentrons/shared-data' +import type { LabwareEntities, TimelineFrame } from '@opentrons/step-generation' import type { ModuleEntities } from '../../step-forms' describe('pythonMetadata', () => { @@ -64,31 +69,83 @@ requirements = { }) }) +const moduleId = '1' +const moduleId2 = '2' +const moduleId3 = '3' +const mockModuleEntities: ModuleEntities = { + [moduleId]: { + id: moduleId, + model: MAGNETIC_BLOCK_V1, + type: MAGNETIC_BLOCK_TYPE, + pythonName: 'magnetic_block_1', + }, + [moduleId2]: { + id: moduleId2, + model: HEATERSHAKER_MODULE_V1, + type: HEATERSHAKER_MODULE_TYPE, + pythonName: 'heater_shaker_1', + }, + [moduleId3]: { + id: moduleId3, + model: MAGNETIC_BLOCK_V1, + type: MAGNETIC_BLOCK_TYPE, + pythonName: 'magnetic_block_2', + }, +} +const labwareId1 = 'labwareId1' +const labwareId2 = 'labwareId2' +const labwareId3 = 'labwareId3' +const labwareId4 = 'labwareId4' +const labwareId5 = 'labwareId5' + +const mockLabwareEntities: LabwareEntities = { + [labwareId1]: { + id: labwareId1, + labwareDefURI: 'fixture/fixture_flex_96_tiprack_adapter/1', + def: fixtureTiprackAdapter as LabwareDefinition2, + pythonName: 'adapter_1', + }, + [labwareId2]: { + id: labwareId2, + labwareDefURI: 'fixture/fixture_flex_96_tiprack_adapter/1', + def: fixtureTiprackAdapter as LabwareDefinition2, + pythonName: 'adapter_2', + }, + [labwareId3]: { + id: labwareId3, + labwareDefURI: 'fixture/fixture_96_plate/1', + def: fixture96Plate as LabwareDefinition2, + pythonName: 'well_plate_1', + }, + [labwareId4]: { + id: labwareId4, + labwareDefURI: 'fixture/fixture_96_plate/1', + def: fixture96Plate as LabwareDefinition2, + pythonName: 'well_plate_2', + }, + [labwareId5]: { + id: labwareId5, + labwareDefURI: 'fixture/fixture_96_plate/1', + def: fixture96Plate as LabwareDefinition2, + pythonName: 'well_plate_3', + }, +} + +const labwareRobotState: TimelineFrame['labware'] = { + // adapter on a module + [labwareId1]: { slot: moduleId }, + // adapter on a slot + [labwareId2]: { slot: 'B2' }, + // labware on an adapter on a slot + [labwareId3]: { slot: labwareId2 }, + // labware on a module + [labwareId4]: { slot: moduleId3 }, + // labware on a slot + [labwareId5]: { slot: 'C2' }, +} + describe('getLoadModules', () => { it('should generate loadModules', () => { - const moduleId = '1' - const moduleId2 = '2' - const moduleId3 = '3' - const mockModuleEntities: ModuleEntities = { - [moduleId]: { - id: moduleId, - model: MAGNETIC_BLOCK_V1, - type: MAGNETIC_BLOCK_TYPE, - pythonName: 'magnetic_block_1', - }, - [moduleId2]: { - id: moduleId2, - model: HEATERSHAKER_MODULE_V1, - type: HEATERSHAKER_MODULE_TYPE, - pythonName: 'heater_shaker_1', - }, - [moduleId3]: { - id: moduleId3, - model: MAGNETIC_BLOCK_V1, - type: MAGNETIC_BLOCK_TYPE, - pythonName: 'magnetic_block_2', - }, - } const modules: TimelineFrame['modules'] = { [moduleId]: { slot: 'B1', moduleState: {} as any }, [moduleId2]: { slot: 'A1', moduleState: {} as any }, @@ -96,10 +153,42 @@ describe('getLoadModules', () => { } expect(getLoadModules(mockModuleEntities, modules)).toBe( - `# Load Modules: + ` +# Load Modules: magnetic_block_1 = protocol.load_module("magneticBlockV1", "B1") heater_shaker_1 = protocol.load_module("heaterShakerModuleV1", "A1") -magnetic_block_2 = protocol.load_module("magneticBlockV1", "A2")` +magnetic_block_2 = protocol.load_module("magneticBlockV1", "A2")`.trimStart() + ) + }) +}) + +describe('getLoadAdapters', () => { + it('should generate loadAdapters for 2 adapters', () => { + expect( + getLoadAdapters( + mockModuleEntities, + mockLabwareEntities, + labwareRobotState + ) + ).toBe( + ` +# Load Adapters: +adapter_1 = magnetic_block_1.load_adapter("fixture_flex_96_tiprack_adapter") +adapter_2 = protocol.load_adapter("fixture_flex_96_tiprack_adapter", "B2")`.trimStart() + ) + }) +}) + +describe('getLoadLabware', () => { + it('should generate loadLabware for 3 labware', () => { + expect( + getLoadLabware(mockModuleEntities, mockLabwareEntities, labwareRobotState) + ).toBe( + ` +# Load Labware: +well_plate_1 = adapter_2.load_labware("fixture_96_plate") +well_plate_2 = magnetic_block_2.load_labware("fixture_96_plate") +well_plate_3 = protocol.load_labware("fixture_96_plate", "C2")`.trimStart() ) }) }) diff --git a/protocol-designer/src/file-data/selectors/pythonFile.ts b/protocol-designer/src/file-data/selectors/pythonFile.ts index 59d8b747d6f..0643b406439 100644 --- a/protocol-designer/src/file-data/selectors/pythonFile.ts +++ b/protocol-designer/src/file-data/selectors/pythonFile.ts @@ -9,6 +9,7 @@ import { } from '@opentrons/step-generation' import type { InvariantContext, + LabwareEntities, ModuleEntities, TimelineFrame, } from '@opentrons/step-generation' @@ -77,17 +78,77 @@ export function getLoadModules( return hasModules ? `# Load Modules:\n${pythonModules}` : '' } +export function getLoadAdapters( + moduleEntities: ModuleEntities, + labwareEntities: LabwareEntities, + labwareRobotState: TimelineFrame['labware'] +): string { + const adapterEntities = Object.values(labwareEntities).filter(lw => + lw.def.allowedRoles?.includes('adapter') + ) + const pythonAdapters = Object.values(adapterEntities) + .map(adapter => { + const adapterSlot = labwareRobotState[adapter.id].slot + const onModule = moduleEntities[adapterSlot] != null + const location = onModule + ? moduleEntities[adapterSlot].pythonName + : PROTOCOL_CONTEXT_NAME + const slotInfo = onModule ? '' : `, ${formatPyStr(adapterSlot)}` + + return `${adapter.pythonName} = ${location}.load_adapter(${formatPyStr( + adapter.def.parameters.loadName + )}${slotInfo})` + }) + .join('\n') + + return pythonAdapters ? `# Load Adapters:\n${pythonAdapters}` : '' +} + +export function getLoadLabware( + moduleEntities: ModuleEntities, + allLabwareEntities: LabwareEntities, + labwareRobotState: TimelineFrame['labware'] +): string { + const labwareEntities = Object.values(allLabwareEntities).filter( + lw => !lw.def.allowedRoles?.includes('adapter') + ) + const pythonLabware = Object.values(labwareEntities) + .map(labware => { + const labwareSlot = labwareRobotState[labware.id].slot + const onModule = moduleEntities[labwareSlot] != null + const onAdapter = allLabwareEntities[labwareSlot] != null + let location = PROTOCOL_CONTEXT_NAME + if (onAdapter) { + location = allLabwareEntities[labwareSlot].pythonName + } else if (onModule) { + location = moduleEntities[labwareSlot].pythonName + } + const slotInfo = + onModule || onAdapter ? '' : `, ${formatPyStr(labwareSlot)}` + + return `${labware.pythonName} = ${location}.load_labware(${formatPyStr( + labware.def.parameters.loadName + )}${slotInfo})` + }) + .join('\n') + + return pythonLabware ? `# Load Labware:\n${pythonLabware}` : '' +} + export function pythonDefRun( invariantContext: InvariantContext, robotState: TimelineFrame ): string { - const { moduleEntities } = invariantContext - - const loadModules = getLoadModules(moduleEntities, robotState.modules) + const { moduleEntities, labwareEntities } = invariantContext + const { modules, labware } = robotState + const loadModules = getLoadModules(moduleEntities, modules) + const loadAdapters = getLoadAdapters(moduleEntities, labwareEntities, labware) + const loadLabware = getLoadLabware(moduleEntities, labwareEntities, labware) const sections: string[] = [ loadModules, - // loadLabware(), + loadAdapters, + loadLabware, // loadInstruments(), // defineLiquids(), // loadLiquids(), diff --git a/protocol-designer/src/labware-ingred/actions/thunks.ts b/protocol-designer/src/labware-ingred/actions/thunks.ts index 02ed71678e8..061724c8c31 100644 --- a/protocol-designer/src/labware-ingred/actions/thunks.ts +++ b/protocol-designer/src/labware-ingred/actions/thunks.ts @@ -77,7 +77,7 @@ export const createContainer: ( const labwareDef = labwareDefSelectors.getLabwareDefsByURI(state)[ args.labwareDefURI ] - const displayCategory = labwareDef.metadata.displayCategory + const labwareDisplayCategory = labwareDef.metadata.displayCategory const slot = args.slot || getNextAvailableDeckSlot(initialDeckSetup, robotType, labwareDef) @@ -90,6 +90,9 @@ export const createContainer: ( : null if (adapterId != null && args.adapterUnderLabwareDefURI != null) { + const adapterDef = labwareDefSelectors.getLabwareDefsByURI(state)[ + args.adapterUnderLabwareDefURI + ] dispatch({ type: 'CREATE_CONTAINER', payload: { @@ -97,7 +100,7 @@ export const createContainer: ( labwareDefURI: args.adapterUnderLabwareDefURI, id: adapterId, slot, - displayCategory, + displayCategory: adapterDef.metadata.displayCategory, }, }) dispatch({ @@ -106,13 +109,13 @@ export const createContainer: ( ...args, id, slot: adapterId, - displayCategory, + displayCategory: labwareDisplayCategory, }, }) } else { dispatch({ type: 'CREATE_CONTAINER', - payload: { ...args, id, slot, displayCategory }, + payload: { ...args, id, slot, displayCategory: labwareDisplayCategory }, }) } if (isTiprack) { From 4c2e213610b186555839f219a0ddd41bc1d3fe8e Mon Sep 17 00:00:00 2001 From: TamarZanzouri Date: Tue, 11 Feb 2025 14:33:16 -0500 Subject: [PATCH 116/150] fix(api): recover from stall and an overpressure when dropping tip (#17471) --- .../commands/drop_tip_in_place.py | 73 +++++++++++++++++-- 1 file changed, 67 insertions(+), 6 deletions(-) diff --git a/api/src/opentrons/protocol_engine/commands/drop_tip_in_place.py b/api/src/opentrons/protocol_engine/commands/drop_tip_in_place.py index 09bd73b8bb1..60eb33625d6 100644 --- a/api/src/opentrons/protocol_engine/commands/drop_tip_in_place.py +++ b/api/src/opentrons/protocol_engine/commands/drop_tip_in_place.py @@ -1,12 +1,17 @@ """Drop tip in place command request, result, and implementation models.""" from __future__ import annotations -from typing import TYPE_CHECKING, Optional, Type, Any +from typing import TYPE_CHECKING, Optional, Type, Any, Union from pydantic import Field, BaseModel from pydantic.json_schema import SkipJsonSchema from typing_extensions import Literal +from opentrons_shared_data.errors.exceptions import ( + PipetteOverpressureError, + StallOrCollisionDetectedError, +) + from .command import ( AbstractCommandImpl, BaseCommand, @@ -14,7 +19,12 @@ DefinedErrorData, SuccessData, ) -from .pipetting_common import PipetteIdMixin, TipPhysicallyAttachedError +from .movement_common import StallOrCollisionError +from .pipetting_common import ( + PipetteIdMixin, + TipPhysicallyAttachedError, + OverpressureError, +) from ..errors.exceptions import TipAttachedError from ..errors.error_occurrence import ErrorOccurrence from ..resources.model_utils import ModelUtils @@ -51,9 +61,12 @@ class DropTipInPlaceResult(BaseModel): pass -_ExecuteReturn = ( - SuccessData[DropTipInPlaceResult] | DefinedErrorData[TipPhysicallyAttachedError] -) +_ExecuteReturn = Union[ + SuccessData[DropTipInPlaceResult] + | DefinedErrorData[TipPhysicallyAttachedError] + | DefinedErrorData[OverpressureError] + | DefinedErrorData[StallOrCollisionError] +] class DropTipInPlaceImplementation( @@ -105,6 +118,50 @@ async def execute(self, params: DropTipInPlaceParams) -> _ExecuteReturn: state_update=state_update, state_update_if_false_positive=state_update_if_false_positive, ) + except PipetteOverpressureError as exception: + state_update_if_false_positive = update_types.StateUpdate() + state_update_if_false_positive.update_pipette_tip_state( + pipette_id=params.pipetteId, tip_geometry=None + ) + state_update.set_fluid_unknown(pipette_id=params.pipetteId) + return DefinedErrorData( + public=OverpressureError( + id=self._model_utils.generate_id(), + createdAt=self._model_utils.get_timestamp(), + wrappedErrors=[ + ErrorOccurrence.from_failed( + id=self._model_utils.generate_id(), + createdAt=self._model_utils.get_timestamp(), + error=exception, + ) + ], + errorInfo={"retryLocation": retry_location}, + ), + state_update=state_update, + state_update_if_false_positive=state_update_if_false_positive, + ) + except StallOrCollisionDetectedError as exception: + state_update_if_false_positive = update_types.StateUpdate() + state_update_if_false_positive.update_pipette_tip_state( + pipette_id=params.pipetteId, tip_geometry=None + ) + state_update.set_fluid_unknown(pipette_id=params.pipetteId) + return DefinedErrorData( + public=StallOrCollisionError( + id=self._model_utils.generate_id(), + createdAt=self._model_utils.get_timestamp(), + wrappedErrors=[ + ErrorOccurrence.from_failed( + id=self._model_utils.generate_id(), + createdAt=self._model_utils.get_timestamp(), + error=exception, + ) + ], + errorInfo={"retryLocation": retry_location}, + ), + state_update=state_update, + state_update_if_false_positive=state_update_if_false_positive, + ) else: state_update.set_fluid_unknown(pipette_id=params.pipetteId) state_update.update_pipette_tip_state( @@ -114,7 +171,11 @@ async def execute(self, params: DropTipInPlaceParams) -> _ExecuteReturn: class DropTipInPlace( - BaseCommand[DropTipInPlaceParams, DropTipInPlaceResult, TipPhysicallyAttachedError] + BaseCommand[ + DropTipInPlaceParams, + DropTipInPlaceResult, + TipPhysicallyAttachedError | OverpressureError | StallOrCollisionError, + ] ): """Drop tip in place command model.""" From 831c4ae1e0ded4bd0287527434b8784d24568445 Mon Sep 17 00:00:00 2001 From: David Chau <46395074+ddcc4@users.noreply.github.com> Date: Tue, 11 Feb 2025 14:38:47 -0500 Subject: [PATCH 117/150] feat(protocol-designer): add placeholder for step commands to generated Python (#17496) # Overview This adds the Python output from `step-generation` into the generated Python file so that we can see our progress as we work. AUTH-1385 Right now, it just emits a placeholder that looks like: ``` def run(protocol: protocol_api.ProtocolContext): # PROTOCOL STEPS # Step 1: pass # Step 2: pass ``` ## Test Plan and Hands on Testing Updated unit test, and tested exporting a Python protocol by hand. ## Risk assessment Low. Python export is hidden under a feature flag, so this should have no observable impact to users. --- .../src/file-data/__tests__/createFile.test.ts | 8 +++++++- .../src/file-data/selectors/fileCreator.ts | 11 +++++++++-- .../src/file-data/selectors/pythonFile.ts | 18 ++++++++++++++++-- 3 files changed, 32 insertions(+), 5 deletions(-) diff --git a/protocol-designer/src/file-data/__tests__/createFile.test.ts b/protocol-designer/src/file-data/__tests__/createFile.test.ts index cf651c62733..392998fe000 100644 --- a/protocol-designer/src/file-data/__tests__/createFile.test.ts +++ b/protocol-designer/src/file-data/__tests__/createFile.test.ts @@ -106,7 +106,8 @@ describe('createFile selector', () => { fileMetadata, OT2_ROBOT_TYPE, entities, - v7Fixture.initialRobotState + v7Fixture.initialRobotState, + v7Fixture.robotStateTimeline ) // This is just a quick smoke test to make sure createPythonFile() produces // something that looks like a Python file. The individual sections of the @@ -133,6 +134,11 @@ def run(protocol: protocol_api.ProtocolContext): mockPythonName = protocol.load_labware("fixture_trash", "12") mockPythonName = protocol.load_labware("fixture_tiprack_10_ul", "1") mockPythonName = protocol.load_labware("fixture_96_plate", "7") + + # PROTOCOL STEPS + + # Step 1: + pass `.trimStart() ) }) diff --git a/protocol-designer/src/file-data/selectors/fileCreator.ts b/protocol-designer/src/file-data/selectors/fileCreator.ts index 2a0d99c8cc3..e9ddde221c7 100644 --- a/protocol-designer/src/file-data/selectors/fileCreator.ts +++ b/protocol-designer/src/file-data/selectors/fileCreator.ts @@ -310,14 +310,21 @@ export const createPythonFile: Selector = createSelector( getRobotType, stepFormSelectors.getInvariantContext, getInitialRobotState, - (fileMetadata, robotType, invariantContext, robotState) => { + getRobotStateTimeline, + ( + fileMetadata, + robotType, + invariantContext, + robotState, + robotStateTimeline + ) => { return ( [ // Here are the sections of the Python file: pythonImports(), pythonMetadata(fileMetadata), pythonRequirements(robotType), - pythonDefRun(invariantContext, robotState), + pythonDefRun(invariantContext, robotState, robotStateTimeline), ] .filter(section => section) // skip any blank sections .join('\n\n') + '\n' diff --git a/protocol-designer/src/file-data/selectors/pythonFile.ts b/protocol-designer/src/file-data/selectors/pythonFile.ts index 0643b406439..2896dfb320b 100644 --- a/protocol-designer/src/file-data/selectors/pythonFile.ts +++ b/protocol-designer/src/file-data/selectors/pythonFile.ts @@ -11,6 +11,7 @@ import type { InvariantContext, LabwareEntities, ModuleEntities, + Timeline, TimelineFrame, } from '@opentrons/step-generation' import type { RobotType } from '@opentrons/shared-data' @@ -135,9 +136,22 @@ export function getLoadLabware( return pythonLabware ? `# Load Labware:\n${pythonLabware}` : '' } +export function stepCommands(robotStateTimeline: Timeline): string { + return ( + '# PROTOCOL STEPS\n\n' + + robotStateTimeline.timeline + .map( + (timelineFrame, idx) => + `# Step ${idx + 1}:\n${timelineFrame.python || 'pass'}` + ) + .join('\n\n') + ) +} + export function pythonDefRun( invariantContext: InvariantContext, - robotState: TimelineFrame + robotState: TimelineFrame, + robotStateTimeline: Timeline ): string { const { moduleEntities, labwareEntities } = invariantContext const { modules, labware } = robotState @@ -152,7 +166,7 @@ export function pythonDefRun( // loadInstruments(), // defineLiquids(), // loadLiquids(), - // stepCommands(), + stepCommands(robotStateTimeline), ] const functionBody = sections From 4b054ad72567c28ffbf7922b1a4e503febc16471 Mon Sep 17 00:00:00 2001 From: Sara Kowalski <53955458+skowalski08@users.noreply.github.com> Date: Tue, 11 Feb 2025 14:59:52 -0500 Subject: [PATCH 118/150] test(protocol-designer): start of cypress happy path test for mix settings (#17320) # Overview Cypress happy path testing for mix settings ## Test Plan and Hands on Testing ## Changelog Added cypress actions and verifications for intended PD behavior ## Review requests ## Risk assessment --- protocol-designer/cypress.config.js | 15 - protocol-designer/cypress.config.ts | 10 + .../cypress/e2e/mixSettings.cy.ts | 77 +++ .../cypress/support/StepExecution.ts | 14 + protocol-designer/cypress/support/commands.ts | 25 +- .../cypress/support/mixSetting.ts | 527 ++++++++++++++++++ 6 files changed, 651 insertions(+), 17 deletions(-) delete mode 100644 protocol-designer/cypress.config.js create mode 100644 protocol-designer/cypress.config.ts create mode 100644 protocol-designer/cypress/e2e/mixSettings.cy.ts create mode 100644 protocol-designer/cypress/support/mixSetting.ts diff --git a/protocol-designer/cypress.config.js b/protocol-designer/cypress.config.js deleted file mode 100644 index 98d139cdcbc..00000000000 --- a/protocol-designer/cypress.config.js +++ /dev/null @@ -1,15 +0,0 @@ -const { defineConfig } = require('cypress') - -module.exports = defineConfig({ - video: false, - viewportWidth: 1440, - viewportHeight: 900, - e2e: { - // We've imported your old cypress plugins here. - // You may want to clean this up later by importing these. - setupNodeEvents(on, config) { - return require('./cypress/plugins/index.js')(on, config) - }, - baseUrl: 'http://localhost:5178', - }, -}) diff --git a/protocol-designer/cypress.config.ts b/protocol-designer/cypress.config.ts new file mode 100644 index 00000000000..7250102b7e3 --- /dev/null +++ b/protocol-designer/cypress.config.ts @@ -0,0 +1,10 @@ +import { defineConfig } from 'cypress' + +module.exports = defineConfig({ + video: false, + viewportWidth: 1440, + viewportHeight: 900, + e2e: { + baseUrl: 'http://localhost:5178', + }, +}) diff --git a/protocol-designer/cypress/e2e/mixSettings.cy.ts b/protocol-designer/cypress/e2e/mixSettings.cy.ts new file mode 100644 index 00000000000..2b1863b989d --- /dev/null +++ b/protocol-designer/cypress/e2e/mixSettings.cy.ts @@ -0,0 +1,77 @@ +import '../support/commands' +import { MixActions, MixVerifications } from '../support/mixSetting' +import { UniversalActions } from '../support/universalActions' +import { TestFilePath, getTestFile } from '../support/testFiles' +import { verifyImportProtocolPage } from '../support/import' +import { runSteps } from '../support/StepExecution' +import type { StepsList } from '../support/StepExecution' + +describe('Redesigned Mixing Steps - Happy Path', () => { + beforeEach(() => { + cy.visit('/') + cy.closeAnalyticsModal() + const protocol = getTestFile(TestFilePath.DoItAllV8) + cy.importProtocol(protocol.path) + verifyImportProtocolPage(protocol) + + // NOTE: vv make this chunk better// + cy.contains('Edit protocol').click() + cy.contains('Protocol steps').click() + cy.get('[id="AddStepButton"]').contains('Add Step').click() + cy.verifyOverflowBtn() + }) + + it('It should verify the working function of every permutation of mix checkboxes', () => { + const steps: StepsList = [ + MixActions.SelectMix, + UniversalActions.Snapshot, + MixVerifications.PartOne, + MixActions.SelectLabware, + MixActions.SelectWellInputField, + MixVerifications.WellSelectPopout, + UniversalActions.Snapshot, + MixActions.Save, + MixActions.EnterVolume, + MixActions.EnterMixReps, + MixActions.SelectTipHandling, + UniversalActions.Snapshot, + MixActions.Continue, + MixVerifications.PartTwoAsp, + MixActions.AspirateFlowRate, + MixActions.AspWellOrder, + MixVerifications.AspWellOrder, + MixActions.AspMixTipPos, + MixVerifications.AspMixTipPos, + MixActions.Delay, + MixActions.Dispense, + MixVerifications.PartTwoDisp, + MixActions.DispenseFlowRate, + MixActions.Delay, + MixActions.BlowoutLocation, + MixActions.BlowoutFlowRate, + MixActions.BlowoutPosFromTop, + MixVerifications.BlowoutPopout, + MixActions.Save, + MixVerifications.Blowout, + MixActions.TouchTip, + MixVerifications.TouchTipPopout, + MixActions.Save, + MixVerifications.TouchTip, + MixActions.Rename, + MixActions.Save, + MixVerifications.Rename, + MixActions.Save, + ] + runSteps(steps) + }) +}) + +/* +To Add: +MixActions.TipPosSideImageMove, +MixActions.TipPosTopImageMove, +MixActions.FlowRateWarning, **for asp and disp + +To Change: +Need to refactor labware set up to have different labware on deck for better well selection coverage +*/ diff --git a/protocol-designer/cypress/support/StepExecution.ts b/protocol-designer/cypress/support/StepExecution.ts index 8806fd6f0b7..6c116a716b3 100644 --- a/protocol-designer/cypress/support/StepExecution.ts +++ b/protocol-designer/cypress/support/StepExecution.ts @@ -13,6 +13,12 @@ import { executeModSteps, executeVerifyModStep, } from './SupportModules' +import { + MixActions, + MixVerifications, + executeMixAction, + executeVerifyMixStep, +} from './mixSetting' export type StepsList = Array< | SetupActions @@ -20,6 +26,8 @@ export type StepsList = Array< | UniversalActions | ModActions | ModVerifications + | MixActions + | MixVerifications > export const runSteps = (steps: StepsList): void => { @@ -29,6 +37,8 @@ export const runSteps = (steps: StepsList): void => { ModVerifications, SetupVerifications, UniversalActions, + MixActions, + MixVerifications, ] if (!isEnumValue(enumsToCheck, steps)) { @@ -46,6 +56,10 @@ export const runSteps = (steps: StepsList): void => { executeModSteps(step as ModActions) } else if (isEnumValue([ModVerifications], step)) { executeVerifyModStep(step as ModVerifications) + } else if (isEnumValue([MixActions], step)) { + executeMixAction(step as MixActions) + } else if (isEnumValue([MixVerifications], step)) { + executeVerifyMixStep(step as MixVerifications) } }) } diff --git a/protocol-designer/cypress/support/commands.ts b/protocol-designer/cypress/support/commands.ts index 697ddfa32f5..3c3f27539a2 100644 --- a/protocol-designer/cypress/support/commands.ts +++ b/protocol-designer/cypress/support/commands.ts @@ -32,6 +32,8 @@ declare global { verifyCreateNewPage: () => Cypress.Chainable togglePreWetTip: () => Cypress.Chainable mixaspirate: () => Cypress.Chainable + clickConfirm: () => Cypress.Chainable + verifyOverflowBtn: () => Cypress.Chainable } } } @@ -49,6 +51,12 @@ export const content = { appSettings: 'App Info', privacy: 'Privacy', shareSessions: 'Share analytics with Opentrons', + move: 'Move', + transfer: 'Transfer', + mix: 'Mix', + pause: 'Pause', + heaterShaker: 'Heater-shaker', + thermocyler: 'Thermocycler', } export const locators = { @@ -104,11 +112,11 @@ Cypress.Commands.add('verifyCreateNewHeader', () => { // Home Page Cypress.Commands.add('verifyHomePage', () => { cy.contains(content.welcome) + cy.get(locators.privacyPolicy).should('exist').and('be.visible') + cy.get(locators.eula).should('exist').and('be.visible') cy.contains('button', locators.createProtocol).should('be.visible') cy.contains('label', locators.importProtocol).should('be.visible') cy.getByTestId(locators.settingsDataTestid).should('be.visible') - cy.get(locators.privacyPolicy).should('exist').and('be.visible') - cy.get(locators.eula).should('exist').and('be.visible') }) Cypress.Commands.add('clickCreateNew', () => { @@ -122,6 +130,10 @@ Cypress.Commands.add('closeAnalyticsModal', () => { .click({ force: true }) }) +Cypress.Commands.add('clickConfirm', () => { + cy.contains(locators.confirm).click() +}) + // Header Import Cypress.Commands.add('importProtocol', (protocolFilePath: string) => { cy.contains(locators.import).click() @@ -158,6 +170,15 @@ Cypress.Commands.add('verifySettingsPage', () => { .should('be.visible') }) +Cypress.Commands.add('verifyOverflowBtn', () => { + cy.contains(content.move).should('exist').should('be.visible') + cy.contains(content.transfer).should('exist').should('be.visible') + cy.contains(content.mix).should('exist').should('be.visible') + cy.contains(content.pause).should('exist').should('be.visible') + cy.contains(content.heaterShaker).should('exist').should('be.visible') + cy.contains(content.thermocyler).should('exist').should('be.visible') +}) + /// ///////////////////////////////////////////////////////////////// // Legacy Code Section // This code is deprecated and should be removed diff --git a/protocol-designer/cypress/support/mixSetting.ts b/protocol-designer/cypress/support/mixSetting.ts new file mode 100644 index 00000000000..66551bce695 --- /dev/null +++ b/protocol-designer/cypress/support/mixSetting.ts @@ -0,0 +1,527 @@ +import type { UniversalActions } from './universalActions' + +export enum MixActions { + Confirm = 'Confirm', + Continue = 'Continue', + GoBack = 'Go back', + Back = 'Back', + Save = 'Save', + Edit = 'Edit', + SelectMix = 'Select Mix', + SelectLabware = 'Select on deck labware', + SelectWellInputField = 'Select wells', + EnterVolume = 'Enter a valid volume to mix', + EnterMixReps = 'Enter number of repetions to mix', + SelectTipHandling = 'Select how/if tips should be picked up for each mix', + AspirateFlowRate = 'Select aspirate flow rate settings', + Dispense = 'Select dispnse settings', + AspWellOrder = 'Open well aspirate well order pop out', + EditWellOrder = 'Edit well order selects', + AspMixTipPos = 'Edit tip position for executing mix step', + Delay = 'Check box for delay and input value', + DispenseFlowRate = 'Select dispense flow rate settings', + BlowoutLocation = 'Select blowout settings', + TouchTip = 'Select touch tip settings', + BlowoutFlowRate = 'Enter value for blow out flow rate', + BlowoutPosFromTop = 'Select a blow out position from top of well', + Rename = 'Rename Mix step', + + /* + To Add: + TipPosSideImageMove = 'Check that the tip position will update when data is enetered' + */ +} + +export enum MixVerifications { + PartOne = 'Verify Part 1, the configuration of mix settings, and check continue button', + PartTwoAsp = 'Verify Part 2, the configuration of asp settings and check go back and save button', + PartTwoDisp = 'Verify Part 2, the configuration of disp settings and check go back and save button', + WellSelectPopout = 'Verify labware image and available wells', + AspWellOrder = 'Verify pop out for well order during aspirate', + AspMixTipPos = 'Verify pop out for mix tip position durin aspirate', + Blowout = 'Verify blow out settings', + BlowoutPopout = 'Verify blow out position and pop out', + TouchTipPopout = 'Verify touch tip pop out', + TouchTip = 'Verify touch tip settings', + Rename = 'Verify that Mix Step was successfully renamed to "Cypress Test"', + /* + To Add: + FlowRateRangeWarning = 'Verify warning appears when outside flow rate parameters', + TipPosCollisionCheck = 'Verify banner warning appears when mix tip position is in contact with well wall' + */ +} + +export enum MixContent { + Move = 'Move', + Transfer = 'Transfer', + Mix = 'Mix', + Pause = 'Pause', + HeaterShaker = 'Heater-shaker', + Thermocyler = 'Thermocycler', + Pipette = 'Pipette', + Tiprack = 'Tiprack', + Labware = 'Labware', + SelectWells = 'Select wells', + VolumePerWell = 'Volume per well', + MixRepetitions = 'Mix repetitions', + TipHandling = 'Tip handling', + TipDropLocation = 'Tip drop location', + ChooseOption = 'Choose option', + Reservoir = 'Axygen 1 Well Reservoir 90 mL', + WellPlate = 'Opentrons Tough 96 Well Plate 200 µL PCR Full Skirt', + PartOne = 'Part 1 / 2', + PartTwo = 'Part 2 / 2', + WellSelectTitle = 'Select wells using a Flex 1-Channel 1000 µL', + ClickAndDragWellSelect = 'Click and drag to select wells', + PipettePreselect = 'Flex 1-Channel 1000 µL', + TiprackPreselect = 'Opentrons Flex 96 Tip Rack 1000 µL', + BeforeEveryAsp = 'Before every aspirate', + OnceAtStartStep = 'Once at the start of step', + PerSourceWell = 'Per source well', + PerDestWell = 'Per destination well', + Never = 'Never', + WasteChute = 'Waste chute', + AspFlowRate = 'Aspirate flow rate', + AspWellOrder = 'Aspirate well order', + MixTipPosition = 'Mix tip position', + AdvancedPipSettings = 'Advanced pipetting settings', + Delay = 'Delay', + DelayDuration = 'Delay duration', + DispFlowRate = 'Dispense flow rate', + Blowout = 'Blowout', + TouchTip = 'Touch tip', + TopBottomLeRi = 'Top to bottom, Left to right', + EditWellOrder = 'Edit well order', + WellOrderDescrip = 'Change how the robot moves from well to well.', + PrimaryOrder = 'Primary order', + TopToBottom = 'Top to bottom', + BottomToTop = 'Bottom to top', + LeftToRight = 'Left to right', + RightToLeft = 'Right to left', + Then = 'then', + SecondaryOrder = 'Secondary order', + Cancel = 'Cancel', + EditMixTipPos = 'Edit mix tip position', + MixTipPosDescr = 'Change from where in the well the robot aspirates and dispenses during the mix.', + Xposition = 'X position', + Yposition = 'Y position', + Zposition = 'Z position', + StartingWellPos = 'Well position: X 0 Y 0 Z 1 (mm)', + TopView = 'Top view', + SideView = 'Side view', + BlowoutLocation = 'Blowout location', + BlowoutPos = 'Blowout position from top', + DestinationWell = 'Destination Well', + BlowoutFlowRate = 'Blowout position from top', + EditBlowoutPos = 'Edit blowout position', + BlowoutPosDescrip = 'Change where in the well the robot performs the blowout.', + EditTouchTipPos = 'Edit touch tip position', + TouchTipDescrip = 'Change from where in the well the robot performs the touch tip.', + TouchTipPos = 'Touch tip position from bottom', + NameStep = 'Name step', + StepName = 'Step Name', + StepNotes = 'Step Notes', + CypressTest = 'Cypress Mix Test', + TouchTipFromTop = 'Touch tip position from top', +} + +export enum MixLocators { + Continue = 'button:contains("Continue")', + GoBack = 'button:contains("Go back")', + Back = 'button:contains("Back")', + WellInputField = '[name="wells"]', + Save = 'button:contains("Save")', + OneWellReservoirImg = '[data-wellname="A1"]', + Volume = '[name="volume"]', + MixReps = '[name="times"]', + Aspirate = 'button:contains("Aspirate")', + Dispense = 'button:contains("Dispense")', + AspFlowRateInput = '[name="aspirate_flowRate"]', + AspWellOrder = '[class="Flex-sc-1qhp8l7-0 ListButton___StyledFlex-sc-1lmhs3v-0 bToGfF bdMeyp"]', + ResetToDefault = 'button:contains("Reset to default")', + PrimaryOrderDropdown = 'div[tabindex="0"].sc-bqWxrE jKLbYH iFjNDq', + CancelAspSettings = '[class="SecondaryButton-sc-1opt1t9-0 kjpcRL"]', + MixTipPos = '[class="Flex-sc-1qhp8l7-0 ListButton___StyledFlex-sc-1lmhs3v-0 gSONWG bdMeyp"]', + XpositionInput = '[id="TipPositionModal_x_custom_input"]', + YpositionInput = '[id="TipPositionModal_y_custom_input"]', + ZpositionInput = '[id="TipPositionModal_z_custom_input"]', + SwapView = 'button:contains("Swap view")', + Checkbox = '[class="Flex-sc-1qhp8l7-0 Checkbox___StyledFlex3-sc-1mvp7vt-0 gZwGCw btdgeU"]', + DelaySecondsInput = '[class="InputField__StyledInput-sc-1gyyvht-0 cLVzBl"]', + // SideViewTipPos = '[src="/src/assets/images/tip_side_mid_layer.svg"]', + DispFlowRate = '[name="dispense_flowRate"]', + // Blowout = '[class="Flex-sc-1qhp8l7-0 Checkbox___StyledFlex3-sc-1mvp7vt-0 gZwGCw btdgeU"]', + BlowoutLtnDropdown = '[class="Svg-sc-1lpozsw-0 Icon___StyledSvg-sc-1gt4gyz-0 csSXbR cJpxat"]', + BlowoutFlowRate = '[name="blowout_flowRate"]', + BlowoutPos = '[id="TipPositionField_blowout_z_offset"]', + BlowoutZPosition = '[data-testid="TipPositionModal_custom_input"]', + PosFromBottom = '[id="TipPositionField_mix_touchTip_mmFromBottom"]', + RenameBtn = 'button:contains("Rename")', + StepNameInput = '[class="InputField__StyledInput-sc-1gyyvht-0 cLVzBl"]', + StepNotesInput = '[class="RenameStepModal__DescriptionField-sc-1k5vjxe-0 lkzOSf"]', + PosFromTop = '[data-testid="TipPositionField_mix_touchTip_mmFromTop"]', +} + +export const executeMixAction = ( + action: MixActions | UniversalActions +): void => { + switch (action) { + case MixActions.SelectMix: + cy.get('button').contains('Mix').click() + break + case MixActions.SelectLabware: + cy.contains(MixContent.ChooseOption).should('be.visible').click() + cy.contains(MixContent.Reservoir).should('be.visible').click() + break + case MixActions.SelectWellInputField: + cy.get(MixLocators.WellInputField).should('be.visible').click() + break + case MixActions.EnterVolume: + cy.get(MixLocators.Volume).should('exist').type('100') + break + case MixActions.EnterMixReps: + cy.get(MixLocators.MixReps).should('exist').type('5') + break + case MixActions.SelectTipHandling: + cy.contains(MixContent.BeforeEveryAsp) + .should('exist') + .should('be.visible') + .click() + cy.contains(MixContent.OnceAtStartStep) + .should('exist') + .should('be.visible') + cy.contains(MixContent.PerSourceWell).should('exist').should('be.visible') + cy.contains(MixContent.PerDestWell).should('exist').should('be.visible') + cy.contains(MixContent.Never).should('exist').should('be.visible') + cy.contains(MixContent.OnceAtStartStep).click() + break + case MixActions.AspirateFlowRate: + cy.get(MixLocators.Aspirate).should('exist').should('be.visible').click() + cy.get(MixLocators.AspFlowRateInput).should('exist') + cy.get(MixLocators.AspFlowRateInput).type('{selectAll}, {backspace}, 100') + break + case MixActions.AspWellOrder: + cy.contains(MixContent.TopBottomLeRi).should('exist').should('be.visible') + cy.get(MixLocators.AspWellOrder).click() + break + case MixActions.AspMixTipPos: + cy.contains(MixContent.StartingWellPos) + .should('exist') + .should('be.visible') + cy.get(MixLocators.MixTipPos).click() + cy.get(MixLocators.XpositionInput).type('{selectAll}, {backspace}, 2') + cy.get(MixLocators.YpositionInput).type('{selectAll}, {backspace}, 3') + cy.get(MixLocators.ZpositionInput).should('have.prop', 'value') + cy.get(MixLocators.ZpositionInput).type('{selectAll}, {backspace}, 4') + cy.get(MixLocators.ResetToDefault) + .should('exist') + .should('be.visible') + .click() + cy.get(MixLocators.XpositionInput).type('{selectAll}, {backspace}, 3') + cy.get(MixLocators.YpositionInput).type('{selectAll}, {backspace}, 2') + cy.get(MixLocators.ZpositionInput).should('have.prop', 'value') + cy.get(MixLocators.ZpositionInput).type('{selectAll}, {backspace}, 5') + cy.contains(MixContent.Cancel).should('exist').should('be.visible') + break + case MixActions.Delay: + cy.contains(MixContent.Delay).should('exist').should('be.visible') + cy.get(MixLocators.Checkbox) + .should('exist') + .should('be.visible') + .eq(0) + .click() + cy.contains(MixContent.DelayDuration).should('exist').should('be.visible') + cy.get(MixLocators.DelaySecondsInput) + .should('exist') + .should('be.visible') + .should('have.prop', 'value') + cy.get(MixLocators.DelaySecondsInput) + .eq(1) + .type('{selectAll}, {backspace}, 5') + break + case MixActions.Dispense: + cy.get(MixLocators.Dispense).should('exist').should('be.visible').click() + break + case MixActions.DispenseFlowRate: + cy.get(MixLocators.Dispense).should('exist').should('be.visible').click() + cy.get(MixLocators.DispFlowRate).should('exist') + cy.get(MixLocators.DispFlowRate).type('{selectAll}, {backspace}, 300') + break + case MixActions.BlowoutLocation: + cy.contains(MixContent.Blowout).should('exist').should('be.visible') + cy.get(MixLocators.Checkbox) + .should('exist') + .should('be.visible') + .eq(0) + .click() + cy.contains(MixContent.ChooseOption).should('exist').should('be.visible') + cy.get(MixLocators.BlowoutLtnDropdown) + .should('exist') + .should('be.visible') + .click() + cy.contains(MixContent.WasteChute).should('exist').should('be.visible') + cy.contains(MixContent.DestinationWell) + .should('exist') + .should('be.visible') + .click() + break + case MixActions.BlowoutFlowRate: + cy.get(MixLocators.BlowoutFlowRate) + .should('exist') + .should('be.visible') + .should('have.prop', 'value') + cy.get(MixLocators.BlowoutFlowRate).click() + cy.get(MixLocators.BlowoutFlowRate).type('{selectAll}, {backspace}, 300') + break + case MixActions.BlowoutPosFromTop: + cy.get(MixLocators.BlowoutPos) + .should('exist') + .should('be.visible') + .should('have.prop', 'value') + cy.get(MixLocators.BlowoutPos).click() + cy.get(MixLocators.BlowoutZPosition).type('{selectAll}, {backspace}, 4') + cy.get(MixLocators.ResetToDefault).click() + cy.get(MixLocators.BlowoutZPosition).type('{selectAll}, {backspace}, -3') + break + case MixActions.TouchTip: + cy.get(MixLocators.Checkbox) + .should('exist') + .should('be.visible') + .eq(0) + .click() + cy.get(MixLocators.PosFromTop).should('have.prop', 'value') + cy.get(MixLocators.PosFromTop).click({ force: true }) + cy.get(MixLocators.BlowoutZPosition).type('{selectAll}, {backspace}, 2') + cy.get(MixLocators.ResetToDefault).click() + cy.get(MixLocators.BlowoutZPosition).type('{selectAll}, {backspace}, -7') + break + case MixActions.Save: + cy.get(MixLocators.Save) + .should('exist') + .should('be.visible') + .first() + .click({ force: true }) + break + case MixActions.Back: + cy.get(MixLocators.Back).should('exist').should('be.visible').click() + break + case MixActions.Continue: + cy.get(MixLocators.Continue) + .should('exist') + .should('be.visible') + .click({ force: true }) + break + case MixActions.Rename: + cy.get(MixLocators.RenameBtn).should('exist').should('be.visible').click() + cy.contains(MixContent.NameStep).should('exist').should('be.visible') + cy.contains(MixContent.StepName).should('exist').should('be.visible') + cy.get(MixLocators.StepNameInput).should('have.value', 'Mix') + cy.contains(MixContent.StepNotes).should('exist').should('be.visible') + cy.get(MixLocators.StepNameInput) + .first() + .type('{selectAll} {backspace} Cypress Mix Test') + cy.get(MixLocators.StepNotesInput).type( + 'This is testing cypress automation in PD' + ) + cy.contains(MixContent.Cancel).should('exist').should('be.visible') + break + + /* + To Add: + case MixActions.TipPosSideImageMove: + cy.get(MixLocators.SideViewTipPos).should('have.css','transform', '0px') + break + case MixAction.TipPosTopImageMove: + break + case Actions.FlowRateWarning: + break + */ + default: + throw new Error(`Unrecognized action: ${action as string}`) + } +} + +export const executeVerifyMixStep = (verification: MixVerifications): void => { + switch (verification) { + case MixVerifications.PartOne: + cy.contains(MixContent.PartOne).should('exist').should('be.visible') + cy.contains(MixContent.Mix).should('exist').should('be.visible') + cy.contains(MixContent.Pipette).should('exist').should('be.visible') + cy.contains(MixContent.PipettePreselect) + .should('exist') + .should('be.visible') + cy.contains(MixContent.Tiprack).should('exist').should('be.visible') + cy.contains(MixContent.TiprackPreselect) + .should('exist') + .should('be.visible') + cy.contains(MixContent.Labware).should('exist').should('be.visible') + cy.contains(MixContent.SelectWells).should('exist').should('be.visible') + cy.contains(MixContent.VolumePerWell).should('exist').should('be.visible') + cy.contains(MixContent.MixRepetitions) + .should('exist') + .should('be.visible') + cy.contains(MixContent.TipHandling).should('exist').should('be.visible') + cy.contains(MixContent.TipDropLocation) + .should('exist') + .should('be.visible') + cy.contains(MixContent.WasteChute).should('exist').should('be.visible') + cy.get(MixLocators.Continue).should('exist').should('be.visible') + break + case MixVerifications.WellSelectPopout: + cy.contains(MixContent.WellSelectTitle) + .should('exist') + .should('be.visible') + cy.contains(MixContent.ClickAndDragWellSelect) + .should('exist') + .should('be.visible') + cy.get(MixLocators.OneWellReservoirImg) + .should('exist') + .should('be.visible') + cy.get(MixLocators.Save).should('exist').should('be.visible') + cy.get(MixLocators.Back).should('exist').should('be.visible') + break + case MixVerifications.PartTwoAsp: + cy.contains(MixContent.PartTwo).should('exist').should('be.visible') + cy.contains(MixContent.Mix).should('exist').should('be.visible') + cy.get(MixLocators.Aspirate).should('exist').should('be.visible') + cy.contains(MixContent.AspFlowRate).should('exist').should('be.visible') + cy.contains(MixContent.AspWellOrder).should('exist').should('be.visible') + cy.contains(MixContent.MixTipPosition) + .should('exist') + .should('be.visible') + cy.contains(MixContent.AdvancedPipSettings) + .should('exist') + .should('be.visible') + cy.contains(MixContent.Delay).should('exist').should('be.visible') + cy.get(MixLocators.Back).should('exist').should('be.visible') + cy.get(MixLocators.Save).should('exist').should('be.visible') + break + case MixVerifications.AspWellOrder: + cy.contains(MixContent.EditWellOrder).should('exist').should('be.visible') + cy.contains(MixContent.WellOrderDescrip) + .should('exist') + .should('be.visible') + cy.contains(MixContent.PrimaryOrder).should('exist').should('be.visible') + cy.contains(MixContent.TopToBottom) + .should('exist') + .should('be.visible') + .click() + cy.contains(MixContent.BottomToTop).should('exist').should('be.visible') + cy.contains(MixContent.LeftToRight).should('exist').should('be.visible') + cy.contains(MixContent.RightToLeft).should('exist').should('be.visible') + cy.contains(MixContent.BottomToTop) + .should('exist') + .should('be.visible') + .click() + cy.contains(MixContent.Then).should('exist').should('be.visible') + cy.contains(MixContent.SecondaryOrder) + .should('exist') + .should('be.visible') + cy.contains(MixContent.LeftToRight) + .should('exist') + .should('be.visible') + .click() + cy.contains(MixContent.RightToLeft) + .should('exist') + .should('be.visible') + .click() + cy.get(MixLocators.ResetToDefault).click() + cy.contains(MixContent.TopToBottom).should('exist').should('be.visible') + cy.contains(MixContent.LeftToRight).should('exist').should('be.visible') + cy.get(MixLocators.CancelAspSettings).should('exist').should('be.visible') + cy.get(MixLocators.Save).should('exist').should('be.visible') + break + case MixVerifications.AspMixTipPos: + cy.contains(MixContent.EditMixTipPos).should('exist').should('be.visible') + cy.contains(MixContent.MixTipPosDescr) + .should('exist') + .should('be.visible') + cy.contains(MixContent.SideView).should('exist').should('be.visible') + cy.get(MixLocators.SwapView).should('exist').should('be.visible').click() + cy.contains(MixContent.TopView).should('exist').should('be.visible') + cy.contains(MixContent.Xposition).should('exist').should('be.visible') + cy.get(MixLocators.XpositionInput).should('exist').should('be.visible') + cy.get(MixLocators.XpositionInput).should('have.prop', 'value') + cy.contains(MixContent.Yposition).should('exist').should('be.visible') + cy.get(MixLocators.YpositionInput).should('exist').should('be.visible') + cy.get(MixLocators.YpositionInput).should('have.prop', 'value') + cy.contains(MixContent.Zposition).should('exist').should('be.visible') + cy.get(MixLocators.ZpositionInput).should('exist').should('be.visible') + cy.get(MixLocators.ZpositionInput).should('have.prop', 'value') + cy.get(MixLocators.ResetToDefault).should('exist').should('be.visible') + cy.get(MixLocators.CancelAspSettings).should('exist').should('be.visible') + cy.get(MixLocators.Save) + .should('exist') + .should('be.visible') + .first() + .click() + break + case MixVerifications.PartTwoDisp: + cy.contains(MixContent.PartTwo).should('exist').should('be.visible') + cy.contains(MixContent.Mix).should('exist').should('be.visible') + cy.get(MixLocators.Aspirate).should('exist').should('be.visible') + cy.get(MixLocators.Dispense).should('exist').should('be.visible') + cy.contains(MixContent.DispFlowRate).should('exist').should('be.visible') + cy.get(MixLocators.DispFlowRate).should('have.prop', 'value') + cy.contains(MixContent.AdvancedPipSettings) + .should('exist') + .should('be.visible') + cy.contains(MixContent.Delay).should('exist').should('be.visible') + cy.contains(MixContent.Blowout).should('exist').should('be.visible') + cy.contains(MixContent.TouchTip).should('exist').should('be.visible') + break + case MixVerifications.Blowout: + cy.contains(MixContent.Blowout).should('exist').should('be.visible') + cy.contains(MixContent.BlowoutLocation) + .should('exist') + .should('be.visible') + cy.contains(MixContent.BlowoutFlowRate) + .should('exist') + .should('be.visible') + cy.get(MixLocators.BlowoutFlowRate).should('have.prop', 'value') + cy.contains(MixContent.BlowoutPos).should('exist').should('be.visible') + cy.get(MixLocators.BlowoutPos).should('have.prop', 'value') + break + case MixVerifications.BlowoutPopout: + cy.contains(MixContent.EditBlowoutPos) + .should('exist') + .should('be.visible') + cy.contains(MixContent.BlowoutPosDescrip) + .should('exist') + .should('be.visible') + cy.contains(MixContent.Zposition).should('exist').should('be.visible') + cy.get(MixLocators.BlowoutZPosition).should('have.prop', 'value') + cy.contains(MixContent.Cancel).should('exist').should('be.visible') + cy.get(MixLocators.ResetToDefault).should('exist').should('be.visible') + cy.get(MixLocators.Save).should('exist').should('be.visible') + break + case MixVerifications.TouchTip: + cy.contains(MixContent.TouchTip).should('exist').should('be.visible') + cy.contains(MixContent.TouchTipFromTop) + .should('exist') + .should('be.visible') + cy.get(MixLocators.PosFromTop).should('have.prop', 'value') + break + case MixVerifications.TouchTipPopout: + cy.contains(MixContent.EditTouchTipPos) + .should('exist') + .should('be.visible') + cy.contains(MixContent.TouchTipDescrip) + .should('exist') + .should('be.visible') + cy.contains(MixContent.Zposition).should('exist').should('be.visible') + cy.get(MixLocators.BlowoutZPosition).should('have.prop', 'value') + cy.contains(MixContent.Cancel).should('exist').should('be.visible') + cy.get(MixLocators.ResetToDefault).should('exist').should('be.visible') + cy.get(MixLocators.Save).should('exist').should('be.visible') + break + case MixVerifications.Rename: + cy.contains(MixContent.CypressTest).should('exist').should('be.visible') + break + + default: + throw new Error( + `Unrecognized verification: ${verification as MixVerifications}` + ) + } +} From 89b3f14d2ca3be8eba9f6f00307eabd583b2ae9c Mon Sep 17 00:00:00 2001 From: koji Date: Tue, 11 Feb 2025 15:04:27 -0500 Subject: [PATCH 119/150] refactor(protocol-designer): initial refactoring of MoveLiquidTools (#17470) * refactor(protocol-designer): initial refactoring of MoveLiquidTools --- .../__fixtures__/formDataForSingleStep.json | 62 ++ .../propsForFieldsForSingleStep.json | 405 +++++++++++ .../utils/getMigrationPositionFromTop.ts | 4 +- .../src/organisms/TipPositionModal/index.tsx | 3 +- .../src/organisms/WellOrderModal/index.tsx | 4 +- .../BatchEditToolbox/BatchEditMixTools.tsx | 4 +- .../BatchEditMoveLiquidTools.tsx | 4 +- .../StepForm/PipetteFields/FlowRateField.tsx | 4 +- .../StepForm/PipetteFields/PositionField.tsx | 4 +- .../PipetteFields/WellsOrderField.tsx | 6 +- .../MultipleStepsMoveLiquidTools.tsx | 477 +++++++++++++ .../SingleStepMoveLiquidTools.tsx | 191 ++++++ .../__tests__/MoveLiquidTools.test.tsx | 56 ++ .../SingleStepMoveLiquidTools.test.tsx | 109 +++ .../StepTools/MoveLiquidTools/index.tsx | 626 +----------------- protocol-designer/src/resources/types.ts | 3 + .../src/steplist/formLevel/errors.ts | 3 +- 17 files changed, 1343 insertions(+), 622 deletions(-) create mode 100644 protocol-designer/src/__fixtures__/formDataForSingleStep.json create mode 100644 protocol-designer/src/__fixtures__/propsForFieldsForSingleStep.json create mode 100644 protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/StepTools/MoveLiquidTools/MultipleStepsMoveLiquidTools.tsx create mode 100644 protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/StepTools/MoveLiquidTools/SingleStepMoveLiquidTools.tsx create mode 100644 protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/StepTools/MoveLiquidTools/__tests__/MoveLiquidTools.test.tsx create mode 100644 protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/StepTools/MoveLiquidTools/__tests__/SingleStepMoveLiquidTools.test.tsx create mode 100644 protocol-designer/src/resources/types.ts diff --git a/protocol-designer/src/__fixtures__/formDataForSingleStep.json b/protocol-designer/src/__fixtures__/formDataForSingleStep.json new file mode 100644 index 00000000000..d3549e758b8 --- /dev/null +++ b/protocol-designer/src/__fixtures__/formDataForSingleStep.json @@ -0,0 +1,62 @@ +{ + "aspirate_airGap_checkbox": false, + "aspirate_airGap_volume": "1", + "aspirate_delay_checkbox": false, + "aspirate_delay_mmFromBottom": null, + "aspirate_delay_seconds": "1", + "aspirate_flowRate": null, + "aspirate_labware": "63a7eae2-0e40-4693-9bb9-e7851f4b16be:opentrons/armadillo_96_wellplate_200ul_pcr_full_skirt/2", + "aspirate_mix_checkbox": false, + "aspirate_mix_times": null, + "aspirate_mix_volume": null, + "aspirate_mmFromBottom": null, + "aspirate_submerge_delay_seconds": null, + "aspirate_submerge_speed": null, + "aspirate_touchTip_checkbox": false, + "aspirate_touchTip_mmFromTop": null, + "aspirate_wellOrder_first": "t2b", + "aspirate_wellOrder_second": "l2r", + "aspirate_wells_grouped": false, + "aspirate_wells": ["A1", "B1", "C1", "D1", "E1", "F1", "G1", "H1"], + "aspirate_x_position": 0, + "aspirate_y_position": 0, + "blowout_checkbox": false, + "blowout_flowRate": null, + "blowout_location": null, + "blowout_z_offset": 0, + "changeTip": "always", + "dispense_airGap_checkbox": false, + "dispense_airGap_volume": "1", + "dispense_delay_checkbox": false, + "dispense_delay_mmFromBottom": null, + "dispense_delay_seconds": "1", + "dispense_flowRate": null, + "dispense_labware": "83a383e5-6a5a-4dae-9da4-5c21bd3835dc:opentrons/nest_96_wellplate_2ml_deep/2", + "dispense_mix_checkbox": false, + "dispense_mix_times": null, + "dispense_mix_volume": null, + "dispense_mmFromBottom": null, + "dispense_submerge_delay_seconds": null, + "dispense_submerge_speed": null, + "dispense_touchTip_checkbox": false, + "dispense_touchTip_mmFromTop": null, + "dispense_wellOrder_first": "t2b", + "dispense_wellOrder_second": "l2r", + "dispense_wells": ["A1", "B1", "C1", "D1", "E1", "F1", "G1", "H1"], + "dispense_x_position": 0, + "dispense_y_position": 0, + "disposalVolume_checkbox": true, + "disposalVolume_volume": "1", + "dropTip_location": "3a79c2ec-9df7-4dc3-be34-daf86cce3028:trashBin", + "nozzles": null, + "path": "single", + "pipette": "af1e518a-0e00-4270-a22a-ca5b43daff30", + "preWetTip": false, + "tipRack": "opentrons/opentrons_flex_96_filtertiprack_50ul/1", + "volume": "10", + "stepType": "moveLiquid", + "stepName": "transfer", + "stepDetails": "", + "id": "8497bd13-7a6a-451c-9875-1b1918b044e6", + "dispense_touchTip_mmfromTop": null +} diff --git a/protocol-designer/src/__fixtures__/propsForFieldsForSingleStep.json b/protocol-designer/src/__fixtures__/propsForFieldsForSingleStep.json new file mode 100644 index 00000000000..c7dc00fd644 --- /dev/null +++ b/protocol-designer/src/__fixtures__/propsForFieldsForSingleStep.json @@ -0,0 +1,405 @@ +{ + "aspirate_airGap_checkbox": { + "disabled": false, + "errorToShow": null, + "name": "aspirate_airGap_checkbox", + "value": false, + "tooltipContent": "Draw air into the tip after aspirating" + }, + "aspirate_airGap_volume": { + "disabled": false, + "errorToShow": null, + "name": "aspirate_airGap_volume", + "value": "1", + "tooltipContent": "step_fields.defaults.aspirate_airGap_volume" + }, + "aspirate_delay_checkbox": { + "disabled": false, + "errorToShow": null, + "name": "aspirate_delay_checkbox", + "value": false, + "tooltipContent": "Delay after each aspiration" + }, + "aspirate_delay_mmFromBottom": { + "disabled": false, + "errorToShow": null, + "name": "aspirate_delay_mmFromBottom", + "value": null, + "tooltipContent": "Distance from the bottom of the well" + }, + "aspirate_delay_seconds": { + "disabled": false, + "errorToShow": null, + "name": "aspirate_delay_seconds", + "value": "1", + "tooltipContent": "step_fields.defaults.aspirate_delay_seconds" + }, + "aspirate_flowRate": { + "disabled": false, + "errorToShow": null, + "name": "aspirate_flowRate", + "value": null, + "tooltipContent": "The speed at which the pipette aspirates" + }, + "aspirate_labware": { + "disabled": false, + "errorToShow": null, + "name": "aspirate_labware", + "value": "4d7e45e2-b962-45ca-8ace-8a5a683591d5:opentrons/opentrons_96_wellplate_200ul_pcr_full_skirt/2", + "tooltipContent": "Pipette unable to access labware in staging area" + }, + "aspirate_mix_checkbox": { + "disabled": false, + "errorToShow": null, + "name": "aspirate_mix_checkbox", + "value": false, + "tooltipContent": "Aspirate and dispense repeatedly before main aspiration" + }, + "aspirate_mix_times": { + "disabled": false, + "errorToShow": null, + "name": "aspirate_mix_times", + "value": null, + "tooltipContent": "step_fields.defaults.aspirate_mix_times" + }, + "aspirate_mix_volume": { + "disabled": false, + "errorToShow": null, + "name": "aspirate_mix_volume", + "value": null, + "tooltipContent": "step_fields.defaults.aspirate_mix_volume" + }, + "aspirate_mmFromBottom": { + "disabled": false, + "errorToShow": null, + "name": "aspirate_mmFromBottom", + "value": null, + "tooltipContent": "Adjust tip position for aspirate" + }, + "aspirate_submerge_delay_seconds": { + "disabled": false, + "errorToShow": null, + "name": "aspirate_submerge_delay_seconds", + "value": null, + "tooltipContent": "step_fields.defaults.aspirate_submerge_delay_seconds" + }, + "aspirate_submerge_speed": { + "disabled": false, + "errorToShow": null, + "name": "aspirate_submerge_speed", + "value": null, + "tooltipContent": "step_fields.defaults.aspirate_submerge_speed" + }, + "aspirate_touchTip_checkbox": { + "disabled": false, + "errorToShow": null, + "name": "aspirate_touchTip_checkbox", + "value": false, + "tooltipContent": "Touch tip to each side of the well after aspirating" + }, + "aspirate_touchTip_mmFromTop": { + "disabled": false, + "errorToShow": null, + "name": "aspirate_touchTip_mmFromTop", + "value": null, + "tooltipContent": "Distance from the top of the well" + }, + "aspirate_wellOrder_first": { + "disabled": false, + "errorToShow": null, + "name": "aspirate_wellOrder_first", + "value": "t2b", + "tooltipContent": "step_fields.defaults.aspirate_wellOrder_first" + }, + "aspirate_wellOrder_second": { + "disabled": false, + "errorToShow": null, + "name": "aspirate_wellOrder_second", + "value": "l2r", + "tooltipContent": "step_fields.defaults.aspirate_wellOrder_second" + }, + "aspirate_wells_grouped": { + "disabled": false, + "errorToShow": null, + "name": "aspirate_wells_grouped", + "value": false, + "tooltipContent": "step_fields.defaults.aspirate_wells_grouped" + }, + "aspirate_wells": { + "disabled": false, + "errorToShow": null, + "name": "aspirate_wells", + "value": ["A1", "B1", "C1", "D1", "E1", "F1", "G1", "H1"], + "tooltipContent": "First select a source labware" + }, + "aspirate_x_position": { + "disabled": false, + "errorToShow": null, + "name": "aspirate_x_position", + "value": 0, + "tooltipContent": "step_fields.defaults.aspirate_x_position" + }, + "aspirate_y_position": { + "disabled": false, + "errorToShow": null, + "name": "aspirate_y_position", + "value": 0, + "tooltipContent": "step_fields.defaults.aspirate_y_position" + }, + "blowout_checkbox": { + "disabled": false, + "errorToShow": null, + "name": "blowout_checkbox", + "value": false, + "tooltipContent": "Blow extra air through the tip" + }, + "blowout_flowRate": { + "disabled": false, + "errorToShow": null, + "name": "blowout_flowRate", + "value": null, + "tooltipContent": "Blowout speed" + }, + "blowout_location": { + "disabled": false, + "errorToShow": null, + "name": "blowout_location", + "value": null, + "tooltipContent": "Where to dispose of remaining volume in tip" + }, + "blowout_z_offset": { + "disabled": true, + "errorToShow": null, + "name": "blowout_z_offset", + "value": 0, + "tooltipContent": "Blowout location, source, and destination labware must first be selected" + }, + "changeTip": { + "disabled": false, + "errorToShow": null, + "name": "changeTip", + "value": "always", + "tooltipContent": "Choose when the robot picks up fresh tips" + }, + "dispense_airGap_checkbox": { + "disabled": false, + "errorToShow": null, + "name": "dispense_airGap_checkbox", + "value": false, + "tooltipContent": "Draw in air before moving to trash to dispose of tip." + }, + "dispense_airGap_volume": { + "disabled": false, + "errorToShow": null, + "name": "dispense_airGap_volume", + "value": "1", + "tooltipContent": "step_fields.defaults.dispense_airGap_volume" + }, + "dispense_delay_checkbox": { + "disabled": false, + "errorToShow": null, + "name": "dispense_delay_checkbox", + "value": false, + "tooltipContent": "Delay after each dispense" + }, + "dispense_delay_mmFromBottom": { + "disabled": false, + "errorToShow": null, + "name": "dispense_delay_mmFromBottom", + "value": null, + "tooltipContent": "Distance from the bottom of the well" + }, + "dispense_delay_seconds": { + "disabled": false, + "errorToShow": null, + "name": "dispense_delay_seconds", + "value": "1", + "tooltipContent": "step_fields.defaults.dispense_delay_seconds" + }, + "dispense_flowRate": { + "disabled": false, + "errorToShow": null, + "name": "dispense_flowRate", + "value": null, + "tooltipContent": "The speed at which the pipette dispenses" + }, + "dispense_labware": { + "disabled": false, + "errorToShow": null, + "name": "dispense_labware", + "value": "83a383e5-6a5a-4dae-9da4-5c21bd3835dc:opentrons/nest_96_wellplate_2ml_deep/2", + "tooltipContent": "Pipette unable to access labware in staging area" + }, + "dispense_mix_checkbox": { + "disabled": false, + "errorToShow": null, + "name": "dispense_mix_checkbox", + "value": false, + "tooltipContent": "Aspirate and dispense repeatedly after main dispense" + }, + "dispense_mix_times": { + "disabled": false, + "errorToShow": null, + "name": "dispense_mix_times", + "value": null, + "tooltipContent": "step_fields.defaults.dispense_mix_times" + }, + "dispense_mix_volume": { + "disabled": false, + "errorToShow": null, + "name": "dispense_mix_volume", + "value": null, + "tooltipContent": "step_fields.defaults.dispense_mix_volume" + }, + "dispense_mmFromBottom": { + "disabled": false, + "errorToShow": null, + "name": "dispense_mmFromBottom", + "value": null, + "tooltipContent": "Adjust tip position for dispense" + }, + "dispense_submerge_delay_seconds": { + "disabled": false, + "errorToShow": null, + "name": "dispense_submerge_delay_seconds", + "value": null, + "tooltipContent": "step_fields.defaults.dispense_submerge_delay_seconds" + }, + "dispense_submerge_speed": { + "disabled": false, + "errorToShow": null, + "name": "dispense_submerge_speed", + "value": null, + "tooltipContent": "step_fields.defaults.dispense_submerge_speed" + }, + "dispense_touchTip_checkbox": { + "disabled": false, + "errorToShow": null, + "name": "dispense_touchTip_checkbox", + "value": false, + "tooltipContent": "Touch tip to each side of the well after dispensing" + }, + "dispense_touchTip_mmFromTop": { + "disabled": false, + "errorToShow": null, + "name": "dispense_touchTip_mmFromTop", + "value": null, + "tooltipContent": "Distance from the top of the well" + }, + "dispense_wellOrder_first": { + "disabled": false, + "errorToShow": null, + "name": "dispense_wellOrder_first", + "value": "t2b", + "tooltipContent": "step_fields.defaults.dispense_wellOrder_first" + }, + "dispense_wellOrder_second": { + "disabled": false, + "errorToShow": null, + "name": "dispense_wellOrder_second", + "value": "l2r", + "tooltipContent": "step_fields.defaults.dispense_wellOrder_second" + }, + "dispense_wells": { + "disabled": false, + "errorToShow": null, + "name": "dispense_wells", + "value": ["A1", "B1", "C1", "D1", "E1", "F1", "G1", "H1"], + "tooltipContent": "First select a destination labware" + }, + "dispense_x_position": { + "disabled": false, + "errorToShow": null, + "name": "dispense_x_position", + "value": 0, + "tooltipContent": "step_fields.defaults.dispense_x_position" + }, + "dispense_y_position": { + "disabled": false, + "errorToShow": null, + "name": "dispense_y_position", + "value": 0, + "tooltipContent": "step_fields.defaults.dispense_y_position" + }, + "disposalVolume_checkbox": { + "disabled": false, + "errorToShow": null, + "name": "disposalVolume_checkbox", + "value": true, + "tooltipContent": "Aspirate extra volume that is disposed of after a multi-dispense is complete. We recommend a disposal volume of at least the pipette's minimum." + }, + "disposalVolume_volume": { + "disabled": false, + "errorToShow": null, + "name": "disposalVolume_volume", + "value": "1", + "tooltipContent": "step_fields.defaults.disposalVolume_volume" + }, + "dropTip_location": { + "disabled": false, + "errorToShow": null, + "name": "dropTip_location", + "value": "3a79c2ec-9df7-4dc3-be34-daf86cce3028:trashBin", + "tooltipContent": "Choose where you would like to drop tip" + }, + "dropTip_wellNames": { + "disabled": false, + "errorToShow": null, + "name": "dropTip_wellNames", + "tooltipContent": "step_fields.defaults.dropTip_wellNames" + }, + "nozzles": { + "disabled": false, + "errorToShow": null, + "name": "nozzles", + "value": null, + "tooltipContent": "Partial pickup requires a tip rack directly on the deck. Full rack pickup requires the Flex 96 Tip Rack Adapter." + }, + "path": { + "disabled": false, + "errorToShow": null, + "name": "path", + "value": "single", + "tooltipContent": "step_fields.defaults.path" + }, + "pickUpTip_location": { + "disabled": false, + "errorToShow": null, + "name": "pickUpTip_location", + "tooltipContent": "step_fields.defaults.pickUpTip_location" + }, + "pickUpTip_wellNames": { + "disabled": false, + "errorToShow": null, + "name": "pickUpTip_wellNames", + "tooltipContent": "step_fields.defaults.pickUpTip_wellNames" + }, + "pipette": { + "disabled": false, + "errorToShow": null, + "name": "pipette", + "value": "mockPipetteId", + "tooltipContent": "Select the pipette you want to use" + }, + "preWetTip": { + "disabled": false, + "errorToShow": null, + "name": "preWetTip", + "value": false, + "tooltipContent": "Pre-wet by aspirating and dispensing the total aspiration volume" + }, + "tipRack": { + "disabled": false, + "errorToShow": null, + "name": "tipRack", + "value": "opentrons/opentrons_flex_96_filtertiprack_50ul/1", + "tooltipContent": "step_fields.defaults.tipRack" + }, + "volume": { + "disabled": false, + "errorToShow": null, + "name": "volume", + "value": "10", + "tooltipContent": "Volume to dispense in each well" + } +} diff --git a/protocol-designer/src/load-file/migration/utils/getMigrationPositionFromTop.ts b/protocol-designer/src/load-file/migration/utils/getMigrationPositionFromTop.ts index f7a5b7d3f15..a165df07493 100644 --- a/protocol-designer/src/load-file/migration/utils/getMigrationPositionFromTop.ts +++ b/protocol-designer/src/load-file/migration/utils/getMigrationPositionFromTop.ts @@ -3,13 +3,15 @@ import type { LoadLabwareCreateCommand, } from '@opentrons/shared-data' +import type { MoveLiquidPrefixType } from '../../../resources/types' + export const getMigratedPositionFromTop = ( labwareDefinitions: { [definitionId: string]: LabwareDefinition2 }, loadLabwareCommands: LoadLabwareCreateCommand[], labware: string, - type: 'aspirate' | 'dispense' | 'mix' + type: MoveLiquidPrefixType ): number => { const matchingLoadLabware = loadLabwareCommands.find( command => diff --git a/protocol-designer/src/organisms/TipPositionModal/index.tsx b/protocol-designer/src/organisms/TipPositionModal/index.tsx index 71a9dcd17dd..f974c60ace6 100644 --- a/protocol-designer/src/organisms/TipPositionModal/index.tsx +++ b/protocol-designer/src/organisms/TipPositionModal/index.tsx @@ -27,6 +27,7 @@ import { TipPositionSideView } from './TipPositionSideView' import type { ChangeEvent } from 'react' import type { StepFieldName } from '../../form-types' +import type { MoveLiquidPrefixType } from '../../resources/types' type Offset = 'x' | 'y' | 'z' interface PositionSpec { @@ -43,7 +44,7 @@ interface TipPositionModalProps { wellXWidthMm: number wellYWidthMm: number isIndeterminate?: boolean - prefix: 'aspirate' | 'dispense' | 'mix' + prefix: MoveLiquidPrefixType } export function TipPositionModal( diff --git a/protocol-designer/src/organisms/WellOrderModal/index.tsx b/protocol-designer/src/organisms/WellOrderModal/index.tsx index 54b4ad437ef..1a49c255ce9 100644 --- a/protocol-designer/src/organisms/WellOrderModal/index.tsx +++ b/protocol-designer/src/organisms/WellOrderModal/index.tsx @@ -17,7 +17,9 @@ import { import { LINK_BUTTON_STYLE } from '../../atoms' import { getMainPagePortalEl } from '../Portal' import { WellOrderVisualization } from './WellOrderVisualization' + import type { WellOrderOption } from '../../form-types' +import type { MoveLiquidPrefixType } from '../../resources/types' const DEFAULT_FIRST: WellOrderOption = 't2b' const DEFAULT_SECOND: WellOrderOption = 'l2r' @@ -31,7 +33,7 @@ const WELL_ORDER_VALUES: WellOrderOption[] = [ export interface WellOrderModalProps { isOpen: boolean closeModal: () => void - prefix: 'aspirate' | 'dispense' | 'mix' + prefix: MoveLiquidPrefixType firstName: string secondName: string firstValue?: WellOrderOption | null diff --git a/protocol-designer/src/pages/Designer/ProtocolSteps/BatchEditToolbox/BatchEditMixTools.tsx b/protocol-designer/src/pages/Designer/ProtocolSteps/BatchEditToolbox/BatchEditMixTools.tsx index 0b74bbab2f3..6f3a461f43b 100644 --- a/protocol-designer/src/pages/Designer/ProtocolSteps/BatchEditToolbox/BatchEditMixTools.tsx +++ b/protocol-designer/src/pages/Designer/ProtocolSteps/BatchEditToolbox/BatchEditMixTools.tsx @@ -24,7 +24,7 @@ import { } from '../StepForm/utils' import type { WellOrderOption } from '../../../../form-types' -import type { FieldPropsByName } from '../StepForm/types' +import type { FieldPropsByName, LiquidHandlingTab } from '../StepForm/types' interface BatchEditMixToolsProps { propsForFields: FieldPropsByName @@ -33,7 +33,7 @@ interface BatchEditMixToolsProps { export function BatchEditMixTools(props: BatchEditMixToolsProps): JSX.Element { const { propsForFields } = props const { t, i18n } = useTranslation(['form', 'button', 'tooltip']) - const [tab, setTab] = useState<'aspirate' | 'dispense'>('aspirate') + const [tab, setTab] = useState('aspirate') const aspirateTab = { text: i18n.format(t('aspirate'), 'capitalize'), isActive: tab === 'aspirate', diff --git a/protocol-designer/src/pages/Designer/ProtocolSteps/BatchEditToolbox/BatchEditMoveLiquidTools.tsx b/protocol-designer/src/pages/Designer/ProtocolSteps/BatchEditToolbox/BatchEditMoveLiquidTools.tsx index 12d7f1442e8..35f0efe2898 100644 --- a/protocol-designer/src/pages/Designer/ProtocolSteps/BatchEditToolbox/BatchEditMoveLiquidTools.tsx +++ b/protocol-designer/src/pages/Designer/ProtocolSteps/BatchEditToolbox/BatchEditMoveLiquidTools.tsx @@ -24,7 +24,7 @@ import { WellsOrderField, } from '../StepForm/PipetteFields' import type { WellOrderOption } from '../../../../form-types' -import type { FieldPropsByName } from '../StepForm/types' +import type { FieldPropsByName, LiquidHandlingTab } from '../StepForm/types' interface BatchEditMoveLiquidProps { propsForFields: FieldPropsByName @@ -35,7 +35,7 @@ export function BatchEditMoveLiquidTools( ): JSX.Element { const { t, i18n } = useTranslation(['button', 'tooltip', 'protocol_steps']) const { propsForFields } = props - const [tab, setTab] = useState<'aspirate' | 'dispense'>('aspirate') + const [tab, setTab] = useState('aspirate') const aspirateTab = { text: t('protocol_steps:aspirate'), isActive: tab === 'aspirate', diff --git a/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/PipetteFields/FlowRateField.tsx b/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/PipetteFields/FlowRateField.tsx index 3b48e148afa..25d7c422abf 100644 --- a/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/PipetteFields/FlowRateField.tsx +++ b/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/PipetteFields/FlowRateField.tsx @@ -5,10 +5,12 @@ import { SPACING } from '@opentrons/components' import { selectors as stepFormSelectors } from '../../../../../step-forms' import { getMatchingTipLiquidSpecs } from '../../../../../utils' import { InputStepFormField } from '../../../../../molecules' + import type { FieldProps } from '../types' +import type { FlowRateType } from '../../../../../resources/types' interface FlowRateFieldProps extends FieldProps { - flowRateType: 'aspirate' | 'dispense' | 'blowout' + flowRateType: FlowRateType volume: unknown tiprack: unknown pipetteId?: string | null diff --git a/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/PipetteFields/PositionField.tsx b/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/PipetteFields/PositionField.tsx index ef68b274d9b..d5adf58ddb3 100644 --- a/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/PipetteFields/PositionField.tsx +++ b/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/PipetteFields/PositionField.tsx @@ -19,6 +19,7 @@ import { TipPositionModal, ZTipPositionModal } from '../../../../../organisms' import { getIsDelayPositionField } from '../../../../../form-types' import { getDefaultMmFromEdge } from '../../../../../organisms/TipPositionModal/utils' import { selectors as stepFormSelectors } from '../../../../../step-forms' + import type { TipXOffsetFields, TipYOffsetFields, @@ -26,8 +27,9 @@ import type { } from '../../../../../form-types' import type { PositionSpecs } from '../../../../../organisms' import type { FieldPropsByName } from '../types' +import type { MoveLiquidPrefixType } from '../../../../../resources/types' interface PositionFieldProps { - prefix: 'aspirate' | 'dispense' | 'mix' + prefix: MoveLiquidPrefixType propsForFields: FieldPropsByName zField: TipZOffsetFields xField?: TipXOffsetFields diff --git a/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/PipetteFields/WellsOrderField.tsx b/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/PipetteFields/WellsOrderField.tsx index 9ddab626359..eb822bdce80 100644 --- a/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/PipetteFields/WellsOrderField.tsx +++ b/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/PipetteFields/WellsOrderField.tsx @@ -13,11 +13,13 @@ import { ALIGN_CENTER, } from '@opentrons/components' import { WellOrderModal } from '../../../../../organisms' -import type { WellOrderOption } from '../../../../../form-types' + import type { FieldProps } from '../types' +import type { WellOrderOption } from '../../../../../form-types' +import type { MoveLiquidPrefixType } from '../../../../../resources/types' export interface WellsOrderFieldProps { - prefix: 'aspirate' | 'dispense' | 'mix' + prefix: MoveLiquidPrefixType firstName: string secondName: string updateFirstWellOrder: FieldProps['updateValue'] diff --git a/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/StepTools/MoveLiquidTools/MultipleStepsMoveLiquidTools.tsx b/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/StepTools/MoveLiquidTools/MultipleStepsMoveLiquidTools.tsx new file mode 100644 index 00000000000..c9242a9b37a --- /dev/null +++ b/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/StepTools/MoveLiquidTools/MultipleStepsMoveLiquidTools.tsx @@ -0,0 +1,477 @@ +import { useSelector } from 'react-redux' +import { useTranslation } from 'react-i18next' +import { + ALIGN_CENTER, + COLORS, + DIRECTION_COLUMN, + Divider, + Flex, + Icon, + ListItem, + SPACING, + StyledText, + Tabs, + Tooltip, + useHoverTooltip, +} from '@opentrons/components' +import { getTrashOrLabware } from '@opentrons/step-generation' + +import { + BlowoutLocationField, + BlowoutOffsetField, + DisposalField, + FlowRateField, + PositionField, + WellsOrderField, +} from '../../PipetteFields' +import { getEnableLiquidClasses } from '../../../../../../feature-flags/selectors' +import { + CheckboxExpandStepFormField, + InputStepFormField, + ToggleStepFormField, +} from '../../../../../../molecules' +import { + getAdditionalEquipmentEntities, + getLabwareEntities, +} from '../../../../../../step-forms/selectors' +import { + getBlowoutLocationOptionsForForm, + getFormErrorsMappedToField, + getFormLevelError, + getLabwareFieldForPositioningField, +} from '../../utils' + +import type { Dispatch, SetStateAction } from 'react' +import type { FieldPropsByName, LiquidHandlingTab } from '../../types' +import type { FormData, StepFieldName } from '../../../../../../form-types' +import type { StepFormErrors } from '../../../../../../steplist' + +const addPrefix = (prefix: string) => (fieldName: string): StepFieldName => + `${prefix}_${fieldName}` + +interface MultipleStepsMoveLiquidToolsProps { + propsForFields: FieldPropsByName + formData: FormData + tab: LiquidHandlingTab + setTab: Dispatch> + setShowFormErrors?: Dispatch> + visibleFormErrors: StepFormErrors +} + +export const MultipleStepsMoveLiquidTools = ({ + propsForFields, + formData, + tab, + setTab, + setShowFormErrors, + visibleFormErrors, +}: MultipleStepsMoveLiquidToolsProps): JSX.Element => { + const { t, i18n } = useTranslation(['protocol_steps', 'form', 'tooltip']) + const [targetProps, tooltipProps] = useHoverTooltip() + const labwares = useSelector(getLabwareEntities) + const additionalEquipmentEntities = useSelector( + getAdditionalEquipmentEntities + ) + const enableLiquidClasses = useSelector(getEnableLiquidClasses) + + const addFieldNamePrefix = addPrefix(tab) + const isWasteChuteSelected = + propsForFields.dispense_labware?.value != null + ? additionalEquipmentEntities[ + String(propsForFields.dispense_labware.value) + ]?.name === 'wasteChute' + : false + const isTrashBinSelected = + propsForFields.dispense_labware?.value != null + ? additionalEquipmentEntities[ + String(propsForFields.dispense_labware.value) + ]?.name === 'trashBin' + : false + const destinationLabwareType = + formData.dispense_labware != null + ? getTrashOrLabware( + labwares, + additionalEquipmentEntities, + formData.dispense_labware as string + ) + : null + const isDestinationTrash = + destinationLabwareType != null + ? ['trashBin', 'wasteChute'].includes(destinationLabwareType) + : false + const dispenseMixDisabledTooltipText = t( + `tooltip:step_fields.moveLiquid.disabled.${ + isDestinationTrash ? 'dispense_mix_checkbox' : 'dispense_mix_checkbox_2' + }` + ) + + const aspirateTab = { + text: t('aspirate'), + isActive: tab === 'aspirate', + onClick: () => { + setTab('aspirate') + setShowFormErrors?.(false) + }, + } + const dispenseTab = { + text: t('dispense'), + isActive: tab === 'dispense', + onClick: () => { + setTab('dispense') + setShowFormErrors?.(false) + }, + } + + const hideWellOrderField = + tab === 'dispense' && (isWasteChuteSelected || isTrashBinSelected) + + const mappedErrorsToField = getFormErrorsMappedToField(visibleFormErrors) + + return ( + + + + + + + + {hideWellOrderField ? null : ( + + )} + + + {enableLiquidClasses ? ( + <> + + + + + {t('protocol_steps:submerge')} + + + + + + {t(`tooltip:step_fields.defaults.${tab}_submerge`)} + + + + + + + + + + + ) : null} + + + + {t('protocol_steps:advanced_settings')} + + {tab === 'aspirate' ? ( + + ) : null} + + {formData[`${tab}_mix_checkbox`] === true ? ( + + + + + ) : null} + + + {formData[`${tab}_delay_checkbox`] === true ? ( + + + + + ) : null} + + {tab === 'dispense' ? ( + + {formData.blowout_checkbox === true ? ( + + + + + + ) : null} + + ) : null} + + {formData[`${tab}_touchTip_checkbox`] === true ? ( + + ) : null} + + + {formData[`${tab}_airGap_checkbox`] === true ? ( + + ) : null} + + {formData.path === 'multiDispense' && tab === 'dispense' && ( + + )} + + + ) +} diff --git a/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/StepTools/MoveLiquidTools/SingleStepMoveLiquidTools.tsx b/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/StepTools/MoveLiquidTools/SingleStepMoveLiquidTools.tsx new file mode 100644 index 00000000000..18c1878610e --- /dev/null +++ b/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/StepTools/MoveLiquidTools/SingleStepMoveLiquidTools.tsx @@ -0,0 +1,191 @@ +import { useTranslation } from 'react-i18next' +import { useSelector } from 'react-redux' + +import { Flex, Divider, DIRECTION_COLUMN, SPACING } from '@opentrons/components' +import { + getAdditionalEquipmentEntities, + getLabwareEntities, + getPipetteEntities, +} from '../../../../../../step-forms/selectors' +import { getFormErrorsMappedToField, getFormLevelError } from '../../utils' +import { getEnableReturnTip } from '../../../../../../feature-flags/selectors' + +import { + ChangeTipField, + DropTipField, + LabwareField, + PartialTipField, + PathField, + PickUpTipField, + PipetteField, + TiprackField, + TipWellSelectionField, + VolumeField, + WellSelectionField, +} from '../../PipetteFields' + +import type { FieldPropsByName } from '../../types' +import type { FormData } from '../../../../../../form-types' +import type { StepFormErrors } from '../../../../../../steplist' + +interface SingleStepMoveLiquidToolsProps { + propsForFields: FieldPropsByName + formData: FormData + visibleFormErrors: StepFormErrors +} + +export function SingleStepMoveLiquidTools({ + propsForFields, + formData, + visibleFormErrors, +}: SingleStepMoveLiquidToolsProps): JSX.Element { + const { t } = useTranslation('protocol_steps') + const labwares = useSelector(getLabwareEntities) + const pipettes = useSelector(getPipetteEntities) + const additionalEquipmentEntities = useSelector( + getAdditionalEquipmentEntities + ) + const enableReturnTip = useSelector(getEnableReturnTip) + + const { pipette, tipRack } = propsForFields + const is96Channel = + pipette.value != null && pipettes[String(pipette.value)].name === 'p1000_96' + const userSelectedDropTipLocation = + labwares[String(propsForFields.dropTip_location.value)] != null + const userSelectedPickUpTipLocation = + labwares[String(propsForFields.pickUpTip_location.value)] != null + const isDisposalLocation = + additionalEquipmentEntities[String(propsForFields.dispense_labware.value)] + ?.name === 'wasteChute' || + additionalEquipmentEntities[String(propsForFields.dispense_labware.value)] + ?.name === 'trashBin' + const mappedErrorsToField = getFormErrorsMappedToField(visibleFormErrors) + + return ( + + + {is96Channel ? ( + <> + + + + ) : null} + + + + + + + error.dependentFields.includes('aspirate_wells') + ) ?? false + } + errorToShow={getFormLevelError('aspirate_wells', mappedErrorsToField)} + /> + + + + + {isDisposalLocation ? null : ( + + error.dependentFields.includes('dispense_wells') + ) ?? false + } + errorToShow={getFormLevelError( + 'dispense_wells', + mappedErrorsToField + )} + /> + )} + + + + + + + + {enableReturnTip ? ( + <> + + + {userSelectedPickUpTipLocation ? ( + <> + + + ) : null} + + ) : null} + + + {userSelectedDropTipLocation && enableReturnTip ? ( + <> + + + + ) : null} + + ) +} diff --git a/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/StepTools/MoveLiquidTools/__tests__/MoveLiquidTools.test.tsx b/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/StepTools/MoveLiquidTools/__tests__/MoveLiquidTools.test.tsx new file mode 100644 index 00000000000..e2f26d86c36 --- /dev/null +++ b/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/StepTools/MoveLiquidTools/__tests__/MoveLiquidTools.test.tsx @@ -0,0 +1,56 @@ +import { describe, it, beforeEach, vi } from 'vitest' +import { screen } from '@testing-library/react' + +import { renderWithProviders } from '../../../../../../../__testing-utils__' + +import { SingleStepMoveLiquidTools } from '../SingleStepMoveLiquidTools' +import { MultipleStepsMoveLiquidTools } from '../MultipleStepsMoveLiquidTools' + +import { MoveLiquidTools } from '../' + +import type { ComponentProps } from 'react' +import type { FieldPropsByName } from '../../../types' +import type { FormData } from '../../../../../../../form-types' +import type { StepFormErrors } from '../../../../../../../steplist' + +vi.mock('../SingleStepMoveLiquidTools') +vi.mock('../MultipleStepsMoveLiquidTools') + +const render = (props: ComponentProps) => { + return renderWithProviders() +} + +describe('MoveLiquidTools', () => { + let props: ComponentProps + + beforeEach(() => { + props = { + toolboxStep: 0, + propsForFields: {} as FieldPropsByName, + formData: {} as FormData, + visibleFormErrors: {} as StepFormErrors, + tab: 'aspirate', + setTab: vi.fn(), + focusHandlers: {} as any, + showFormErrors: false, + } + + vi.mocked(SingleStepMoveLiquidTools).mockReturnValue( +
mock SingleStepMoveLiquidTools
+ ) + vi.mocked(MultipleStepsMoveLiquidTools).mockReturnValue( +
mock MultipleStepsMoveLiquidTools
+ ) + }) + + it('renders SingleStepMoveLiquidTools when there is only one step', () => { + render(props) + screen.getByText('mock SingleStepMoveLiquidTools') + }) + + it('renders MultipleStepsMoveLiquidTools when there are multiple steps', () => { + props.toolboxStep = 3 + render(props) + screen.getByText('mock MultipleStepsMoveLiquidTools') + }) +}) diff --git a/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/StepTools/MoveLiquidTools/__tests__/SingleStepMoveLiquidTools.test.tsx b/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/StepTools/MoveLiquidTools/__tests__/SingleStepMoveLiquidTools.test.tsx new file mode 100644 index 00000000000..f13beb33120 --- /dev/null +++ b/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/StepTools/MoveLiquidTools/__tests__/SingleStepMoveLiquidTools.test.tsx @@ -0,0 +1,109 @@ +import { describe, it, beforeEach, vi } from 'vitest' +import { screen } from '@testing-library/react' +import { fixture96Plate } from '@opentrons/shared-data' + +import { renderWithProviders } from '../../../../../../../__testing-utils__' +import { i18n } from '../../../../../../../assets/localization' +import { + getAdditionalEquipmentEntities, + getLabwareEntities, + getPipetteEntities, +} from '../../../../../../../step-forms/selectors' +import { + PipetteField, + TiprackField, + LabwareField, + WellSelectionField, + VolumeField, + PathField, + ChangeTipField, + DropTipField, + PickUpTipField, + TipWellSelectionField, +} from '../../../PipetteFields' +import { getEnableReturnTip } from '../../../../../../../feature-flags/selectors' +import propsForFieldsForSingleStep from '../../../../../../../__fixtures__/propsForFieldsForSingleStep.json' +import formDataForSingleStep from '../../../../../../../__fixtures__/formDataForSingleStep.json' +import { SingleStepMoveLiquidTools } from '../SingleStepMoveLiquidTools' + +import type { ComponentProps } from 'react' +import type { LabwareDefinition2 } from '@opentrons/shared-data' + +vi.mock('../../../../../../../step-forms/selectors') +vi.mock('../../../PipetteFields') +vi.mock('../../../../../../../feature-flags/selectors') + +const labwareId = 'mockLabwareId' +const pipetteId = 'mockPipetteId' + +const render = (props: ComponentProps) => { + return renderWithProviders(, { + i18nInstance: i18n, + }) +} + +describe('SingleStepMoveLiquidTools', () => { + let props: ComponentProps + beforeEach(() => { + props = { + propsForFields: propsForFieldsForSingleStep as any, + formData: formDataForSingleStep as any, + visibleFormErrors: [] as any, + } + + vi.mocked(getLabwareEntities).mockReturnValue({ + labwareId: { + id: labwareId, + labwareDefURI: 'mockUri', + def: fixture96Plate as LabwareDefinition2, + pythonName: 'mockPythonName', + }, + }) + + vi.mocked(getPipetteEntities).mockReturnValue({ + [pipetteId]: { + name: 'p50_single_flex', + spec: {} as any, + id: pipetteId, + tiprackLabwareDef: [], + tiprackDefURI: ['mockDefURI1', 'mockDefURI2'], + pythonName: 'mockPythonName', + }, + }) + vi.mocked(getAdditionalEquipmentEntities).mockReturnValue({}) + + vi.mocked(PipetteField).mockReturnValue(
mock PipetteField
) + vi.mocked(TiprackField).mockReturnValue(
mock TiprackField
) + vi.mocked(LabwareField).mockReturnValue(
mock LabwareField
) + vi.mocked(WellSelectionField).mockReturnValue( +
mock WellSelectionField
+ ) + vi.mocked(VolumeField).mockReturnValue(
mock VolumeField
) + vi.mocked(PathField).mockReturnValue(
mock PathField
) + vi.mocked(ChangeTipField).mockReturnValue(
mock ChangeTipField
) + vi.mocked(DropTipField).mockReturnValue(
mock DropTipField
) + vi.mocked(PickUpTipField).mockReturnValue(
mock PickUpTipField
) + vi.mocked(TipWellSelectionField).mockReturnValue( +
mock TipWellSelectionField
+ ) + vi.mocked(getEnableReturnTip).mockReturnValue(false) + }) + + it('renders fields', () => { + render(props) + screen.getByText('mock PipetteField') + screen.getByText('mock TiprackField') + screen.getAllByText('mock LabwareField') + screen.getAllByText('mock WellSelectionField') + screen.getByText('mock VolumeField') + screen.getByText('mock PathField') + screen.getByText('mock ChangeTipField') + screen.getByText('mock DropTipField') + }) + + it('renders fields when feature flag is enabled', () => { + vi.mocked(getEnableReturnTip).mockReturnValue(true) + render(props) + screen.getByText('mock PickUpTipField') + }) +}) diff --git a/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/StepTools/MoveLiquidTools/index.tsx b/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/StepTools/MoveLiquidTools/index.tsx index da137eccf9c..551b94aec1b 100644 --- a/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/StepTools/MoveLiquidTools/index.tsx +++ b/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/StepTools/MoveLiquidTools/index.tsx @@ -1,65 +1,7 @@ -import { useSelector } from 'react-redux' -import { useTranslation } from 'react-i18next' -import { - ALIGN_CENTER, - COLORS, - DIRECTION_COLUMN, - Divider, - Flex, - Icon, - ListItem, - SPACING, - StyledText, - Tabs, - Tooltip, - useHoverTooltip, -} from '@opentrons/components' -import { getTrashOrLabware } from '@opentrons/step-generation' -import { - getEnableLiquidClasses, - getEnableReturnTip, -} from '../../../../../../feature-flags/selectors' -import { - getAdditionalEquipmentEntities, - getLabwareEntities, - getPipetteEntities, -} from '../../../../../../step-forms/selectors' -import { - CheckboxExpandStepFormField, - InputStepFormField, - ToggleStepFormField, -} from '../../../../../../molecules' -import { - BlowoutLocationField, - BlowoutOffsetField, - ChangeTipField, - DisposalField, - DropTipField, - FlowRateField, - LabwareField, - PartialTipField, - PathField, - PickUpTipField, - PipetteField, - PositionField, - TiprackField, - TipWellSelectionField, - VolumeField, - WellSelectionField, - WellsOrderField, -} from '../../PipetteFields' -import { - getBlowoutLocationOptionsForForm, - getFormErrorsMappedToField, - getFormLevelError, - getLabwareFieldForPositioningField, -} from '../../utils' -import type { StepFieldName } from '../../../../../../form-types' -import type { StepFormProps } from '../../types' +import { SingleStepMoveLiquidTools } from './SingleStepMoveLiquidTools' +import { MultipleStepsMoveLiquidTools } from './MultipleStepsMoveLiquidTools' -const makeAddFieldNamePrefix = (prefix: string) => ( - fieldName: string -): StepFieldName => `${prefix}_${fieldName}` +import type { StepFormProps } from '../../types' export function MoveLiquidTools(props: StepFormProps): JSX.Element { const { @@ -71,557 +13,21 @@ export function MoveLiquidTools(props: StepFormProps): JSX.Element { tab, setTab, } = props - const [targetProps, tooltipProps] = useHoverTooltip() - const { t, i18n } = useTranslation(['protocol_steps', 'form', 'tooltip']) - const { path } = formData - const additionalEquipmentEntities = useSelector( - getAdditionalEquipmentEntities - ) - const enableLiquidClasses = useSelector(getEnableLiquidClasses) - const enableReturnTip = useSelector(getEnableReturnTip) - const labwares = useSelector(getLabwareEntities) - const pipettes = useSelector(getPipetteEntities) - const addFieldNamePrefix = makeAddFieldNamePrefix(tab) - - const isWasteChuteSelected = - propsForFields.dispense_labware?.value != null - ? additionalEquipmentEntities[ - String(propsForFields.dispense_labware.value) - ]?.name === 'wasteChute' - : false - const isTrashBinSelected = - propsForFields.dispense_labware?.value != null - ? additionalEquipmentEntities[ - String(propsForFields.dispense_labware.value) - ]?.name === 'trashBin' - : false - const userSelectedPickUpTipLocation = - labwares[String(propsForFields.pickUpTip_location.value)] != null - const userSelectedDropTipLocation = - labwares[String(propsForFields.dropTip_location.value)] != null - - const is96Channel = - propsForFields.pipette.value != null && - pipettes[String(propsForFields.pipette.value)].name === 'p1000_96' - const isDisposalLocation = - additionalEquipmentEntities[String(propsForFields.dispense_labware.value)] - ?.name === 'wasteChute' || - additionalEquipmentEntities[String(propsForFields.dispense_labware.value)] - ?.name === 'trashBin' - - const destinationLabwareType = - formData.dispense_labware != null - ? getTrashOrLabware( - labwares, - additionalEquipmentEntities, - formData.dispense_labware as string - ) - : null - const isDestinationTrash = - destinationLabwareType != null - ? ['trashBin', 'wasteChute'].includes(destinationLabwareType) - : false - const dispenseMixDisabledTooltipText = t( - `tooltip:step_fields.moveLiquid.disabled.${ - isDestinationTrash ? 'dispense_mix_checkbox' : 'dispense_mix_checkbox_2' - }` - ) - const aspirateTab = { - text: t('aspirate'), - isActive: tab === 'aspirate', - onClick: () => { - setTab('aspirate') - setShowFormErrors?.(false) - }, - } - const dispenseTab = { - text: t('dispense'), - - isActive: tab === 'dispense', - onClick: () => { - setTab('dispense') - setShowFormErrors?.(false) - }, - } - const hideWellOrderField = - tab === 'dispense' && (isWasteChuteSelected || isTrashBinSelected) - - const mappedErrorsToField = getFormErrorsMappedToField(visibleFormErrors) return toolboxStep === 0 ? ( - - - {is96Channel ? ( - <> - - - - ) : null} - - - - - - - error.dependentFields.includes('aspirate_wells') - ) ?? false - } - errorToShow={getFormLevelError('aspirate_wells', mappedErrorsToField)} - /> - - - - - {isDisposalLocation ? null : ( - - error.dependentFields.includes('dispense_wells') - ) ?? false - } - errorToShow={getFormLevelError( - 'dispense_wells', - mappedErrorsToField - )} - /> - )} - - - - - - - - {enableReturnTip ? ( - <> - - - {userSelectedPickUpTipLocation ? ( - <> - - - ) : null} - - ) : null} - - - {userSelectedDropTipLocation && enableReturnTip ? ( - <> - - - - ) : null} - + ) : ( - - - - - - - - {hideWellOrderField ? null : ( - - )} - - - {enableLiquidClasses ? ( - <> - - - - - {t('protocol_steps:submerge')} - - - - - - {t(`tooltip:step_fields.defaults.${tab}_submerge`)} - - - - - - - - - - - ) : null} - - - - {t('protocol_steps:advanced_settings')} - - {tab === 'aspirate' ? ( - - ) : null} - - {formData[`${tab}_mix_checkbox`] === true ? ( - - - - - ) : null} - - - {formData[`${tab}_delay_checkbox`] === true ? ( - - - - - ) : null} - - {tab === 'dispense' ? ( - - {formData.blowout_checkbox === true ? ( - - - - - - ) : null} - - ) : null} - - {formData[`${tab}_touchTip_checkbox`] === true ? ( - - ) : null} - - - {formData[`${tab}_airGap_checkbox`] === true ? ( - - ) : null} - - {path === 'multiDispense' && tab === 'dispense' && ( - - )} - - + ) } diff --git a/protocol-designer/src/resources/types.ts b/protocol-designer/src/resources/types.ts new file mode 100644 index 00000000000..2ba80485797 --- /dev/null +++ b/protocol-designer/src/resources/types.ts @@ -0,0 +1,3 @@ +export type MoveLiquidPrefixType = 'aspirate' | 'dispense' | 'mix' + +export type FlowRateType = 'aspirate' | 'dispense' | 'blowout' diff --git a/protocol-designer/src/steplist/formLevel/errors.ts b/protocol-designer/src/steplist/formLevel/errors.ts index eb851637d32..eeda0294b68 100644 --- a/protocol-designer/src/steplist/formLevel/errors.ts +++ b/protocol-designer/src/steplist/formLevel/errors.ts @@ -23,6 +23,7 @@ import type { ReactNode } from 'react' import type { LabwareDefinition2, PipetteV2Specs } from '@opentrons/shared-data' import type { LabwareEntities, PipetteEntity } from '@opentrons/step-generation' import type { StepFieldName } from '../../form-types' +import type { LiquidHandlingTab } from '../../pages/Designer/ProtocolSteps/StepForm/types' /******************* ** Error Messages ** ********************/ @@ -59,7 +60,7 @@ export interface FormError { showAtField?: boolean showAtForm?: boolean page?: number - tab?: 'aspirate' | 'dispense' + tab?: LiquidHandlingTab } const INCOMPATIBLE_ASPIRATE_LABWARE: FormError = { title: 'Selected aspirate labware is incompatible with pipette', From 731fb9e908562d4784a20554b166a9ac4a0fbb53 Mon Sep 17 00:00:00 2001 From: koji Date: Tue, 11 Feb 2025 15:14:11 -0500 Subject: [PATCH 120/150] feat(protocol-designer): add TextAreaField component to protocol-designer (#17487) * feat(protocol-designer): add TextAreaField component to protocol-designer --- .../TextAreaField/TextAreaField.stories.tsx | 46 +++ .../__tests__/TextAreaField.test.tsx | 69 ++++ .../src/molecules/TextAreaField/index.tsx | 314 ++++++++++++++++++ protocol-designer/src/molecules/index.ts | 1 + .../CreateNewProtocolWizard/AddMetadata.tsx | 30 +- 5 files changed, 442 insertions(+), 18 deletions(-) create mode 100644 protocol-designer/src/molecules/TextAreaField/TextAreaField.stories.tsx create mode 100644 protocol-designer/src/molecules/TextAreaField/__tests__/TextAreaField.test.tsx create mode 100644 protocol-designer/src/molecules/TextAreaField/index.tsx diff --git a/protocol-designer/src/molecules/TextAreaField/TextAreaField.stories.tsx b/protocol-designer/src/molecules/TextAreaField/TextAreaField.stories.tsx new file mode 100644 index 00000000000..ec0cf083d27 --- /dev/null +++ b/protocol-designer/src/molecules/TextAreaField/TextAreaField.stories.tsx @@ -0,0 +1,46 @@ +import * as React from 'react' +import { + DIRECTION_COLUMN, + Flex, + SPACING, + VIEWPORT, +} from '@opentrons/components' +import { TextAreaField as TextAreaFieldComponent } from '.' + +import type { ComponentProps } from 'react' +import type { Meta, StoryObj } from '@storybook/react' + +const meta: Meta = { + // ToDo (kk05/02/2024) this should be in Library but at this moment there is the same name component in components + // The unification for this component will be done when the old component is retired completely. + title: 'Protocol-Designer/Molecules/TextAreaField', + component: TextAreaFieldComponent, + parameters: VIEWPORT.touchScreenViewport, + argTypes: {}, +} + +export default meta +type Story = StoryObj + +export const TextAreaField: Story = ( + args: ComponentProps +) => { + const [value, setValue] = React.useState(args.value) + return ( + + { + setValue(e.currentTarget.value) + }} + /> + + ) +} + +TextAreaField.args = { + title: 'TextAreaField', + height: '6.8125rem', + placeholder: 'Placeholder Text', +} diff --git a/protocol-designer/src/molecules/TextAreaField/__tests__/TextAreaField.test.tsx b/protocol-designer/src/molecules/TextAreaField/__tests__/TextAreaField.test.tsx new file mode 100644 index 00000000000..ce7a90feef4 --- /dev/null +++ b/protocol-designer/src/molecules/TextAreaField/__tests__/TextAreaField.test.tsx @@ -0,0 +1,69 @@ +import { describe, it, beforeEach, vi, expect } from 'vitest' +import { screen, fireEvent } from '@testing-library/react' + +import { renderWithProviders } from '../../../__testing-utils__' +import { TextAreaField } from '../' + +import type { ComponentProps } from 'react' + +const render = (props: ComponentProps) => { + return renderWithProviders() +} + +describe('TextAreaField', () => { + let props: ComponentProps + + beforeEach(() => { + props = { + title: 'TextAreaField', + placeholder: 'Enter text...', + value: '', + onChange: vi.fn(), + } + }) + + it('renders the TextAreaField component', () => { + render(props) + screen.getByText('TextAreaField') + expect(screen.getByTestId('TextAreaField')).toBeInTheDocument() + }) + + it('displays the correct placeholder text', () => { + render(props) + expect(screen.getByPlaceholderText('Enter text...')).toBeInTheDocument() + }) + + it('updates value when user types', () => { + render(props) + const textarea = screen.getByTestId('TextAreaField') + + fireEvent.change(textarea, { target: { value: 'Hello, world!' } }) + + expect(props.onChange).toHaveBeenCalledTimes(1) + }) + + it('disables the textarea when disabled prop is true', () => { + props.disabled = true + render(props) + expect(screen.getByTestId('TextAreaField')).toBeDisabled() + }) + + it('displays an error message when error prop is provided', () => { + props.error = 'Error: Invalid input' + render(props) + + expect(screen.getByText('Error: Invalid input')).toBeInTheDocument() + }) + + it('display an icon when tooltip prop is provided', () => { + props.tooltipText = 'ot-icon-check' + render(props) + screen.getByTestId('tooltip-icon') + }) + + it('display left icon when leftIcon prop is provided', () => { + props.leftIcon = 'information' + render(props) + screen.getByTestId('left-icon') + }) +}) diff --git a/protocol-designer/src/molecules/TextAreaField/index.tsx b/protocol-designer/src/molecules/TextAreaField/index.tsx new file mode 100644 index 00000000000..7bc91ea616a --- /dev/null +++ b/protocol-designer/src/molecules/TextAreaField/index.tsx @@ -0,0 +1,314 @@ +import { useEffect, useState, forwardRef } from 'react' +import styled, { css } from 'styled-components' +import { + ALIGN_CENTER, + BORDERS, + COLORS, + DIRECTION_COLUMN, + DIRECTION_ROW, + Flex, + Icon, + PRODUCT, + SPACING, + StyledText, + TEXT_ALIGN_RIGHT, + Tooltip, + TYPOGRAPHY, + useHoverTooltip, +} from '@opentrons/components' + +import type { + ChangeEventHandler, + FocusEvent, + MouseEvent, + MutableRefObject, +} from 'react' +import type { FlattenSimpleInterpolation } from 'styled-components' +import type { IconName } from '@opentrons/components' + +const COLOR_WARNING_DARK = '#9e5e00' // ToDo (kk:08/13/2024) replace this with COLORS + +// hook to detect tab focus vs mouse focus +const useFocusVisible = (): boolean => { + const [isKeyboardFocus, setIsKeyboardFocus] = useState(false) + + useEffect(() => { + const handleKeyDown = (): void => { + setIsKeyboardFocus(true) + } + const handleMouseDown = (): void => { + setIsKeyboardFocus(false) + } + + document.addEventListener('keydown', handleKeyDown) + document.addEventListener('mousedown', handleMouseDown) + + return () => { + document.removeEventListener('keydown', handleKeyDown) + document.removeEventListener('mousedown', handleMouseDown) + } + }, []) + + return isKeyboardFocus +} + +export interface TextAreaFieldProps { + /** field is disabled if value is true */ + disabled?: boolean + /** change handler */ + onChange?: ChangeEventHandler + /** name of field in form */ + name?: string + /** optional ID of