From 3094f5ee6fb01652f1d7faa03e20c16a07b972bd Mon Sep 17 00:00:00 2001 From: pmoegenburg Date: Mon, 25 Mar 2024 17:33:16 -0400 Subject: [PATCH 1/8] feat(hardware): handle motor driver errors (#13867) This PR enables the reporting of Flex motor driver errors, adding the MotorDriverError exception. Specific motor driver errors are over-temperature, short circuit, and open circuit. An ErrorMessage is reported from the Flex firmware in two cases: 1. As a response to a move request when a motor driver is in error state. In this case, the error is logged. 2. If a motor driver enters error state during a move. In this case, a subsequent ReadMotorDriverErrorStatusResponse message is reported from the Flex firmware, which details the specific error. This PR logs these messages and also raises these messages as MotorDriverError exceptions. # Overview # Test Plan - [ ] Test both use cases on robot. In second use case, ensure ReadMotorDriverErrorStatusResponse message is associated with requesting MoveID. - [x] Write software tests for both use cases. In second use case, ensure each specific error is parsed. # Changelog # Review requests # Risk assessment Low. Adds MotorDriverError to existing list of exceptions. Introduces handling and parsing of ReadMotorDriverErrorStatusResponse message, using existing well-tested frameworks and concepts. --- hardware/opentrons_hardware/errors.py | 4 + .../firmware_bindings/constants.py | 13 +++ .../messages/message_definitions.py | 20 +++++ .../firmware_bindings/messages/messages.py | 2 + .../firmware_bindings/messages/payloads.py | 8 ++ .../hardware_control/move_group_runner.py | 41 ++++++++++ .../test_move_group_runner.py | 82 +++++++++++++++++++ shared-data/errors/definitions/1/errors.json | 4 + .../opentrons_shared_data/errors/codes.py | 1 + .../errors/exceptions.py | 13 +++ 10 files changed, 188 insertions(+) diff --git a/hardware/opentrons_hardware/errors.py b/hardware/opentrons_hardware/errors.py index dc36c976a60a..9a7e45175284 100644 --- a/hardware/opentrons_hardware/errors.py +++ b/hardware/opentrons_hardware/errors.py @@ -13,6 +13,7 @@ LabwareDroppedError, PythonException, HepaUVFailedError, + MotorDriverError, ) from opentrons_hardware.firmware_bindings.messages.message_definitions import ( @@ -138,6 +139,9 @@ def raise_from_error_message( # noqa: C901 message="Unexpected robotics error", detail=detail_dict ) + if error_code in (ErrorCode.motor_driver_error_detected,): + raise MotorDriverError(detail=detail_dict) + raise RoboticsControlError(message="Hardware error", detail=detail_dict) diff --git a/hardware/opentrons_hardware/firmware_bindings/constants.py b/hardware/opentrons_hardware/firmware_bindings/constants.py index 9e82e3571926..5c9ec46d8060 100644 --- a/hardware/opentrons_hardware/firmware_bindings/constants.py +++ b/hardware/opentrons_hardware/firmware_bindings/constants.py @@ -191,6 +191,8 @@ class MessageId(int, Enum): write_motor_current_request = 0x33 read_motor_current_request = 0x34 read_motor_current_response = 0x35 + read_motor_driver_error_status_request = 0x36 + read_motor_driver_error_status_response = 0x37 set_brushed_motor_vref_request = 0x40 set_brushed_motor_pwm_request = 0x41 @@ -265,6 +267,7 @@ class MessageId(int, Enum): class ErrorSeverity(int, Enum): """Error Severity levels.""" + none = 0x0 warning = 0x1 recoverable = 0x2 unrecoverable = 0x3 @@ -290,6 +293,16 @@ class ErrorCode(int, Enum): over_pressure = 0x0D door_open = 0x0E reed_open = 0x0F + motor_driver_error_detected = 0x10 + + +@unique +class MotorDriverErrorCode(int, Enum): + """Motor driver error codes.""" + + over_temperature = 0x2000000 + short_circuit = 0x18000000 + open_circuit = 0x60000000 @unique diff --git a/hardware/opentrons_hardware/firmware_bindings/messages/message_definitions.py b/hardware/opentrons_hardware/firmware_bindings/messages/message_definitions.py index 0bb14ec62be3..3164d147fdee 100644 --- a/hardware/opentrons_hardware/firmware_bindings/messages/message_definitions.py +++ b/hardware/opentrons_hardware/firmware_bindings/messages/message_definitions.py @@ -358,6 +358,26 @@ class ReadMotorDriverResponse(BaseMessage): # noqa: D101 ] = MessageId.read_motor_driver_register_response +@dataclass +class ReadMotorDriverErrorStatusRequest(BaseMessage): # noqa: D101 + payload: payloads.EmptyPayload + payload_type: Type[payloads.EmptyPayload] = payloads.EmptyPayload + message_id: Literal[ + MessageId.read_motor_driver_error_status_request + ] = MessageId.read_motor_driver_error_status_request + + +@dataclass +class ReadMotorDriverErrorStatusResponse(BaseMessage): # noqa: D101 + payload: payloads.ReadMotorDriverErrorStatusResponsePayload + payload_type: Type[ + payloads.ReadMotorDriverErrorStatusResponsePayload + ] = payloads.ReadMotorDriverErrorStatusResponsePayload + message_id: Literal[ + MessageId.read_motor_driver_error_status_response + ] = MessageId.read_motor_driver_error_status_response + + @dataclass class WriteMotorCurrentRequest(BaseMessage): # noqa: D101 payload: payloads.MotorCurrentPayload diff --git a/hardware/opentrons_hardware/firmware_bindings/messages/messages.py b/hardware/opentrons_hardware/firmware_bindings/messages/messages.py index 2c979b852829..6611edecfe4d 100644 --- a/hardware/opentrons_hardware/firmware_bindings/messages/messages.py +++ b/hardware/opentrons_hardware/firmware_bindings/messages/messages.py @@ -42,6 +42,8 @@ defs.WriteMotorDriverRegister, defs.ReadMotorDriverRequest, defs.ReadMotorDriverResponse, + defs.ReadMotorDriverErrorStatusRequest, + defs.ReadMotorDriverErrorStatusResponse, defs.WriteMotorCurrentRequest, defs.SetBrushedMotorVrefRequest, defs.SetBrushedMotorPwmRequest, diff --git a/hardware/opentrons_hardware/firmware_bindings/messages/payloads.py b/hardware/opentrons_hardware/firmware_bindings/messages/payloads.py index e4f212287bf1..64a57cae11a5 100644 --- a/hardware/opentrons_hardware/firmware_bindings/messages/payloads.py +++ b/hardware/opentrons_hardware/firmware_bindings/messages/payloads.py @@ -265,6 +265,14 @@ class ReadMotorDriverRegisterResponsePayload(EmptyPayload): data: utils.UInt32Field +@dataclass(eq=False) +class ReadMotorDriverErrorStatusResponsePayload(EmptyPayload): + """Read motor driver error status response payload.""" + + reg_addr: utils.UInt8Field + data: utils.UInt32Field + + @dataclass(eq=False) class MotorCurrentPayload(EmptyPayload): """Read motor current register payload.""" diff --git a/hardware/opentrons_hardware/hardware_control/move_group_runner.py b/hardware/opentrons_hardware/hardware_control/move_group_runner.py index b6668e7133cd..b5ab03db8fcd 100644 --- a/hardware/opentrons_hardware/hardware_control/move_group_runner.py +++ b/hardware/opentrons_hardware/hardware_control/move_group_runner.py @@ -13,6 +13,7 @@ EStopActivatedError, MotionFailedError, PythonException, + MotorDriverError, ) from opentrons_hardware.firmware_bindings import ArbitrationId @@ -22,6 +23,7 @@ ErrorSeverity, GearMotorId, MoveAckId, + MotorDriverErrorCode, SensorId, ) from opentrons_hardware.drivers.can_bus.can_messenger import CanMessenger @@ -39,6 +41,7 @@ TipActionResponse, ErrorMessage, StopRequest, + ReadMotorDriverErrorStatusResponse, AddSensorLinearMoveRequest, ) from opentrons_hardware.firmware_bindings.messages.payloads import ( @@ -526,6 +529,42 @@ def _handle_move_completed( # pick up groups they don't care about, and need to not fail. pass + def _handle_motor_driver_error( + self, message: ReadMotorDriverErrorStatusResponse, arbitration_id: ArbitrationId + ) -> None: + node_id = arbitration_id.parts.originating_node_id + data = message.payload.data.value + if data & MotorDriverErrorCode.over_temperature.value: + log.error(f"Motor driver over-temperature error from node {node_id}") + self._errors.append( + MotorDriverError( + detail={ + "node": NodeId(node_id).name, + "error": "over temperature", + } + ) + ) + if data & MotorDriverErrorCode.short_circuit.value: + log.error(f"Motor driver short circuit error from node {node_id}") + self._errors.append( + MotorDriverError( + detail={ + "node": NodeId(node_id).name, + "error": "short circuit", + } + ) + ) + if data & MotorDriverErrorCode.open_circuit.value: + log.error(f"Motor driver open circuit error from node {node_id}") + self._errors.append( + MotorDriverError( + detail={ + "node": NodeId(node_id).name, + "error": "open circuit", + } + ) + ) + def __call__( self, message: MessageDefinition, arbitration_id: ArbitrationId ) -> None: @@ -539,6 +578,8 @@ def __call__( self._handle_move_completed(message, arbitration_id) elif isinstance(message, ErrorMessage): self._handle_error(message, arbitration_id) + elif isinstance(message, ReadMotorDriverErrorStatusResponse): + self._handle_motor_driver_error(message, arbitration_id) def _handle_tip_action_motors(self, message: TipActionResponse) -> bool: gear_id = GearMotorId(message.payload.gear_motor_id.value) diff --git a/hardware/tests/opentrons_hardware/hardware_control/test_move_group_runner.py b/hardware/tests/opentrons_hardware/hardware_control/test_move_group_runner.py index 0a189f2289d2..f4b41cae67cb 100644 --- a/hardware/tests/opentrons_hardware/hardware_control/test_move_group_runner.py +++ b/hardware/tests/opentrons_hardware/hardware_control/test_move_group_runner.py @@ -17,6 +17,7 @@ ErrorSeverity, PipetteTipActionType, MoveAckId, + MotorDriverErrorCode, ) from opentrons_hardware.drivers.can_bus.can_messenger import ( MessageListenerCallback, @@ -34,6 +35,7 @@ ExecuteMoveGroupRequestPayload, HomeRequestPayload, ErrorMessagePayload, + ReadMotorDriverErrorStatusResponsePayload, ) from opentrons_hardware.firmware_bindings.messages.fields import ( MotorPositionFlagsField, @@ -1418,3 +1420,83 @@ async def test_moves_removed_on_stall_detected( mock_can_messenger.ensure_send.side_effect = mock_sender.mock_ensure_send mock_can_messenger.send.side_effect = mock_sender.mock_send await subject.run(can_messenger=mock_can_messenger) + + +class MockSendMoveDriverErrorCompleter: + """Side effect mock of CanMessenger.send that immediately sends an error.""" + + def __init__( + self, + move_groups: MoveGroups, + listener: MessageListenerCallback, + start_at_index: int = 0, + ) -> None: + """Constructor.""" + self._move_groups = move_groups + self._listener = listener + self._start_at_index = start_at_index + self.call_count = 0 + + @property + def groups(self) -> MoveGroups: + """Retrieve the groups, for instance from a child class.""" + return self._move_groups + + async def mock_send( + self, + node_id: NodeId, + message: MessageDefinition, + ) -> None: + """Mock send function.""" + if isinstance(message, md.ExecuteMoveGroupRequest): + # Iterate through each move in each sequence and send a move + # completed for it. + payload = EmptyPayload() + payload.message_index = message.payload.message_index + arbitration_id = ArbitrationId( + parts=ArbitrationIdParts(originating_node_id=node_id) + ) + self._listener(md.Acknowledgement(payload=payload), arbitration_id) + for seq_id, moves in enumerate( + self._move_groups[message.payload.group_id.value - self._start_at_index] + ): + for node, move in moves.items(): + assert isinstance(move, MoveGroupSingleAxisStep) + code = MotorDriverErrorCode.over_temperature + payload = ReadMotorDriverErrorStatusResponsePayload( + reg_addr=UInt8Field(111), + data=UInt32Field(code), + ) + payload.message_index = message.payload.message_index + arbitration_id = ArbitrationId( + parts=ArbitrationIdParts(originating_node_id=node) + ) + self.call_count += 1 + self._listener( + md.ReadMotorDriverErrorStatusResponse(payload=payload), + arbitration_id, + ) + + async def mock_ensure_send( + self, + node_id: NodeId, + message: MessageDefinition, + timeout: float = 3, + expected_nodes: List[NodeId] = [], + ) -> ErrorCode: + """Mock ensure_send function.""" + await self.mock_send(node_id, message) + return ErrorCode.ok + + +async def test_single_move_driver_error( + mock_can_messenger: AsyncMock, move_group_single: MoveGroups +) -> None: + """It should send a start group command.""" + subject = MoveScheduler(move_groups=move_group_single) + mock_sender = MockSendMoveDriverErrorCompleter(move_group_single, subject) + mock_can_messenger.ensure_send.side_effect = mock_sender.mock_ensure_send + mock_can_messenger.send.side_effect = mock_sender.mock_send + with pytest.raises(MotionFailedError): + await subject.run(can_messenger=mock_can_messenger) + assert mock_sender.call_count == 1 diff --git a/shared-data/errors/definitions/1/errors.json b/shared-data/errors/definitions/1/errors.json index 76467faa924f..07c9a489a254 100644 --- a/shared-data/errors/definitions/1/errors.json +++ b/shared-data/errors/definitions/1/errors.json @@ -118,6 +118,10 @@ "detail": "Gripper Pickup Failed", "category": "roboticsControlError" }, + "2016": { + "detail": "Motor Driver Error", + "category": "roboticsControlError" + }, "3000": { "detail": "A robotics interaction error occurred.", "category": "roboticsInteractionError" diff --git a/shared-data/python/opentrons_shared_data/errors/codes.py b/shared-data/python/opentrons_shared_data/errors/codes.py index 954ac72c9a1f..61013b57e8fd 100644 --- a/shared-data/python/opentrons_shared_data/errors/codes.py +++ b/shared-data/python/opentrons_shared_data/errors/codes.py @@ -59,6 +59,7 @@ class ErrorCodes(Enum): POSITION_UNKNOWN = _code_from_dict_entry("2013") EXECUTION_CANCELLED = _code_from_dict_entry("2014") FAILED_GRIPPER_PICKUP_ERROR = _code_from_dict_entry("2015") + MOTOR_DRIVER_ERROR = _code_from_dict_entry("2016") ROBOTICS_INTERACTION_ERROR = _code_from_dict_entry("3000") LABWARE_DROPPED = _code_from_dict_entry("3001") LABWARE_NOT_PICKED_UP = _code_from_dict_entry("3002") diff --git a/shared-data/python/opentrons_shared_data/errors/exceptions.py b/shared-data/python/opentrons_shared_data/errors/exceptions.py index 2d8a6f744875..779c33464e71 100644 --- a/shared-data/python/opentrons_shared_data/errors/exceptions.py +++ b/shared-data/python/opentrons_shared_data/errors/exceptions.py @@ -598,6 +598,19 @@ def __init__( super().__init__(ErrorCodes.EXECUTION_CANCELLED, message, detail, wrapping) +class MotorDriverError(RoboticsControlError): + """An error indicating that a motor driver is in error state.""" + + def __init__( + self, + message: Optional[str] = None, + detail: Optional[Dict[str, str]] = None, + wrapping: Optional[Sequence[EnumeratedError]] = None, + ) -> None: + """Build a MotorDriverError.""" + super().__init__(ErrorCodes.MOTOR_DRIVER_ERROR, message, detail, wrapping) + + class LabwareDroppedError(RoboticsInteractionError): """An error indicating that the gripper dropped labware it was holding.""" From 29414e2fd239c35df1dc13ce83de96432f221fc0 Mon Sep 17 00:00:00 2001 From: Caila Marashaj <98041399+caila-marashaj@users.noreply.github.com> Date: Mon, 25 Mar 2024 18:18:57 -0400 Subject: [PATCH 2/8] Revert "refactor(modules): return has update for unexpected module fw filename" (#14731) Reverts Opentrons/opentrons#14712 --- .../opentrons/hardware_control/modules/mod_abc.py | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/api/src/opentrons/hardware_control/modules/mod_abc.py b/api/src/opentrons/hardware_control/modules/mod_abc.py index 4355b77413dd..c6ea41437ebf 100644 --- a/api/src/opentrons/hardware_control/modules/mod_abc.py +++ b/api/src/opentrons/hardware_control/modules/mod_abc.py @@ -4,7 +4,7 @@ import re from pkg_resources import parse_version from typing import ClassVar, Mapping, Optional, cast, TypeVar -from packaging.version import InvalidVersion + from opentrons.config import IS_ROBOT, ROBOT_FIRMWARE_DIR from opentrons.drivers.rpi_drivers.types import USBPort @@ -88,15 +88,8 @@ def get_bundled_fw(self) -> Optional[BundledFirmware]: def has_available_update(self) -> bool: """Return whether a newer firmware file is available""" if self.device_info and self._bundled_fw: - # try catch this - try: - device_version = parse_version(self.device_info["version"]) - except InvalidVersion: - device_version = parse_version("v0.0.0") - try: - available_version = parse_version(self._bundled_fw.version) - except InvalidVersion: - available_version = parse_version("v0.0.0") + device_version = parse_version(self.device_info["version"]) + available_version = parse_version(self._bundled_fw.version) return cast(bool, available_version > device_version) return False From 244a80e5985cf608e7b89013e36bef2337f71619 Mon Sep 17 00:00:00 2001 From: Max Marrone Date: Mon, 25 Mar 2024 18:37:46 -0400 Subject: [PATCH 3/8] fix(robot-server): Update tests to properly check new bad run records (#14723) # Overview Follow-ups for https://github.com/Opentrons/opentrons/pull/14711#discussion_r1534599540. #14711 added safer error propagation for when robot-server encounters bad stored run data. As part of that, if it finds a run where the `state_summary` SQL column is `NULL`, it treats that as bad data and propagates the error to HTTP clients. When you restart the robot while there is an active run, then no state summary will be inserted (this only happens when the run is ended and the state moves from engine to sql) and the run will be bad. We say that this is in fact a bad run because to the client, there is no distinction between state summary and run. A run with an empty state summary does not have correct data and does not represent what occurred. Add a regression test to make sure this is how we handle runs that did not have state summaries persisted. # Testing - [x] create a run with this branch on a flex and restart the flex (or kill the robot server process - this isn't about the details of when things are written to disk, just the lifetime of the data here) and see that the run is now bad --------- Co-authored-by: Seth Foster --- robot-server/robot_server/runs/run_models.py | 2 +- .../persistence/test_compatibility.py | 192 +++++++++++------- .../http_api/runs/test_persistence.py | 49 ++++- 3 files changed, 157 insertions(+), 86 deletions(-) diff --git a/robot-server/robot_server/runs/run_models.py b/robot-server/robot_server/runs/run_models.py index 379feeaea0a7..e05cd25330cd 100644 --- a/robot-server/robot_server/runs/run_models.py +++ b/robot-server/robot_server/runs/run_models.py @@ -28,7 +28,7 @@ class RunDataError(ErrorDetails): """A model for an error loading a run.""" title: str = Field( - "Run Loading Error", + "Run Data Error", description="A short, human readable name for this type of error", ) id: Literal["RunDataError"] = "RunDataError" diff --git a/robot-server/tests/integration/http_api/persistence/test_compatibility.py b/robot-server/tests/integration/http_api/persistence/test_compatibility.py index 33aa5a6cfd9d..0e487585bed7 100644 --- a/robot-server/tests/integration/http_api/persistence/test_compatibility.py +++ b/robot-server/tests/integration/http_api/persistence/test_compatibility.py @@ -1,8 +1,10 @@ +from __future__ import annotations + from dataclasses import dataclass, field from pathlib import Path from shutil import copytree from tempfile import TemporaryDirectory -from typing import List +from typing import List, Literal, Union, TYPE_CHECKING import anyio import pytest @@ -12,6 +14,9 @@ from .persistence_snapshots_dir import PERSISTENCE_SNAPSHOTS_DIR +if TYPE_CHECKING: + from _pytest.mark import ParameterSet + # Allow plenty of time for database migrations, which can take a while in our CI runners. _STARTUP_TIMEOUT = 60 @@ -28,6 +33,14 @@ class Run: id: str expected_command_count: int + ok: Literal[True] = True + + +@dataclass +class BadRun: + id: str + expected_command_count: int + ok: Literal[False] = False @dataclass @@ -36,7 +49,7 @@ class Snapshot: version: str expected_protocol_count: int - expected_runs: List[Run] + expected_runs: List[Union[Run, BadRun]] protocols_with_no_analyses: List[str] = field(default_factory=list) def get_copy(self) -> Path: @@ -58,86 +71,103 @@ def get_copy(self) -> Path: ) -snapshots: List[(Snapshot)] = [ - Snapshot( - version="v6.0.1", - expected_protocol_count=4, - expected_runs=[ - Run("7bc1f20d-3925-4aa2-b200-82906112816f", 23), - Run("1b00190c-013f-463d-b371-5bf49b6ad61f", 16), - Run("8165be3f-382f-4b1f-97d7-f3c4ae613868", 65), - Run("467761f3-7339-4b8d-9007-4482500657da", 65), - Run("f7817fa9-bc80-45c0-afea-f7c4af30a663", 333), - ], +snapshots: List[ParameterSet] = [ + pytest.param( + Snapshot( + version="v6.0.1", + expected_protocol_count=4, + expected_runs=[ + Run("7bc1f20d-3925-4aa2-b200-82906112816f", 23), + Run("1b00190c-013f-463d-b371-5bf49b6ad61f", 16), + Run("8165be3f-382f-4b1f-97d7-f3c4ae613868", 65), + Run("467761f3-7339-4b8d-9007-4482500657da", 65), + Run("f7817fa9-bc80-45c0-afea-f7c4af30a663", 333), + ], + ), + id="v6.0.1", ), - Snapshot( - version="v6.1.0", - expected_protocol_count=2, - expected_runs=[ - Run("a4338d46-96af-4e23-877d-1d79227a0946", 147), - Run("efc7374f-2e64-45ea-83fe-bd7a55f2699e", 205), - ], + pytest.param( + Snapshot( + version="v6.1.0", + expected_protocol_count=2, + expected_runs=[ + Run("a4338d46-96af-4e23-877d-1d79227a0946", 147), + Run("efc7374f-2e64-45ea-83fe-bd7a55f2699e", 205), + ], + ), + id="v6.0.1", ), - Snapshot( - version="v6.2.0", - expected_protocol_count=2, - expected_runs=[ - Run("199b991d-db3c-49ff-9b4f-905118c10685", 125), - Run("25a66ec6-2137-4680-8a94-d53c0e2a7488", 87), - ], + pytest.param( + Snapshot( + version="v6.2.0", + expected_protocol_count=2, + expected_runs=[ + Run("199b991d-db3c-49ff-9b4f-905118c10685", 125), + Run("25a66ec6-2137-4680-8a94-d53c0e2a7488", 87), + ], + ), + id="v6.2.0", ), - Snapshot( - version="v6.2.0_large", - expected_protocol_count=17, - expected_runs=[ - Run("eeb17dc0-1878-432a-bf3f-33e7d3023b8d", 218), - Run("917cf0f8-8b79-47ab-a407-918c182eb6df", 125), - Run("7b87bac2-680a-4757-a10f-8341a6dce540", 185), - Run("0b97477c-844d-406a-87e8-0852421d7212", 0), - Run("f31659a6-33c9-406d-beb5-da2ec19ef063", 120), - Run("965b45f4-f296-44bf-ae20-df297d3a35af", 8), - Run("b97b0ee8-2ba4-43cd-99aa-601b60f5b75d", 13), - Run("7dd90a28-14b6-4e6f-86a8-41ca6e6e42ae", 11), - Run("dc9162c2-f9f6-48aa-a923-7ba252d3eb1d", 15), - Run("2d9b6f1b-e2fd-40a9-9219-504df2c89305", 0), - Run("9ba966c6-bc2f-4c65-b898-59a4f2530f35", 0), - Run("5f30a0dd-e4da-4f24-abce-7468067d883a", 0), - Run("83f0bad0-6bb2-4ecd-bccf-f14667298168", 0), - Run("0b97363d-0910-43a0-b5a2-b6a62ad2fa6b", 96), - Run("35c014ec-b6ea-4665-8149-5c6340cbc5ca", 0), - Run("d2b68ac6-5c4f-4914-bc2e-f306a976d582", 220), - ], - protocols_with_no_analyses=[ - "429e72e1-6ff1-4328-8a1d-c13fe3ac0c80", - "e3515d46-3c3b-425b-8734-bd6e38d6a729", - ], + pytest.param( + Snapshot( + version="v6.2.0_large", + expected_protocol_count=17, + expected_runs=[ + Run("eeb17dc0-1878-432a-bf3f-33e7d3023b8d", 218), + Run("917cf0f8-8b79-47ab-a407-918c182eb6df", 125), + Run("7b87bac2-680a-4757-a10f-8341a6dce540", 185), + BadRun("0b97477c-844d-406a-87e8-0852421d7212", 0), + Run("f31659a6-33c9-406d-beb5-da2ec19ef063", 120), + Run("965b45f4-f296-44bf-ae20-df297d3a35af", 8), + Run("b97b0ee8-2ba4-43cd-99aa-601b60f5b75d", 13), + Run("7dd90a28-14b6-4e6f-86a8-41ca6e6e42ae", 11), + Run("dc9162c2-f9f6-48aa-a923-7ba252d3eb1d", 15), + BadRun("2d9b6f1b-e2fd-40a9-9219-504df2c89305", 0), + # This is a run of a protocol with no commands + Run("9ba966c6-bc2f-4c65-b898-59a4f2530f35", 0), + BadRun("5f30a0dd-e4da-4f24-abce-7468067d883a", 0), + # Stopped early + Run("83f0bad0-6bb2-4ecd-bccf-f14667298168", 0), + Run("0b97363d-0910-43a0-b5a2-b6a62ad2fa6b", 96), + Run("35c014ec-b6ea-4665-8149-5c6340cbc5ca", 0), + Run("d2b68ac6-5c4f-4914-bc2e-f306a976d582", 220), + ], + protocols_with_no_analyses=[ + "429e72e1-6ff1-4328-8a1d-c13fe3ac0c80", + "e3515d46-3c3b-425b-8734-bd6e38d6a729", + ], + ), + id="v6.2.0_large", ), - flex_dev_compat_snapshot, - Snapshot( - version="v7.1.1", - expected_protocol_count=10, - expected_runs=[ - Run("69fe2d6f-3bda-4dfb-800b-cd93017d1cbd", 4634), - Run("04ec9eda-19b2-4850-9148-d28112565b37", 0), - Run("7edf736e-2b5c-41c0-be37-7ab7ac215445", 787), - Run("4f623a64-20ce-464b-a118-e8a785911613", 0), - Run("237fd93f-e4a5-4c37-9675-58a8a3c32bbb", 953), - Run("59706cac-74d5-4542-8b38-499d11ad352e", 54), - Run("ef7794a5-3afd-438d-a69e-34138d9ae520", 0), - Run("b0c6a8fa-f117-4f5f-b5f0-22c487d83526", 359), - Run("62011896-29f5-40b4-83ee-29d7b7817583", 0), - Run("790d551d-68f0-4513-8896-bc175f629546", 1541), - Run("92dafa40-3425-4a74-9d20-a3fc08365a92", 0), - Run("7622aed6-08bf-4339-accc-952dcad310ce", 205), - Run("b710a6c2-d373-4bc1-ad14-18f1094d7104", 0), - Run("0b593bb0-d2d8-4c21-afc5-44e4868aeeef", 1609), - Run("22d99b67-3062-48ed-80bd-4505def1bb7d", 0), - Run("519a45e1-f68a-454f-bac9-0910eaddbbac", 18), - Run("7367493c-40b1-4516-abf5-9c5b0228d27f", 679), - Run("4af7e324-2f2b-40bc-803c-e9100016d2b3", 1183), - Run("e164059b-57dc-4a68-a23b-b026a7addf2a", 1467), - Run("ae2e23fc-74fb-4b3f-9b8b-d632e31b222a", 0), - ], + pytest.param(flex_dev_compat_snapshot, id="flex_dev_compat"), + pytest.param( + Snapshot( + version="v7.1.1", + expected_protocol_count=10, + expected_runs=[ + Run("69fe2d6f-3bda-4dfb-800b-cd93017d1cbd", 4634), + BadRun("04ec9eda-19b2-4850-9148-d28112565b37", 0), + Run("7edf736e-2b5c-41c0-be37-7ab7ac215445", 787), + BadRun("4f623a64-20ce-464b-a118-e8a785911613", 0), + Run("237fd93f-e4a5-4c37-9675-58a8a3c32bbb", 953), + Run("59706cac-74d5-4542-8b38-499d11ad352e", 54), + BadRun("ef7794a5-3afd-438d-a69e-34138d9ae520", 0), + Run("b0c6a8fa-f117-4f5f-b5f0-22c487d83526", 359), + BadRun("62011896-29f5-40b4-83ee-29d7b7817583", 0), + Run("790d551d-68f0-4513-8896-bc175f629546", 1541), + BadRun("92dafa40-3425-4a74-9d20-a3fc08365a92", 0), + Run("7622aed6-08bf-4339-accc-952dcad310ce", 205), + BadRun("b710a6c2-d373-4bc1-ad14-18f1094d7104", 0), + Run("0b593bb0-d2d8-4c21-afc5-44e4868aeeef", 1609), + BadRun("22d99b67-3062-48ed-80bd-4505def1bb7d", 0), + Run("519a45e1-f68a-454f-bac9-0910eaddbbac", 18), + Run("7367493c-40b1-4516-abf5-9c5b0228d27f", 679), + Run("4af7e324-2f2b-40bc-803c-e9100016d2b3", 1183), + Run("e164059b-57dc-4a68-a23b-b026a7addf2a", 1467), + BadRun("ae2e23fc-74fb-4b3f-9b8b-d632e31b222a", 0), + ], + ), + id="v7.1.1", ), ] @@ -198,7 +228,11 @@ async def test_protocols_analyses_and_runs_available_from_older_persistence_dir( assert all_run_ids == [r.id for r in snapshot.expected_runs] for expected_run in snapshot.expected_runs: - await robot_client.get_run(run_id=expected_run.id) + run = (await robot_client.get_run(run_id=expected_run.id)).json() + if expected_run.ok: + assert run["data"].get("dataError") is None + else: + assert run["data"].get("dataError") is not None all_command_summaries = ( await robot_client.get_run_commands( diff --git a/robot-server/tests/integration/http_api/runs/test_persistence.py b/robot-server/tests/integration/http_api/runs/test_persistence.py index a8a46546108f..45b55202fdaa 100644 --- a/robot-server/tests/integration/http_api/runs/test_persistence.py +++ b/robot-server/tests/integration/http_api/runs/test_persistence.py @@ -1,5 +1,6 @@ -from typing import Any, AsyncGenerator, Dict, NamedTuple, cast +from copy import deepcopy from datetime import datetime +from typing import Any, AsyncGenerator, Dict, NamedTuple, cast import anyio import pytest @@ -73,7 +74,46 @@ async def _assert_run_persisted( assert get_persisted_run_response.json()["data"] == expected_run_data -async def test_runs_persist(client_and_server: ClientServerFixture) -> None: +async def test_untimely_restart_marks_runs_bad( + client_and_server: ClientServerFixture, +) -> None: + """Test that a run persists even if the server was restarted before the run was + gracefully closed out.""" + client, server = client_and_server + + # create a run + create_run_response = await client.post_run(req_body={"data": {}}) + run_id = create_run_response.json()["data"]["id"] + + run = (await client.get_run(run_id)).json()["data"] + assert run["status"] == "idle" + assert run["current"] is True + # Some loss of state is expected. + expected_run = deepcopy(run) + expected_run["status"] = "stopped" + expected_run["current"] = False + expected_run["ok"] = False + expected_run["dataError"] = { + "id": "RunDataError", + "title": "Run Data Error", + "detail": "There was no engine state data for this run.", + "meta": { + "code": "4008", + "detail": {}, + "message": "There was no engine state data for this run.", + "type": "InvalidStoredData", + "wrapping": [], + }, + "errorCode": "4008", + } + + # reboot the server + await client_and_server.restart() + + await _assert_run_persisted(robot_client=client, expected_run_data=expected_run) + + +async def test_runs_persist_via_patch(client_and_server: ClientServerFixture) -> None: """Test that runs are persisted through dev server restart.""" client, server = client_and_server @@ -100,10 +140,7 @@ async def test_runs_persist_via_actions_router( """Test that runs commands and state are persisted when calling play action through dev server restart.""" client, server = client_and_server - # await client.post_protocol([Path("./tests/integration/protocols/simple.py")]) - # - # protocols = (await client.get_protocols()).json()["data"] - # protocol_id = protocols[0]["id"] + # create a run create_run_response = await client.post_run(req_body={"data": {}}) run_id = create_run_response.json()["data"]["id"] From 03f1149499f120f408f079529b4917654164cfd8 Mon Sep 17 00:00:00 2001 From: koji Date: Tue, 26 Mar 2024 08:42:13 -0400 Subject: [PATCH 4/8] fix(app): fix chip storybook (#14733) fix(app): fix chip storybook --- app/src/atoms/Chip/Chip.stories.tsx | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/app/src/atoms/Chip/Chip.stories.tsx b/app/src/atoms/Chip/Chip.stories.tsx index 0bcd96abac0d..c36cf1876479 100644 --- a/app/src/atoms/Chip/Chip.stories.tsx +++ b/app/src/atoms/Chip/Chip.stories.tsx @@ -1,5 +1,5 @@ import * as React from 'react' -import { Flex, COLORS, SPACING } from '@opentrons/components' +import { Flex, COLORS, ICON_DATA_BY_NAME, SPACING } from '@opentrons/components' import { touchScreenViewport } from '../../DesignTokens/constants' import { Chip } from '.' import type { Story, Meta } from '@storybook/react' @@ -27,6 +27,13 @@ export default { }, defaultValue: 'medium', }, + iconName: { + options: Object.keys(ICON_DATA_BY_NAME), + control: { + type: 'select', + }, + defaultValue: 'ot-alert', + }, }, component: Chip, parameters: touchScreenViewport, From a7e33bc14400d1f570b0a69a09923f8b8991957b Mon Sep 17 00:00:00 2001 From: Jamey Huffnagle Date: Tue, 26 Mar 2024 09:54:21 -0400 Subject: [PATCH 5/8] fix(robot-server): ensure robot-server starts after mosquitto (#14729) Closes EXEC-351 --- robot-server/opentrons-robot-server.service | 2 ++ 1 file changed, 2 insertions(+) diff --git a/robot-server/opentrons-robot-server.service b/robot-server/opentrons-robot-server.service index 48648658cecc..dbdbdc68046c 100644 --- a/robot-server/opentrons-robot-server.service +++ b/robot-server/opentrons-robot-server.service @@ -7,6 +7,8 @@ After=nginx.service After=opentrons-status-leds.service +Wants=mosquitto.service +After=mosquitto.service [Service] From fa382262727279378b3eb0b9e533047ffa6aea87 Mon Sep 17 00:00:00 2001 From: Sarah Breen Date: Tue, 26 Mar 2024 11:08:46 -0400 Subject: [PATCH 6/8] fix(app): refactor Flex pipette card to reference /instruments (#14702) fix RQA-2433 --- app/src/molecules/InstrumentCard/index.tsx | 21 +- .../Devices/InstrumentsAndModules.tsx | 118 ++++--- .../PipetteCard/AboutPipetteSlideout.tsx | 24 +- .../Devices/PipetteCard/FlexPipetteCard.tsx | 281 +++++++++++++++++ .../PipetteCard/PipetteOverflowMenu.tsx | 27 +- .../__tests__/AboutPipetteSlideout.test.tsx | 26 +- .../__tests__/FlexPipetteCard.test.tsx | 256 +++++++++++++++ .../__tests__/PipetteCard.test.tsx | 147 +-------- .../__tests__/PipetteOverflowMenu.test.tsx | 72 ----- .../organisms/Devices/PipetteCard/index.tsx | 296 ++++-------------- .../__tests__/InstrumentsAndModules.test.tsx | 101 +++--- 11 files changed, 724 insertions(+), 645 deletions(-) create mode 100644 app/src/organisms/Devices/PipetteCard/FlexPipetteCard.tsx create mode 100644 app/src/organisms/Devices/PipetteCard/__tests__/FlexPipetteCard.test.tsx diff --git a/app/src/molecules/InstrumentCard/index.tsx b/app/src/molecules/InstrumentCard/index.tsx index 6445033b2838..b0f722b8c5a0 100644 --- a/app/src/molecules/InstrumentCard/index.tsx +++ b/app/src/molecules/InstrumentCard/index.tsx @@ -2,6 +2,7 @@ import * as React from 'react' import { ALIGN_FLEX_START, + ALIGN_CENTER, BORDERS, Box, COLORS, @@ -80,13 +81,19 @@ export function InstrumentCard(props: InstrumentCardProps): JSX.Element { ) : null} {instrumentDiagramProps?.pipetteSpecs != null ? ( - + + + ) : null} - - {isFlex && ( - + ) : ( + <> + + + )} {leftColumnModules.map((module, index) => ( - {!Boolean(is96ChannelAttached) && ( + {!isFlex ? ( - )} + ) : null} + {isFlex && !is96ChannelAttached ? ( + + ) : null} {rightColumnModules.map((module, index) => ( unknown isExpanded: boolean } @@ -27,14 +25,14 @@ interface AboutPipetteSlideoutProps { export const AboutPipetteSlideout = ( props: AboutPipetteSlideoutProps ): JSX.Element | null => { - const { pipetteId, pipetteName, isExpanded, mount, onCloseClick } = props + const { + pipetteId, + pipetteName, + isExpanded, + firmwareVersion, + onCloseClick, + } = props const { i18n, t } = useTranslation(['device_details', 'shared']) - const { data: attachedInstruments } = useInstrumentsQuery() - const instrumentInfo = - attachedInstruments?.data?.find( - (i): i is PipetteData => - i.instrumentType === 'pipette' && i.ok && i.mount === mount - ) ?? null return ( - {instrumentInfo?.firmwareVersion != null && ( + {firmwareVersion != null && ( <> - {instrumentInfo.firmwareVersion} + {firmwareVersion} )} diff --git a/app/src/organisms/Devices/PipetteCard/FlexPipetteCard.tsx b/app/src/organisms/Devices/PipetteCard/FlexPipetteCard.tsx new file mode 100644 index 000000000000..7dca3abc6401 --- /dev/null +++ b/app/src/organisms/Devices/PipetteCard/FlexPipetteCard.tsx @@ -0,0 +1,281 @@ +import * as React from 'react' +import { Trans, useTranslation } from 'react-i18next' +import { css } from 'styled-components' +import { SPACING, TYPOGRAPHY, StyledText } from '@opentrons/components' +import { + NINETY_SIX_CHANNEL, + SINGLE_MOUNT_PIPETTES, + FLEX_ROBOT_TYPE, + LEFT, +} from '@opentrons/shared-data' +import { + useCurrentSubsystemUpdateQuery, + useHost, +} from '@opentrons/react-api-client' +import { Banner } from '../../../atoms/Banner' +import { InstrumentCard } from '../../../molecules/InstrumentCard' +import { ChoosePipette } from '../../PipetteWizardFlows/ChoosePipette' +import { FLOWS } from '../../PipetteWizardFlows/constants' +import { handlePipetteWizardFlows } from '../../PipetteWizardFlows' +import { DropTipWizard } from '../../DropTipWizard' + +import { AboutPipetteSlideout } from './AboutPipetteSlideout' + +import type { + BadPipette, + HostConfig, + Mount, + PipetteData, +} from '@opentrons/api-client' +import type { PipetteModelSpecs } from '@opentrons/shared-data' +import type { + PipetteWizardFlow, + SelectablePipettes, +} from '../../PipetteWizardFlows/types' + +interface FlexPipetteCardProps { + attachedPipette: PipetteData | BadPipette | null + pipetteModelSpecs: PipetteModelSpecs | null + mount: Mount + isRunActive: boolean + isEstopNotDisengaged: boolean +} +const BANNER_LINK_CSS = css` + text-decoration: ${TYPOGRAPHY.textDecorationUnderline}; + cursor: pointer; + margin-left: ${SPACING.spacing8}; +` + +const INSTRUMENT_CARD_STYLE = css` + p { + text-transform: lowercase; + } + + p::first-letter { + text-transform: uppercase; + } +` + +const POLL_DURATION_MS = 5000 + +export function FlexPipetteCard({ + pipetteModelSpecs, + attachedPipette, + mount, + isRunActive, + isEstopNotDisengaged, +}: FlexPipetteCardProps): JSX.Element { + const { t, i18n } = useTranslation(['device_details', 'shared']) + const host = useHost() as HostConfig + + const [ + showAboutPipetteSlideout, + setShowAboutPipetteSlideout, + ] = React.useState(false) + const [showChoosePipette, setShowChoosePipette] = React.useState(false) + const [showDropTipWizard, setShowDropTipWizard] = React.useState(false) + const [ + selectedPipette, + setSelectedPipette, + ] = React.useState(SINGLE_MOUNT_PIPETTES) + const attachedPipetteIs96Channel = + attachedPipette?.ok && attachedPipette.instrumentName === 'p1000_96' + const selectedPipetteForWizard = attachedPipetteIs96Channel + ? NINETY_SIX_CHANNEL + : selectedPipette + const setCloseFlow = (): void => { + setSelectedPipette(SINGLE_MOUNT_PIPETTES) + } + + const handleLaunchPipetteWizardFlows = (flowType: PipetteWizardFlow): void => + handlePipetteWizardFlows({ + flowType, + mount, + closeFlow: setCloseFlow, + selectedPipette: selectedPipetteForWizard, + host, + }) + const handleChoosePipette: React.MouseEventHandler = () => { + setShowChoosePipette(true) + } + const handleAttach = (): void => { + setShowChoosePipette(false) + handleLaunchPipetteWizardFlows(FLOWS.ATTACH) + } + + const handleDetach: React.MouseEventHandler = () => { + handleLaunchPipetteWizardFlows(FLOWS.DETACH) + } + + const handleCalibrate: React.MouseEventHandler = () => { + handleLaunchPipetteWizardFlows(FLOWS.CALIBRATE) + } + const handleDropTip = (): void => { + setShowDropTipWizard(true) + } + + const [pollForSubsystemUpdate, setPollForSubsystemUpdate] = React.useState( + false + ) + const subsystem = attachedPipette?.subsystem ?? null + const { data: subsystemUpdateData } = useCurrentSubsystemUpdateQuery( + subsystem, + { + enabled: pollForSubsystemUpdate, + refetchInterval: POLL_DURATION_MS, + } + ) + const pipetteDisplayName = pipetteModelSpecs?.displayName + // we should poll for a subsystem update from the time a bad instrument is + // detected until the update has been done for 5 seconds + // this gives the instruments endpoint time to start reporting + // a good instrument + React.useEffect(() => { + if (attachedPipette?.ok === false) { + setPollForSubsystemUpdate(true) + } else if ( + subsystemUpdateData != null && + subsystemUpdateData.data.updateStatus === 'done' + ) { + setTimeout(() => { + setPollForSubsystemUpdate(false) + }, POLL_DURATION_MS) + } + }, [attachedPipette?.ok, subsystemUpdateData]) + + const menuOverlayItems = + attachedPipette == null || !attachedPipette.ok + ? [ + { + label: t('attach_pipette'), + disabled: attachedPipette != null || isRunActive, + onClick: handleChoosePipette, + }, + ] + : [ + { + label: + attachedPipette.data.calibratedOffset?.last_modified != null + ? t('recalibrate_pipette') + : t('calibrate_pipette'), + disabled: attachedPipette == null || isRunActive, + onClick: handleCalibrate, + }, + { + label: t('detach_pipette'), + disabled: attachedPipette == null || isRunActive, + onClick: handleDetach, + }, + { + label: t('about_pipette'), + disabled: attachedPipette == null, + onClick: () => setShowAboutPipetteSlideout(true), + }, + { + label: i18n.format(t('drop_tips'), 'capitalize'), + disabled: attachedPipette == null || isRunActive, + onClick: () => handleDropTip(), + }, + ] + return ( + <> + {(attachedPipette == null || attachedPipette.ok) && + subsystemUpdateData == null ? ( + + {isEstopNotDisengaged ? ( + + {t('calibration_needed_without_link')} + + ) : ( + + ), + }} + /> + )} + + ) : null + } + label={ + attachedPipetteIs96Channel + ? t('both_mounts') + : t('mount', { + side: mount === LEFT ? t('left') : t('right'), + }) + } + menuOverlayItems={menuOverlayItems} + isEstopNotDisengaged={isEstopNotDisengaged} + /> + ) : null} + {attachedPipette?.ok === false || + (subsystemUpdateData != null && pollForSubsystemUpdate) ? ( + + + + } + isEstopNotDisengaged={isEstopNotDisengaged} + /> + ) : null} + {showDropTipWizard && pipetteModelSpecs != null ? ( + setShowDropTipWizard(false)} + /> + ) : null} + {attachedPipette?.ok && showAboutPipetteSlideout ? ( + setShowAboutPipetteSlideout(false)} + /> + ) : null} + {showChoosePipette ? ( + setShowChoosePipette(false)} + mount={mount} + /> + ) : null} + + ) +} diff --git a/app/src/organisms/Devices/PipetteCard/PipetteOverflowMenu.tsx b/app/src/organisms/Devices/PipetteCard/PipetteOverflowMenu.tsx index 4319a18b44cc..8c21af89c5dc 100644 --- a/app/src/organisms/Devices/PipetteCard/PipetteOverflowMenu.tsx +++ b/app/src/organisms/Devices/PipetteCard/PipetteOverflowMenu.tsx @@ -10,11 +10,7 @@ import { SPACING, DIRECTION_COLUMN, } from '@opentrons/components' -import { - isFlexPipette, - PipetteModelSpecs, - PipetteName, -} from '@opentrons/shared-data' +import { PipetteModelSpecs } from '@opentrons/shared-data' import { MenuItem } from '../../../atoms/MenuList/MenuItem' import { Divider } from '../../../atoms/structure' @@ -28,10 +24,8 @@ interface PipetteOverflowMenuProps { mount: Mount handleChangePipette: () => void handleDropTip: () => void - handleCalibrate: () => void handleAboutSlideout: () => void handleSettingsSlideout: () => void - isPipetteCalibrated: boolean isRunActive: boolean } @@ -45,18 +39,13 @@ export const PipetteOverflowMenu = ( pipetteSettings, handleChangePipette, handleDropTip, - handleCalibrate, handleAboutSlideout, handleSettingsSlideout, - isPipetteCalibrated, isRunActive, } = props - const pipetteName = - pipetteSpecs?.name != null ? pipetteSpecs.name : t('empty') const pipetteDisplayName = pipetteSpecs?.displayName != null ? pipetteSpecs.displayName : t('empty') - const isFlexPipetteAttached = isFlexPipette(pipetteName as PipetteName) return ( @@ -80,18 +69,6 @@ export const PipetteOverflowMenu = ( ) : ( <> - {isFlexPipetteAttached ? ( - handleCalibrate()} - disabled={isRunActive} - > - {t( - isPipetteCalibrated - ? 'recalibrate_pipette' - : 'calibrate_pipette' - )} - - ) : null} handleChangePipette()} disabled={isRunActive} @@ -105,7 +82,7 @@ export const PipetteOverflowMenu = ( {i18n.format(t('drop_tips'), 'capitalize')} - {!isFlexPipetteAttached && pipetteSettings != null ? ( + {pipetteSettings != null ? ( handleSettingsSlideout()} diff --git a/app/src/organisms/Devices/PipetteCard/__tests__/AboutPipetteSlideout.test.tsx b/app/src/organisms/Devices/PipetteCard/__tests__/AboutPipetteSlideout.test.tsx index 1c1c8d8ee4b3..6417775d2e6f 100644 --- a/app/src/organisms/Devices/PipetteCard/__tests__/AboutPipetteSlideout.test.tsx +++ b/app/src/organisms/Devices/PipetteCard/__tests__/AboutPipetteSlideout.test.tsx @@ -2,12 +2,10 @@ import * as React from 'react' import { describe, it, vi, beforeEach, expect } from 'vitest' import '@testing-library/jest-dom/vitest' import { renderWithProviders } from '../../../../__testing-utils__' -import { useInstrumentsQuery } from '@opentrons/react-api-client' import { fireEvent, screen } from '@testing-library/react' import { i18n } from '../../../../i18n' import { AboutPipetteSlideout } from '../AboutPipetteSlideout' import { mockLeftSpecs } from '../../../../redux/pipettes/__fixtures__' -import { LEFT } from '../../../../redux/pipettes' vi.mock('@opentrons/react-api-client') @@ -23,13 +21,9 @@ describe('AboutPipetteSlideout', () => { props = { pipetteId: '123', pipetteName: mockLeftSpecs.displayName, - mount: LEFT, isExpanded: true, onCloseClick: vi.fn(), } - vi.mocked(useInstrumentsQuery).mockReturnValue({ - data: { data: [] }, - } as any) }) it('renders correct info', () => { @@ -43,19 +37,13 @@ describe('AboutPipetteSlideout', () => { expect(props.onCloseClick).toHaveBeenCalled() }) it('renders the firmware version if it exists', () => { - vi.mocked(useInstrumentsQuery).mockReturnValue({ - data: { - data: [ - { - instrumentType: 'pipette', - mount: LEFT, - ok: true, - firmwareVersion: 12, - } as any, - ], - }, - } as any) - + props = { + pipetteId: '123', + pipetteName: mockLeftSpecs.displayName, + isExpanded: true, + firmwareVersion: '12', + onCloseClick: vi.fn(), + } render(props) screen.getByText('CURRENT VERSION') diff --git a/app/src/organisms/Devices/PipetteCard/__tests__/FlexPipetteCard.test.tsx b/app/src/organisms/Devices/PipetteCard/__tests__/FlexPipetteCard.test.tsx new file mode 100644 index 000000000000..3ea5096ea0da --- /dev/null +++ b/app/src/organisms/Devices/PipetteCard/__tests__/FlexPipetteCard.test.tsx @@ -0,0 +1,256 @@ +import * as React from 'react' +import { fireEvent, screen } from '@testing-library/react' +import { describe, it, vi, beforeEach, afterEach, expect } from 'vitest' +import { renderWithProviders } from '../../../../__testing-utils__' +import { useCurrentSubsystemUpdateQuery } from '@opentrons/react-api-client' +import { i18n } from '../../../../i18n' +import { mockLeftSpecs } from '../../../../redux/pipettes/__fixtures__' +import { handlePipetteWizardFlows } from '../../../PipetteWizardFlows' +import { AboutPipetteSlideout } from '../AboutPipetteSlideout' +import { FlexPipetteCard } from '../FlexPipetteCard' +import { ChoosePipette } from '../../../PipetteWizardFlows/ChoosePipette' +import { DropTipWizard } from '../../../DropTipWizard' + +import type { PipetteData } from '@opentrons/api-client' + +vi.mock('../../../PipetteWizardFlows') +vi.mock('../../../PipetteWizardFlows/ChoosePipette') +vi.mock('../AboutPipetteSlideout') +vi.mock('../../../DropTipWizard') +vi.mock('@opentrons/react-api-client') + +const render = (props: React.ComponentProps) => { + return renderWithProviders(, { + i18nInstance: i18n, + })[0] +} + +describe('FlexPipetteCard', () => { + let props: React.ComponentProps + beforeEach(() => { + props = { + pipetteModelSpecs: mockLeftSpecs, + attachedPipette: { + instrumentType: 'pipette', + instrumentName: 'pipette', + subsystem: 'pipette_left', + mount: 'left', + instrumentModel: 'p50_single_v3.1', + serialNumber: '123', + firmwareVersion: '12', + ok: true, + data: { + channels: 1, + min_volume: 5, + max_volume: 50, + calibratedOffset: { + offset: { x: 1, y: 2, z: 3 }, + source: 'default', + last_modified: '12/2/4', + }, + }, + } as PipetteData, + mount: 'left', + isRunActive: false, + isEstopNotDisengaged: false, + } + vi.mocked(useCurrentSubsystemUpdateQuery).mockReturnValue({ + data: undefined, + } as any) + }) + afterEach(() => { + vi.resetAllMocks() + }) + + it('renders correct info when gripper is attached', () => { + render(props) + screen.getByText('left Mount') + screen.getByText('Left Pipette') + const overflowButton = screen.getByRole('button', { + name: /overflow/i, + }) + fireEvent.click(overflowButton) + screen.getByText('Recalibrate pipette') + screen.getByText('Detach pipette') + screen.getByText('Drop tips') + screen.getByText('About pipette') + }) + it('renders correct info when 96 channel is attached', () => { + props = { + pipetteModelSpecs: mockLeftSpecs, + attachedPipette: { + instrumentType: 'pipette', + instrumentName: 'p1000_96', + subsystem: 'pipette_left', + mount: 'left', + instrumentModel: 'p50_single_v3.1', + serialNumber: '123', + firmwareVersion: '12', + ok: true, + data: { + channels: 1, + min_volume: 5, + max_volume: 50, + calibratedOffset: { + offset: { x: 1, y: 2, z: 3 }, + source: 'default', + last_modified: '12/2/4', + }, + }, + } as PipetteData, + mount: 'left', + isRunActive: false, + isEstopNotDisengaged: false, + } + render(props) + screen.getByText('Both Mounts') + screen.getByText('Left Pipette') + }) + it('renders recalibrate banner when no calibration data is present', () => { + props = { + pipetteModelSpecs: mockLeftSpecs, + attachedPipette: { + instrumentType: 'pipette', + instrumentName: 'pipette', + subsystem: 'pipette_left', + mount: 'left', + instrumentModel: 'p50_single_v3.1', + serialNumber: '123', + firmwareVersion: '12', + ok: true, + data: { + channels: 1, + min_volume: 5, + max_volume: 50, + }, + } as PipetteData, + mount: 'left', + isRunActive: false, + isEstopNotDisengaged: false, + } + + render(props) + screen.getByText('Calibration needed.') + screen.getByText('Calibrate now') + }) + + it('renders recalibrate banner without calibrate now when no calibration data is present and e-stop is pressed', () => { + props = { + pipetteModelSpecs: mockLeftSpecs, + attachedPipette: { + instrumentType: 'pipette', + instrumentName: 'pipette', + subsystem: 'pipette_left', + mount: 'left', + instrumentModel: 'p50_single_v3.1', + serialNumber: '123', + firmwareVersion: '12', + ok: true, + data: { + channels: 1, + min_volume: 5, + max_volume: 50, + }, + } as PipetteData, + mount: 'left', + isRunActive: false, + isEstopNotDisengaged: true, + } + + render(props) + screen.getByText('Calibration needed.') + }) + + it('opens the about pipette slideout when button is pressed', () => { + render(props) + const overflowButton = screen.getByRole('button', { + name: /overflow/i, + }) + fireEvent.click(overflowButton) + const aboutPipetteButton = screen.getByText('About pipette') + fireEvent.click(aboutPipetteButton) + expect(vi.mocked(AboutPipetteSlideout)).toHaveBeenCalled() + }) + it('renders choose pipette modal when attach button is pressed', () => { + props = { + mount: 'left', + attachedPipette: null, + pipetteModelSpecs: null, + isRunActive: false, + isEstopNotDisengaged: false, + } + render(props) + const overflowButton = screen.getByRole('button', { + name: /overflow/i, + }) + fireEvent.click(overflowButton) + const attachPipetteButton = screen.getByText('Attach pipette') + fireEvent.click(attachPipetteButton) + expect(vi.mocked(ChoosePipette)).toHaveBeenCalled() + }) + it('renders wizard flow when recalibrate button is pressed', () => { + render(props) + const overflowButton = screen.getByRole('button', { + name: /overflow/i, + }) + fireEvent.click(overflowButton) + const recalibratePipetteButton = screen.getByText('Recalibrate pipette') + fireEvent.click(recalibratePipetteButton) + expect(vi.mocked(handlePipetteWizardFlows)).toHaveBeenCalled() + }) + it('renders wizard flow when detach button is pressed', () => { + render(props) + const overflowButton = screen.getByRole('button', { + name: /InstrumentCard_overflowMenu/i, + }) + fireEvent.click(overflowButton) + const dropTipButton = screen.getByText('Detach pipette') + fireEvent.click(dropTipButton) + expect(vi.mocked(handlePipetteWizardFlows)).toHaveBeenCalled() + }) + it('renders drop tip wizard when drop tip button is pressed', () => { + render(props) + const overflowButton = screen.getByRole('button', { + name: /InstrumentCard_overflowMenu/i, + }) + fireEvent.click(overflowButton) + const dropTipButton = screen.getByText('Drop tips') + fireEvent.click(dropTipButton) + expect(vi.mocked(DropTipWizard)).toHaveBeenCalled() + }) + it('renders firmware update needed state if pipette is bad', () => { + props = { + attachedPipette: { + ok: false, + } as any, + mount: 'left', + pipetteModelSpecs: null, + isRunActive: false, + isEstopNotDisengaged: false, + } + render(props) + screen.getByText('Left mount') + screen.getByText('Instrument attached') + screen.getByText( + `Instrument firmware update needed. Start the update on the robot's touchscreen.` + ) + }) + it('renders firmware update in progress state if gripper is bad and update in progress', () => { + vi.mocked(useCurrentSubsystemUpdateQuery).mockReturnValue({ + data: { data: { updateProgress: 50 } as any }, + } as any) + props = { + attachedPipette: { + ok: false, + } as any, + mount: 'left', + pipetteModelSpecs: null, + isRunActive: false, + isEstopNotDisengaged: false, + } + render(props) + screen.getByText('Left mount') + screen.getByText('Instrument attached') + screen.getByText('Firmware update in progress...') + }) +}) diff --git a/app/src/organisms/Devices/PipetteCard/__tests__/PipetteCard.test.tsx b/app/src/organisms/Devices/PipetteCard/__tests__/PipetteCard.test.tsx index 67cd500763e2..6793ae24622f 100644 --- a/app/src/organisms/Devices/PipetteCard/__tests__/PipetteCard.test.tsx +++ b/app/src/organisms/Devices/PipetteCard/__tests__/PipetteCard.test.tsx @@ -5,34 +5,22 @@ import { describe, it, vi, beforeEach, expect } from 'vitest' import '@testing-library/jest-dom/vitest' import { renderWithProviders } from '../../../../__testing-utils__' import { LEFT, RIGHT } from '@opentrons/shared-data' -import { - useCurrentSubsystemUpdateQuery, - usePipetteSettingsQuery, -} from '@opentrons/react-api-client' +import { usePipetteSettingsQuery } from '@opentrons/react-api-client' import { i18n } from '../../../../i18n' import { getHasCalibrationBlock } from '../../../../redux/config' import { useDispatchApiRequest } from '../../../../redux/robot-api' -import { AskForCalibrationBlockModal } from '../../../CalibrateTipLength' -import { useCalibratePipetteOffset } from '../../../CalibratePipetteOffset/useCalibratePipetteOffset' -import { useDeckCalibrationData, useIsFlex } from '../../hooks' import { PipetteOverflowMenu } from '../PipetteOverflowMenu' -import { AboutPipetteSlideout } from '../AboutPipetteSlideout' import { PipetteCard } from '..' import { mockLeftSpecs, mockRightSpecs, } from '../../../../redux/pipettes/__fixtures__' -import { mockDeckCalData } from '../../../../redux/calibration/__fixtures__' import type { DispatchApiRequestType } from '../../../../redux/robot-api' vi.mock('../PipetteOverflowMenu') vi.mock('../../../../redux/config') -vi.mock('../../../CalibratePipetteOffset/useCalibratePipetteOffset') -vi.mock('../../../CalibrateTipLength') -vi.mock('../../hooks') -vi.mock('../AboutPipetteSlideout') vi.mock('../../../../redux/robot-api') vi.mock('@opentrons/react-api-client') vi.mock('../../../../redux/pipettes') @@ -45,47 +33,27 @@ const render = (props: React.ComponentProps) => { const mockRobotName = 'mockRobotName' describe('PipetteCard', () => { - let startWizard: any let dispatchApiRequest: DispatchApiRequestType let props: React.ComponentProps beforeEach(() => { - startWizard = vi.fn() dispatchApiRequest = vi.fn() props = { pipetteModelSpecs: mockLeftSpecs, mount: LEFT, robotName: mockRobotName, pipetteId: 'id', - pipetteIs96Channel: false, - isPipetteCalibrated: false, - pipetteIsBad: false, isRunActive: false, isEstopNotDisengaged: false, } - when(useIsFlex).calledWith(mockRobotName).thenReturn(false) - vi.mocked(AboutPipetteSlideout).mockReturnValue( -
mock about slideout
- ) - when(useDeckCalibrationData).calledWith(mockRobotName).thenReturn({ - isDeckCalibrated: true, - deckCalibrationData: mockDeckCalData, - }) vi.mocked(PipetteOverflowMenu).mockReturnValue(
mock pipette overflow menu
) vi.mocked(getHasCalibrationBlock).mockReturnValue(null) - vi.mocked(useCalibratePipetteOffset).mockReturnValue([startWizard, null]) - vi.mocked(AskForCalibrationBlockModal).mockReturnValue( -
Mock AskForCalibrationBlockModal
- ) vi.mocked(useDispatchApiRequest).mockReturnValue([ dispatchApiRequest, ['id'], ]) - vi.mocked(useCurrentSubsystemUpdateQuery).mockReturnValue({ - data: undefined, - } as any) when(usePipetteSettingsQuery) .calledWith({ refetchInterval: 5000, enabled: true }) .thenReturn({} as any) @@ -97,9 +65,6 @@ describe('PipetteCard', () => { mount: LEFT, robotName: mockRobotName, pipetteId: 'id', - pipetteIs96Channel: false, - isPipetteCalibrated: false, - pipetteIsBad: false, isRunActive: false, isEstopNotDisengaged: false, } @@ -107,48 +72,6 @@ describe('PipetteCard', () => { screen.getByText('left Mount') screen.getByText('Left Pipette') }) - it('renders information for a 96 channel pipette with overflow menu button not disabled', () => { - props = { - pipetteModelSpecs: mockLeftSpecs, - mount: LEFT, - robotName: mockRobotName, - pipetteId: 'id', - pipetteIs96Channel: true, - isPipetteCalibrated: false, - pipetteIsBad: false, - isRunActive: false, - isEstopNotDisengaged: false, - } - render(props) - screen.getByText('Both Mounts') - const overflowButton = screen.getByRole('button', { - name: /overflow/i, - }) - fireEvent.click(overflowButton) - expect(overflowButton).not.toBeDisabled() - screen.getByText('mock pipette overflow menu') - }) - - it('renders information for a 96 channel pipette with overflow menu button disabled when e-stop is pressed', () => { - props = { - pipetteModelSpecs: mockLeftSpecs, - mount: LEFT, - robotName: mockRobotName, - pipetteId: 'id', - pipetteIs96Channel: true, - isPipetteCalibrated: false, - pipetteIsBad: false, - isRunActive: false, - isEstopNotDisengaged: true, - } - render(props) - screen.getByText('Both Mounts') - const overflowButton = screen.getByRole('button', { - name: /overflow/i, - }) - fireEvent.click(overflowButton) - expect(overflowButton).toBeDisabled() - }) it('renders information for a right pipette', () => { props = { @@ -156,9 +79,6 @@ describe('PipetteCard', () => { mount: RIGHT, robotName: mockRobotName, pipetteId: 'id', - pipetteIs96Channel: false, - isPipetteCalibrated: false, - pipetteIsBad: false, isRunActive: false, isEstopNotDisengaged: false, } @@ -171,9 +91,6 @@ describe('PipetteCard', () => { pipetteModelSpecs: null, mount: RIGHT, robotName: mockRobotName, - pipetteIs96Channel: false, - isPipetteCalibrated: false, - pipetteIsBad: false, isRunActive: false, isEstopNotDisengaged: false, } @@ -186,9 +103,6 @@ describe('PipetteCard', () => { pipetteModelSpecs: null, mount: LEFT, robotName: mockRobotName, - pipetteIs96Channel: false, - isPipetteCalibrated: false, - pipetteIsBad: false, isRunActive: false, isEstopNotDisengaged: false, } @@ -197,43 +111,21 @@ describe('PipetteCard', () => { screen.getByText('Empty') }) it('does not render banner to calibrate for ot2 pipette if not calibrated', () => { - when(useIsFlex).calledWith(mockRobotName).thenReturn(false) props = { pipetteModelSpecs: mockLeftSpecs, mount: LEFT, robotName: mockRobotName, - pipetteIs96Channel: false, - isPipetteCalibrated: false, - pipetteIsBad: false, isRunActive: false, isEstopNotDisengaged: false, } render(props) expect(screen.queryByText('Calibrate now')).toBeNull() }) - it('renders banner to calibrate for ot3 pipette if not calibrated', () => { - when(useIsFlex).calledWith(mockRobotName).thenReturn(true) - props = { - pipetteModelSpecs: { ...mockLeftSpecs, name: 'p300_single_flex' }, - mount: LEFT, - robotName: mockRobotName, - pipetteIs96Channel: false, - isPipetteCalibrated: false, - pipetteIsBad: false, - isRunActive: false, - isEstopNotDisengaged: false, - } - render(props) - screen.getByText('Calibrate now') - }) it('renders kebab icon, opens and closes overflow menu on click', () => { props = { pipetteModelSpecs: mockRightSpecs, mount: RIGHT, robotName: mockRobotName, - pipetteIs96Channel: false, - isPipetteCalibrated: false, - pipetteIsBad: false, isRunActive: false, isEstopNotDisengaged: false, } @@ -249,43 +141,6 @@ describe('PipetteCard', () => { fireEvent.click(overflowMenu) expect(screen.queryByText('mock pipette overflow menu')).toBeNull() }) - it('renders firmware update needed state if pipette is bad', () => { - props = { - pipetteModelSpecs: mockRightSpecs, - mount: RIGHT, - robotName: mockRobotName, - pipetteIs96Channel: false, - isPipetteCalibrated: false, - pipetteIsBad: true, - isRunActive: false, - isEstopNotDisengaged: false, - } - render(props) - screen.getByText('Right mount') - screen.getByText('Instrument attached') - screen.getByText( - `Instrument firmware update needed. Start the update on the robot's touchscreen.` - ) - }) - it('renders firmware update in progress state if pipette is bad and update in progress', () => { - vi.mocked(useCurrentSubsystemUpdateQuery).mockReturnValue({ - data: { data: { updateProgress: 50 } as any }, - } as any) - props = { - pipetteModelSpecs: mockRightSpecs, - mount: RIGHT, - robotName: mockRobotName, - pipetteIs96Channel: false, - isPipetteCalibrated: false, - pipetteIsBad: true, - isRunActive: false, - isEstopNotDisengaged: false, - } - render(props) - screen.getByText('Right mount') - screen.getByText('Instrument attached') - screen.getByText('Firmware update in progress...') - }) it('does not render a pipette settings slideout card if the pipette has no settings', () => { render(props) expect( diff --git a/app/src/organisms/Devices/PipetteCard/__tests__/PipetteOverflowMenu.test.tsx b/app/src/organisms/Devices/PipetteCard/__tests__/PipetteOverflowMenu.test.tsx index 9545df087fc8..c6f7fef1d5be 100644 --- a/app/src/organisms/Devices/PipetteCard/__tests__/PipetteOverflowMenu.test.tsx +++ b/app/src/organisms/Devices/PipetteCard/__tests__/PipetteOverflowMenu.test.tsx @@ -40,10 +40,8 @@ describe('PipetteOverflowMenu', () => { mount: LEFT, handleDropTip: vi.fn(), handleChangePipette: vi.fn(), - handleCalibrate: vi.fn(), handleAboutSlideout: vi.fn(), handleSettingsSlideout: vi.fn(), - isPipetteCalibrated: false, isRunActive: false, } }) @@ -73,52 +71,6 @@ describe('PipetteOverflowMenu', () => { fireEvent.click(btn) expect(props.handleChangePipette).toHaveBeenCalled() }) - it('renders recalibrate pipette text for Flex pipette', () => { - vi.mocked(isFlexPipette).mockReturnValue(true) - props = { - ...props, - isPipetteCalibrated: true, - } - render(props) - const recalibrate = screen.getByRole('button', { - name: 'Recalibrate pipette', - }) - fireEvent.click(recalibrate) - expect(props.handleCalibrate).toHaveBeenCalled() - }) - - it('should render recalibrate pipette text for Flex pipette', () => { - vi.mocked(isFlexPipette).mockReturnValue(true) - props = { - ...props, - isPipetteCalibrated: true, - } - render(props) - screen.getByRole('button', { - name: 'Recalibrate pipette', - }) - }) - - it('renders only the about pipette button if FLEX pipette is attached', () => { - vi.mocked(isFlexPipette).mockReturnValue(true) - - render(props) - - const calibrate = screen.getByRole('button', { - name: 'Calibrate pipette', - }) - const detach = screen.getByRole('button', { name: 'Detach pipette' }) - const settings = screen.queryByRole('button', { name: 'Pipette Settings' }) - const about = screen.getByRole('button', { name: 'About pipette' }) - - fireEvent.click(calibrate) - expect(props.handleCalibrate).toHaveBeenCalled() - fireEvent.click(detach) - expect(props.handleChangePipette).toHaveBeenCalled() - expect(settings).toBeNull() - fireEvent.click(about) - expect(props.handleAboutSlideout).toHaveBeenCalled() - }) it('does not render the pipette settings button if the pipette has no settings', () => { vi.mocked(isFlexPipette).mockReturnValue(false) @@ -132,30 +84,6 @@ describe('PipetteOverflowMenu', () => { expect(settings).not.toBeInTheDocument() }) - it('should disable certain menu items if a run is active for Flex pipette', () => { - vi.mocked(isFlexPipette).mockReturnValue(true) - props = { - ...props, - isRunActive: true, - } - render(props) - expect( - screen.getByRole('button', { - name: 'Calibrate pipette', - }) - ).toBeDisabled() - expect( - screen.getByRole('button', { - name: 'Detach pipette', - }) - ).toBeDisabled() - expect( - screen.getByRole('button', { - name: 'Drop tips', - }) - ).toBeDisabled() - }) - it('should disable certain menu items if a run is active for OT-2 pipette', () => { vi.mocked(isFlexPipette).mockReturnValue(false) props = { diff --git a/app/src/organisms/Devices/PipetteCard/index.tsx b/app/src/organisms/Devices/PipetteCard/index.tsx index 06099901a26d..0943f78311a7 100644 --- a/app/src/organisms/Devices/PipetteCard/index.tsx +++ b/app/src/organisms/Devices/PipetteCard/index.tsx @@ -1,6 +1,5 @@ import * as React from 'react' -import { Trans, useTranslation } from 'react-i18next' -import { css } from 'styled-components' +import { useTranslation } from 'react-i18next' import { ALIGN_CENTER, @@ -17,76 +16,39 @@ import { TYPOGRAPHY, useOnClickOutside, } from '@opentrons/components' -import { - FLEX_ROBOT_TYPE, - isFlexPipette, - NINETY_SIX_CHANNEL, - OT2_ROBOT_TYPE, - SINGLE_MOUNT_PIPETTES, -} from '@opentrons/shared-data' -import { - useCurrentSubsystemUpdateQuery, - usePipetteSettingsQuery, - useHost, -} from '@opentrons/react-api-client' +import { OT2_ROBOT_TYPE } from '@opentrons/shared-data' +import { usePipetteSettingsQuery } from '@opentrons/react-api-client' import { LEFT } from '../../../redux/pipettes' import { OverflowBtn } from '../../../atoms/MenuList/OverflowBtn' -import { Banner } from '../../../atoms/Banner' import { useMenuHandleClickOutside } from '../../../atoms/MenuList/hooks' -import { InstrumentCard } from '../../../molecules/InstrumentCard' import { ChangePipette } from '../../ChangePipette' -import { FLOWS } from '../../PipetteWizardFlows/constants' -import { handlePipetteWizardFlows } from '../../PipetteWizardFlows' -import { ChoosePipette } from '../../PipetteWizardFlows/ChoosePipette' -import { useIsFlex } from '../hooks' import { PipetteOverflowMenu } from './PipetteOverflowMenu' import { PipetteSettingsSlideout } from './PipetteSettingsSlideout' import { AboutPipetteSlideout } from './AboutPipetteSlideout' -import type { PipetteModelSpecs, PipetteName } from '@opentrons/shared-data' +import type { PipetteModelSpecs } from '@opentrons/shared-data' import type { AttachedPipette, Mount } from '../../../redux/pipettes/types' -import type { - PipetteWizardFlow, - SelectablePipettes, -} from '../../PipetteWizardFlows/types' import { DropTipWizard } from '../../DropTipWizard' -import { HostConfig } from '@opentrons/api-client' interface PipetteCardProps { pipetteModelSpecs: PipetteModelSpecs | null pipetteId?: AttachedPipette['id'] | null - isPipetteCalibrated: boolean mount: Mount robotName: string - pipetteIs96Channel: boolean - pipetteIsBad: boolean isRunActive: boolean isEstopNotDisengaged: boolean } -const INSTRUMENT_CARD_STYLE = css` - p { - text-transform: lowercase; - } - - p::first-letter { - text-transform: uppercase; - } -` - const POLL_DURATION_MS = 5000 export const PipetteCard = (props: PipetteCardProps): JSX.Element => { - const { t, i18n } = useTranslation(['device_details', 'protocol_setup']) + const { t } = useTranslation(['device_details', 'protocol_setup']) const { pipetteModelSpecs, - isPipetteCalibrated, mount, robotName, pipetteId, - pipetteIs96Channel, - pipetteIsBad, isRunActive, isEstopNotDisengaged, } = props @@ -96,10 +58,6 @@ export const PipetteCard = (props: PipetteCardProps): JSX.Element => { showOverflowMenu, setShowOverflowMenu, } = useMenuHandleClickOutside() - const isFlex = useIsFlex(robotName) - const host = useHost() as HostConfig - const pipetteName = pipetteModelSpecs?.name - const isFlexPipetteAttached = isFlexPipette(pipetteName as PipetteName) const pipetteDisplayName = pipetteModelSpecs?.displayName const pipetteOverflowWrapperRef = useOnClickOutside({ onClickOutside: () => setShowOverflowMenu(false), @@ -107,35 +65,7 @@ export const PipetteCard = (props: PipetteCardProps): JSX.Element => { const [showChangePipette, setChangePipette] = React.useState(false) const [showDropTipWizard, setShowDropTipWizard] = React.useState(false) const [showSlideout, setShowSlideout] = React.useState(false) - const [showAttachPipette, setShowAttachPipette] = React.useState(false) const [showAboutSlideout, setShowAboutSlideout] = React.useState(false) - const subsystem = mount === LEFT ? 'pipette_left' : 'pipette_right' - const [pollForSubsystemUpdate, setPollForSubsystemUpdate] = React.useState( - false - ) - const { data: subsystemUpdateData } = useCurrentSubsystemUpdateQuery( - subsystem, - { - enabled: pollForSubsystemUpdate, - refetchInterval: POLL_DURATION_MS, - } - ) - // we should poll for a subsystem update from the time a bad instrument is - // detected until the update has been done for 5 seconds - // this gives the instruments endpoint time to start reporting - // a good instrument - React.useEffect(() => { - if (pipetteIsBad && isFlex) { - setPollForSubsystemUpdate(true) - } else if ( - subsystemUpdateData != null && - subsystemUpdateData.data.updateStatus === 'done' - ) { - setTimeout(() => { - setPollForSubsystemUpdate(false) - }, POLL_DURATION_MS) - } - }, [pipetteIsBad, subsystemUpdateData, isFlex]) const settings = usePipetteSettingsQuery({ @@ -143,52 +73,18 @@ export const PipetteCard = (props: PipetteCardProps): JSX.Element => { enabled: pipetteId != null, })?.data?.[pipetteId ?? '']?.fields ?? null - const [ - selectedPipette, - setSelectedPipette, - ] = React.useState(SINGLE_MOUNT_PIPETTES) - const selectedPipetteForWizard = - pipetteName === 'p1000_96' ? NINETY_SIX_CHANNEL : selectedPipette - const handleChangePipette = (): void => { - if (isFlexPipetteAttached && isFlex) { - handleLaunchPipetteWizardFlows(FLOWS.DETACH) - } else if (!isFlexPipetteAttached && isFlex) { - setShowAttachPipette(true) - } else { - setChangePipette(true) - } + setChangePipette(true) } const handleDropTip = (): void => { setShowDropTipWizard(true) } - const handleCalibrate = (): void => { - if (isFlexPipetteAttached) { - handleLaunchPipetteWizardFlows(FLOWS.CALIBRATE) - } - } const handleAboutSlideout = (): void => { setShowAboutSlideout(true) } const handleSettingsSlideout = (): void => { setShowSlideout(true) } - const handleAttachPipette = (): void => { - setShowAttachPipette(false) - handleLaunchPipetteWizardFlows(FLOWS.ATTACH) - } - const setCloseFlow = (): void => { - setSelectedPipette(SINGLE_MOUNT_PIPETTES) - } - const handleLaunchPipetteWizardFlows = (flowType: PipetteWizardFlow): void => - handlePipetteWizardFlows({ - flowType, - mount, - closeFlow: setCloseFlow, - selectedPipette: selectedPipetteForWizard, - host, - }) - return ( { width="100%" data-testid={`PipetteCard_${String(pipetteDisplayName)}`} > - {showAttachPipette ? ( - setShowAttachPipette(false)} - mount={mount} - /> - ) : null} {showChangePipette && ( { )} {showDropTipWizard && pipetteModelSpecs != null ? ( setShowDropTipWizard(false)} @@ -237,127 +124,66 @@ export const PipetteCard = (props: PipetteCardProps): JSX.Element => { setShowAboutSlideout(false)} isExpanded={true} /> )} - {!pipetteIsBad && subsystemUpdateData == null && ( - <> - - - {pipetteModelSpecs !== null ? ( - - - - ) : null} - - {isFlexPipetteAttached && !isPipetteCalibrated ? ( - - {isEstopNotDisengaged ? ( - - {t('calibration_needed_without_link')} - - ) : ( - - ), - }} - /> - )} - - ) : null} - - {pipetteIs96Channel - ? t('both_mounts') - : t('mount', { - side: mount === LEFT ? t('left') : t('right'), - })} + <> + + + {pipetteModelSpecs !== null ? ( + + + + ) : null} + + + {t('mount', { + side: mount === LEFT ? t('left') : t('right'), + })} + + + + {pipetteDisplayName ?? t('empty')} - - - {pipetteDisplayName ?? t('empty')} - - - - - - - - )} - {(pipetteIsBad || - (subsystemUpdateData != null && pollForSubsystemUpdate)) && ( - - - - } - isEstopNotDisengaged={isEstopNotDisengaged} - /> - )} + + + + + + {showOverflowMenu && ( <> { handleDropTip={handleDropTip} handleSettingsSlideout={handleSettingsSlideout} handleAboutSlideout={handleAboutSlideout} - handleCalibrate={handleCalibrate} - isPipetteCalibrated={isPipetteCalibrated} pipetteSettings={settings} isRunActive={isRunActive} /> diff --git a/app/src/organisms/Devices/__tests__/InstrumentsAndModules.test.tsx b/app/src/organisms/Devices/__tests__/InstrumentsAndModules.test.tsx index 400d89e2ec08..4c2774ea2bd5 100644 --- a/app/src/organisms/Devices/__tests__/InstrumentsAndModules.test.tsx +++ b/app/src/organisms/Devices/__tests__/InstrumentsAndModules.test.tsx @@ -1,16 +1,14 @@ import * as React from 'react' import { when } from 'vitest-when' import { screen } from '@testing-library/react' -import { describe, it, vi, beforeEach, expect } from 'vitest' +import { describe, it, vi, beforeEach, afterEach, expect } from 'vitest' import '@testing-library/jest-dom/vitest' import { renderWithProviders } from '../../../__testing-utils__' import { - useAllPipetteOffsetCalibrationsQuery, useModulesQuery, useInstrumentsQuery, usePipettesQuery, } from '@opentrons/react-api-client' -import { instrumentsResponseFixture } from '@opentrons/api-client' import { i18n } from '../../../i18n' import { Banner } from '../../../atoms/Banner' @@ -21,16 +19,12 @@ import { ModuleCard } from '../../ModuleCard' import { InstrumentsAndModules } from '../InstrumentsAndModules' import { GripperCard } from '../../GripperCard' import { PipetteCard } from '../PipetteCard' +import { FlexPipetteCard } from '../PipetteCard/FlexPipetteCard' import { PipetteRecalibrationWarning } from '../PipetteCard/PipetteRecalibrationWarning' import { getIs96ChannelPipetteAttached, getShowPipetteCalibrationWarning, - getOffsetCalibrationForMount, } from '../utils' -import { - mockPipetteOffsetCalibration1, - mockPipetteOffsetCalibration2, -} from '../../../redux/calibration/pipette-offset/__fixtures__' import { useIsEstopNotDisengaged } from '../../../resources/devices/hooks/useIsEstopNotDisengaged' import type * as Components from '@opentrons/components' @@ -46,6 +40,7 @@ vi.mock('../hooks') vi.mock('../../GripperCard') vi.mock('../../ModuleCard') vi.mock('../PipetteCard') +vi.mock('../PipetteCard/FlexPipetteCard') vi.mock('../PipetteCard/PipetteRecalibrationWarning') vi.mock('../../ProtocolUpload/hooks') vi.mock('../../../atoms/Banner') @@ -72,18 +67,15 @@ describe('InstrumentsAndModules', () => { }) vi.mocked(getIs96ChannelPipetteAttached).mockReturnValue(false) vi.mocked(getShowPipetteCalibrationWarning).mockReturnValue(false) - vi.mocked(getOffsetCalibrationForMount).mockReturnValue(null) vi.mocked(useInstrumentsQuery).mockReturnValue({ data: { data: [] }, } as any) - vi.mocked(PipetteCard).mockReturnValue(
Mock PipetteCard
) - vi.mocked(GripperCard).mockReturnValue(
Mock GripperCard
) - vi.mocked(ModuleCard).mockReturnValue(
Mock ModuleCard
) when(useIsFlex).calledWith(ROBOT_NAME).thenReturn(false) when(useIsEstopNotDisengaged).calledWith(ROBOT_NAME).thenReturn(false) - vi.mocked(PipetteRecalibrationWarning).mockReturnValue( -
Mock PipetteRecalibrationWarning
- ) + }) + + afterEach(() => { + vi.resetAllMocks() }) it('renders an empty state message when robot is not on the network', () => { @@ -107,10 +99,9 @@ describe('InstrumentsAndModules', () => { }, } as any) render() - - screen.getByText('Mock ModuleCard') + expect(vi.mocked(ModuleCard)).toHaveBeenCalled() }) - it('renders pipette cards when a robot is viewable', () => { + it('renders pipette cards when a ot2 robot is viewable', () => { vi.mocked(useIsRobotViewable).mockReturnValue(true) vi.mocked(useModulesQuery).mockReturnValue({ data: { data: [mockMagneticModule] }, @@ -122,78 +113,56 @@ describe('InstrumentsAndModules', () => { }, } as any) render() - screen.getAllByText('Mock PipetteCard') + expect(vi.mocked(PipetteCard)).toHaveBeenCalledTimes(2) }) - it('renders gripper cards when a robot is Flex', () => { + it('renders gripper and flex pipette cards when a robot is Flex', () => { when(useIsFlex).calledWith(ROBOT_NAME).thenReturn(true) vi.mocked(useIsRobotViewable).mockReturnValue(true) - vi.mocked(useModulesQuery).mockReturnValue({ data: { data: [] } } as any) - vi.mocked(usePipettesQuery).mockReturnValue({ - data: { left: null, right: null }, - } as any) - vi.mocked(useInstrumentsQuery).mockReturnValue({ - data: { data: [instrumentsResponseFixture.data[0]] }, - } as any) render() - screen.getByText('Mock GripperCard') + expect(vi.mocked(GripperCard)).toHaveBeenCalled() + expect(vi.mocked(FlexPipetteCard)).toHaveBeenCalledTimes(2) }) it('renders the protocol loaded banner when protocol is loaded and not terminal state', () => { vi.mocked(useCurrentRunId).mockReturnValue('RUNID') - vi.mocked(Banner).mockReturnValue(
mock Banner
) render() - - screen.getByText('mock Banner') + expect(vi.mocked(Banner)).toHaveBeenCalled() }) it('renders 1 pipette card when a 96 channel is attached', () => { + when(useIsFlex).calledWith(ROBOT_NAME).thenReturn(true) vi.mocked(getIs96ChannelPipetteAttached).mockReturnValue(true) vi.mocked(useIsRobotViewable).mockReturnValue(true) render() - screen.getByText('Mock PipetteCard') + expect(vi.mocked(FlexPipetteCard)).toHaveBeenCalledTimes(1) }) it('renders pipette recalibration recommendation banner when offsets fail reasonability checks', () => { vi.mocked(getShowPipetteCalibrationWarning).mockReturnValue(true) vi.mocked(useIsRobotViewable).mockReturnValue(true) render() - screen.getByText('Mock PipetteRecalibrationWarning') + expect(vi.mocked(PipetteRecalibrationWarning)).toHaveBeenCalled() }) - it('fetches offset calibrations on long poll and pipettes, instruments, and modules on short poll', () => { - const { pipette: pipette1 } = mockPipetteOffsetCalibration1 - const { pipette: pipette2 } = mockPipetteOffsetCalibration2 - - vi.mocked(usePipettesQuery).mockReturnValue({ - data: { - left: { - id: pipette1, - name: `test-${pipette1}`, - model: 'p10_single_v1', - tip_length: 0, - mount_axis: 'z', - plunger_axis: 'b', - }, - right: { - id: pipette2, - name: `test-${pipette2}`, - model: 'p10_single_v1', - tip_length: 0, - mount_axis: 'y', - plunger_axis: 'a', - }, - }, - } as any) - vi.mocked(useAllPipetteOffsetCalibrationsQuery).mockReturnValue({ - data: { - data: [mockPipetteOffsetCalibration1, mockPipetteOffsetCalibration2], - }, - } as any) + it('fetches pipette and modules on short poll for ot2', () => { render() - expect(useAllPipetteOffsetCalibrationsQuery).toHaveBeenCalledWith({ - refetchInterval: 30000, - enabled: true, + expect(usePipettesQuery).toHaveBeenCalledWith( + {}, + { refetchInterval: 5000, enabled: true } + ) + expect(useModulesQuery).toHaveBeenCalledWith({ refetchInterval: 5000 }) + expect(useInstrumentsQuery).toHaveBeenCalledWith({ + refetchInterval: 5000, + enabled: false, }) - expect(usePipettesQuery).toHaveBeenCalledWith({}, { refetchInterval: 5000 }) + }) + it('fetches instruments and modules on short poll for flex', () => { + when(useIsFlex).calledWith(ROBOT_NAME).thenReturn(true) + render() + expect(usePipettesQuery).toHaveBeenCalledWith( + {}, + { refetchInterval: 5000, enabled: false } + ) expect(useModulesQuery).toHaveBeenCalledWith({ refetchInterval: 5000 }) expect(useInstrumentsQuery).toHaveBeenCalledWith({ refetchInterval: 5000, + enabled: true, }) }) }) From f583aeaffc29ea29894a307e05fd5d46339695f7 Mon Sep 17 00:00:00 2001 From: Jethary Rader <66035149+jerader@users.noreply.github.com> Date: Tue, 26 Mar 2024 12:14:41 -0400 Subject: [PATCH 7/8] feat(protocol-designer, step-generation, shared-data): migrate to using pipette v2 schema (#14713) closes AUTH-52, AUTH-231 --- .../src/instrument/InstrumentDiagram.tsx | 4 +- .../protocol/8/doItAllV7MigratedToV8.json | 330 +- .../fixtures/protocol/8/doItAllV8.json | 2770 +-- .../components/BatchEditForm/BatchEditMix.tsx | 2 + .../BatchEditForm/BatchEditMoveLiquid.tsx | 1 + .../fields/FlowRateField/index.tsx | 20 +- .../WellSelectionField/WellSelectionModal.tsx | 4 +- .../components/StepEditForm/forms/MixForm.tsx | 2 + .../forms/MoveLiquidForm/SourceDestFields.tsx | 2 + .../CreateFileWizard/ModulesAndOtherTile.tsx | 6 +- .../CreateFileWizard/PipetteTipsTile.tsx | 9 +- .../CreateFileWizard/PipetteTypeTile.tsx | 6 +- .../__tests__/CreateFileWizard.test.tsx | 2 +- .../__tests__/PipetteTipsTile.test.tsx | 16 +- .../FilePipettesModal/PipetteDiagram.tsx | 7 +- .../modals/FilePipettesModal/index.tsx | 6 +- .../src/components/modals/utils.ts | 8 +- .../components/modules/EditModulesCard.tsx | 6 +- .../__fixtures__/createFile/commonFields.ts | 9 +- .../file-data/__tests__/createFile.test.ts | 10 +- .../src/load-file/migration/1_1_0.ts | 20 +- protocol-designer/src/pipettes/pipetteData.ts | 31 +- .../src/step-forms/selectors/index.ts | 4 +- .../test/createPresavedStepForm.test.ts | 4 +- .../src/step-forms/utils/index.ts | 4 +- .../dependentFieldsUpdateMoveLiquid.ts | 33 +- .../handleFormChange/test/moveLiquid.test.ts | 14 +- .../handleFormChange/test/utils.test.ts | 8 +- .../formLevel/stepFormToArgs/mixFormToArgs.ts | 19 +- .../stepFormToArgs/moveLiquidFormToArgs.ts | 15 +- .../stepFormToArgs/test/mixFormToArgs.test.ts | 19 +- .../test/moveLiquidFormToArgs.test.ts | 19 +- .../steplist/formLevel/test/errors.test.ts | 8 +- .../src/ui/steps/actions/actions.ts | 2 +- protocol-designer/src/utils/index.ts | 38 + .../js/helpers/__tests__/wellSets.test.ts | 17 +- shared-data/js/helpers/wellSets.ts | 6 +- shared-data/js/pipettes.ts | 5 + shared-data/js/types.ts | 63 +- shared-data/pipette/fixtures/index.ts | 58 + .../fixtureGeneration.test.ts.snap | 19409 +++------------- .../src/__tests__/aspirate.test.ts | 4 +- .../src/__tests__/dispense.test.ts | 4 +- .../__tests__/heaterShakerOpenLatch.test.ts | 4 +- .../src/__tests__/moveToWell.test.ts | 4 +- step-generation/src/__tests__/utils.test.ts | 22 +- .../src/commandCreators/atomic/aspirate.ts | 8 +- .../src/commandCreators/compound/transfer.ts | 6 +- .../src/fixtures/robotStateFixtures.ts | 26 +- step-generation/src/robotStateSelectors.ts | 2 +- step-generation/src/types.ts | 4 +- .../src/utils/heaterShakerCollision.ts | 6 +- 52 files changed, 4951 insertions(+), 18155 deletions(-) create mode 100644 shared-data/pipette/fixtures/index.ts diff --git a/components/src/instrument/InstrumentDiagram.tsx b/components/src/instrument/InstrumentDiagram.tsx index edc492d94917..1ed6344d3083 100644 --- a/components/src/instrument/InstrumentDiagram.tsx +++ b/components/src/instrument/InstrumentDiagram.tsx @@ -10,13 +10,13 @@ import singleFlexSrc from './single-channel-flex.png' import eightChannelFlexSrc from './eight-channel-flex.png' import ninetySixSrc from './ninety-six-channel-gen1.png' -import type { PipetteNameSpecs } from '@opentrons/shared-data' +import type { PipetteV2Specs } from '@opentrons/shared-data' import type { Mount } from '../robot-types' import type { StyleProps } from '..' export interface InstrumentDiagramProps extends StyleProps { mount: Mount - pipetteSpecs?: Pick | null + pipetteSpecs?: Pick | null className?: string imageStyle?: FlattenSimpleInterpolation } diff --git a/protocol-designer/fixtures/protocol/8/doItAllV7MigratedToV8.json b/protocol-designer/fixtures/protocol/8/doItAllV7MigratedToV8.json index 83cb3016a54c..48f284c85af9 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": 1702420809427, + "lastModified": 1711047167434, "category": null, "subcategory": null, "tags": [] }, "designerApplication": { "name": "opentrons/protocol-designer", - "version": "8.0.0", + "version": "8.0.2", "data": { - "_internalAppBuildDate": "Tue, 12 Dec 2023 22:33:57 GMT", + "_internalAppBuildDate": "Thu, 21 Mar 2024 18:51:59 GMT", "defaultValues": { "aspirate_mmFromBottom": 1, "dispense_mmFromBottom": 0.5, @@ -188,11 +188,11 @@ "dispense_delay_seconds": "1", "dispense_delay_mmFromBottom": null, "dropTip_location": "4824b094-5999-4549-9e6b-7098a9b30a8b:trashBin", + "nozzles": null, "id": "f9a294f1-f42b-4cae-893a-592405349d56", "stepType": "moveLiquid", "stepName": "transfer", - "stepDetails": "", - "nozzles": null + "stepDetails": "" }, "5fdb9a12-fab4-42fd-886f-40af107b15d6": { "times": "2", @@ -215,11 +215,11 @@ "mix_touchTip_checkbox": false, "mix_touchTip_mmFromBottom": null, "dropTip_location": "4824b094-5999-4549-9e6b-7098a9b30a8b:trashBin", + "nozzles": null, "id": "5fdb9a12-fab4-42fd-886f-40af107b15d6", "stepType": "mix", "stepName": "mix", - "stepDetails": "", - "nozzles": null + "stepDetails": "" }, "3901f6f9-cecd-4d2a-8d85-40d85f9f8b4f": { "labware": "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", @@ -3747,7 +3747,7 @@ "commandSchemaId": "opentronsCommandSchemaV8", "commands": [ { - "key": "67a85572-e7b6-4b39-9370-424aa3a8919b", + "key": "6e489e69-6adb-4874-ad9f-4da035825829", "commandType": "loadPipette", "params": { "pipetteName": "p1000_single_flex", @@ -3756,7 +3756,7 @@ } }, { - "key": "9eaf88dc-37f8-4ab5-bd99-59fb5602e5f7", + "key": "7536b20c-1416-4e5a-9e0a-2ac13f805fcd", "commandType": "loadPipette", "params": { "pipetteName": "p50_multi_flex", @@ -3765,7 +3765,7 @@ } }, { - "key": "5fd85f47-9d69-4dda-abc3-828314b342f5", + "key": "67136a9e-c10f-40ce-80de-920e33d78d44", "commandType": "loadModule", "params": { "model": "magneticBlockV1", @@ -3774,7 +3774,7 @@ } }, { - "key": "b96e97b5-55cd-4531-9d0b-1ed3b3b7994d", + "key": "469e8246-7e19-4654-acdd-7c29a79ce67b", "commandType": "loadModule", "params": { "model": "heaterShakerModuleV1", @@ -3783,7 +3783,7 @@ } }, { - "key": "052aa59d-ac12-4ae6-b546-5072025b4a98", + "key": "29533de7-bd35-458c-9f60-6b9be67bd64b", "commandType": "loadModule", "params": { "model": "temperatureModuleV2", @@ -3792,7 +3792,7 @@ } }, { - "key": "d3b2158d-120b-438b-b8ed-49750ff8c20e", + "key": "85e3ebf2-4d2f-49e2-8335-cf8c69d58372", "commandType": "loadModule", "params": { "model": "thermocyclerModuleV2", @@ -3801,7 +3801,7 @@ } }, { - "key": "e7229332-1fdf-4221-8a79-3adfbe9dbe6e", + "key": "d05c0cc2-d6c2-4fd3-9918-33f7d07bd2fd", "commandType": "loadLabware", "params": { "displayName": "Opentrons 96 Flat Bottom Heater-Shaker Adapter", @@ -3815,7 +3815,7 @@ } }, { - "key": "a84c66f6-0d0f-42cc-81a8-790fbcfc1da2", + "key": "7b515b7c-9d35-4d4e-a19c-1a73de8fdc65", "commandType": "loadLabware", "params": { "displayName": "Opentrons Flex 96 Filter Tip Rack 50 µL", @@ -3827,7 +3827,7 @@ } }, { - "key": "d1c3cb44-5de1-43c4-b9e1-5fbc5e36afa8", + "key": "583e9796-64e7-411e-b3e4-ce3c5f18a39a", "commandType": "loadLabware", "params": { "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", @@ -3841,7 +3841,7 @@ } }, { - "key": "87f04b51-65b5-4dbf-a392-6920b6557deb", + "key": "bb089d2b-b8f8-4306-b0b8-e5d38d81aba6", "commandType": "loadLabware", "params": { "displayName": "Opentrons 24 Well Aluminum Block with NEST 1.5 mL Snapcap", @@ -3855,7 +3855,7 @@ } }, { - "key": "4aa72314-df40-4280-8ec4-8b1c008d5f80", + "key": "aa80f4db-d94f-407c-9ea1-6df86119d200", "commandType": "loadLabware", "params": { "displayName": "NEST 96 Well Plate 200 µL Flat", @@ -3870,7 +3870,7 @@ }, { "commandType": "loadLiquid", - "key": "f75fad88-17e3-4d6d-870d-deee51458d09", + "key": "52dfe64f-29b5-4d3e-838d-aecf6c0df8e0", "params": { "liquidId": "1", "labwareId": "a793a135-06aa-4ed6-a1d3-c176c7810afa:opentrons/opentrons_24_aluminumblock_nest_1.5ml_snapcap/1", @@ -3879,7 +3879,7 @@ }, { "commandType": "loadLiquid", - "key": "a322cfd6-567f-49f4-bba8-e14d91178fc3", + "key": "68e4b018-1e5b-48d4-b858-93b3154e63a5", "params": { "liquidId": "0", "labwareId": "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", @@ -3897,7 +3897,7 @@ }, { "commandType": "temperatureModule/setTargetTemperature", - "key": "268aa4aa-b749-45f8-b3ce-db07cb3004d6", + "key": "18dcba87-324d-4483-a9be-e561c9b47bf0", "params": { "moduleId": "ef44ad7f-0fd9-46d6-8bc0-c70785644cc8:temperatureModuleType", "celsius": 4 @@ -3905,7 +3905,7 @@ }, { "commandType": "heaterShaker/waitForTemperature", - "key": "9878763f-f904-4ed6-bd15-78e1f7290c17", + "key": "84ae2f28-38f6-4314-9d34-3ff9af5a875c", "params": { "moduleId": "c19dffa3-cb34-4702-bcf6-dcea786257d1:heaterShakerModuleType", "celsius": 4 @@ -3913,14 +3913,14 @@ }, { "commandType": "thermocycler/closeLid", - "key": "b610b2ca-6205-47ef-bd4e-2ff825131989", + "key": "0ec55f7b-4f82-46ad-a450-aac71d8ca198", "params": { "moduleId": "627b7a27-5bb7-46de-a530-67af45652e3b:thermocyclerModuleType" } }, { "commandType": "thermocycler/setTargetLidTemperature", - "key": "7f037ad4-40ae-4c79-9730-d369de6f683f", + "key": "883d4fba-7b4c-410d-aeff-79ce4c3d106e", "params": { "moduleId": "627b7a27-5bb7-46de-a530-67af45652e3b:thermocyclerModuleType", "celsius": 40 @@ -3928,14 +3928,14 @@ }, { "commandType": "thermocycler/waitForLidTemperature", - "key": "520c5311-725e-4428-b8a5-2b0c7219fdb7", + "key": "8da2d0c4-c9b2-4acb-8230-6b68f33b92b7", "params": { "moduleId": "627b7a27-5bb7-46de-a530-67af45652e3b:thermocyclerModuleType" } }, { "commandType": "thermocycler/runProfile", - "key": "4d5131a9-5895-4c30-b840-5d2a1a40942a", + "key": "6df23192-439c-429c-89ab-c932751096f0", "params": { "moduleId": "627b7a27-5bb7-46de-a530-67af45652e3b:thermocyclerModuleType", "profile": [ @@ -3947,28 +3947,28 @@ }, { "commandType": "thermocycler/deactivateBlock", - "key": "63d5155b-c8df-4502-8beb-babbf941ba1b", + "key": "c99151db-add8-41e4-9e5b-0516198f06b4", "params": { "moduleId": "627b7a27-5bb7-46de-a530-67af45652e3b:thermocyclerModuleType" } }, { "commandType": "thermocycler/deactivateLid", - "key": "11f57871-52ae-4025-a00e-bc5bd03a738b", + "key": "2cf60177-6b03-4706-a2fb-7a211eb974e1", "params": { "moduleId": "627b7a27-5bb7-46de-a530-67af45652e3b:thermocyclerModuleType" } }, { "commandType": "thermocycler/openLid", - "key": "d729aa20-7c95-4574-9fed-f49a8938fed6", + "key": "968e4a04-1cda-4730-a26d-810c0af827ad", "params": { "moduleId": "627b7a27-5bb7-46de-a530-67af45652e3b:thermocyclerModuleType" } }, { "commandType": "pickUpTip", - "key": "e2dab7ec-70d6-4e6b-a711-07a0a5d554f5", + "key": "39f9b118-55f7-4b32-b28a-689255ecf69a", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -3977,31 +3977,31 @@ }, { "commandType": "aspirate", - "key": "77af6a5a-282c-4a0a-8bdd-5d4cc518d51d", + "key": "cbd4de4c-8de3-407e-aace-9d0993c48214", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "a793a135-06aa-4ed6-a1d3-c176c7810afa:opentrons/opentrons_24_aluminumblock_nest_1.5ml_snapcap/1", "wellName": "A1", "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, - "flowRate": 478 + "flowRate": 6 } }, { "commandType": "dispense", - "key": "be1e7074-0b96-4bfa-8bd7-56880d3989b0", + "key": "df9dcd8b-54a2-4ea3-9014-8d1e5a8769c7", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", "wellName": "A1", "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, - "flowRate": 478 + "flowRate": 6 } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "d421e35d-ef4f-4347-878f-28269c2e0e0b", + "key": "41586872-d7ba-47a4-b545-aca0f924e1e5", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", @@ -4011,12 +4011,12 @@ }, { "commandType": "dropTipInPlace", - "key": "ac00f670-852b-4426-97dc-871b44ba66a1", + "key": "1a253e2c-f44c-414b-929e-fb071233caa5", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } }, { "commandType": "pickUpTip", - "key": "57a9e3bc-16e5-4dbf-840f-ef209cf856e1", + "key": "903f0cbd-36fc-46ad-9629-af0e713a2551", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4025,31 +4025,31 @@ }, { "commandType": "aspirate", - "key": "4c3d52f2-a9ea-4464-81a6-47833db3424c", + "key": "15e1819f-a75f-4a99-b248-ef9c44f742bb", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "a793a135-06aa-4ed6-a1d3-c176c7810afa:opentrons/opentrons_24_aluminumblock_nest_1.5ml_snapcap/1", "wellName": "A1", "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, - "flowRate": 478 + "flowRate": 6 } }, { "commandType": "dispense", - "key": "e5401a5c-58ec-45f8-9523-336440d8715f", + "key": "1746f838-436c-4524-99ca-79a89807e7c6", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", "wellName": "A1", "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, - "flowRate": 478 + "flowRate": 6 } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "6a30187d-016c-4431-8b35-9fd90a3b940d", + "key": "139ac8eb-77bc-4dd5-8358-5cd3352b2841", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", @@ -4059,12 +4059,12 @@ }, { "commandType": "dropTipInPlace", - "key": "2090ef62-ea92-4b94-bd06-db2b728be791", + "key": "7d3f53de-e3e9-4cce-aca3-a1c84ec8e4f5", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } }, { "commandType": "pickUpTip", - "key": "ec449df4-f566-463b-a456-888539754602", + "key": "519b1444-568a-49af-87cc-d251a28d5c74", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4073,31 +4073,31 @@ }, { "commandType": "aspirate", - "key": "2cdddd11-f918-49bf-8968-90d7fdf689b9", + "key": "eef96aa3-ed34-4a6c-a121-9bb1556016aa", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "a793a135-06aa-4ed6-a1d3-c176c7810afa:opentrons/opentrons_24_aluminumblock_nest_1.5ml_snapcap/1", "wellName": "A1", "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, - "flowRate": 478 + "flowRate": 6 } }, { "commandType": "dispense", - "key": "d40bbadd-350e-4712-a2b6-54b5c5e01a4e", + "key": "ee44942b-3da5-43c1-ad0b-17fc2ea46b68", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", "wellName": "B1", "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, - "flowRate": 478 + "flowRate": 6 } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "11446120-1cd7-4d31-b3ce-cf9c9e164c31", + "key": "1cad272e-a562-4abe-975a-209d5b29f6b8", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", @@ -4107,12 +4107,12 @@ }, { "commandType": "dropTipInPlace", - "key": "bb648909-b03d-4968-8c70-2805f62e25ea", + "key": "b25eeb63-22a3-4a45-9a34-2588f6e28034", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } }, { "commandType": "pickUpTip", - "key": "30b832e2-d26d-4a67-8a2f-e016fed5bf5f", + "key": "3b4257ba-7e37-4dc7-8630-628695a993b0", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4121,31 +4121,31 @@ }, { "commandType": "aspirate", - "key": "a97eaad0-b380-419b-ab4a-2217e1495c9b", + "key": "9ee178b8-6918-477a-ac4a-3b94b3257ded", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "a793a135-06aa-4ed6-a1d3-c176c7810afa:opentrons/opentrons_24_aluminumblock_nest_1.5ml_snapcap/1", "wellName": "A1", "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, - "flowRate": 478 + "flowRate": 6 } }, { "commandType": "dispense", - "key": "e6643b1f-2cb1-4dae-9e80-ea10ea30fcd5", + "key": "5b1fa15c-d50a-465e-99d6-d3c5631ba18b", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", "wellName": "B1", "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, - "flowRate": 478 + "flowRate": 6 } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "a54271da-153f-4c56-89e5-e75512c2479d", + "key": "8ca34094-5af4-4c19-bbc9-e6a95ebe7dc7", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", @@ -4155,12 +4155,12 @@ }, { "commandType": "dropTipInPlace", - "key": "976eb63e-6088-4557-8db5-03e7eea31c1e", + "key": "ed570c7c-bec9-4320-92c6-c5dc4e8ea039", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } }, { "commandType": "pickUpTip", - "key": "a8386c31-d0a7-45f2-aa3a-93ac440bb893", + "key": "24af8dc9-1d39-4ead-9fb7-c106cf81c4ca", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4169,31 +4169,31 @@ }, { "commandType": "aspirate", - "key": "cde8b107-1fb4-4621-be3c-208ba575bb92", + "key": "3fb7136f-156c-4ef2-ba9c-4010cbee7c45", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "a793a135-06aa-4ed6-a1d3-c176c7810afa:opentrons/opentrons_24_aluminumblock_nest_1.5ml_snapcap/1", "wellName": "A1", "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, - "flowRate": 478 + "flowRate": 6 } }, { "commandType": "dispense", - "key": "ebfa9a2b-d6b2-4b13-95fb-84bc50fde118", + "key": "70415053-47db-400e-a765-59930e782fba", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", "wellName": "C1", "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, - "flowRate": 478 + "flowRate": 6 } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "03e6c0a5-b0f1-427d-bc58-4fbf6fbd21be", + "key": "6bc262a7-6619-4c1d-90ab-694881833ef2", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", @@ -4203,12 +4203,12 @@ }, { "commandType": "dropTipInPlace", - "key": "f5dd6139-a8ed-4581-bf1b-0be264a64d7d", + "key": "61c26a5d-05d6-490b-9881-2505f334e148", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } }, { "commandType": "pickUpTip", - "key": "f6d713e8-89ff-4d3e-aaab-fbe2989dd179", + "key": "e7db6545-1f4f-40bd-a440-08afc48c8a6d", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4217,31 +4217,31 @@ }, { "commandType": "aspirate", - "key": "6e22f317-5ae4-4e9f-8605-7465e1422703", + "key": "a6a1af44-5a04-4fdf-aecb-afec57d49809", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "a793a135-06aa-4ed6-a1d3-c176c7810afa:opentrons/opentrons_24_aluminumblock_nest_1.5ml_snapcap/1", "wellName": "A1", "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, - "flowRate": 478 + "flowRate": 6 } }, { "commandType": "dispense", - "key": "bc10bd3d-4a4b-41a2-82e6-54c0440d32eb", + "key": "fa36f3c3-8a96-4643-adc3-1c856446c432", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", "wellName": "C1", "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, - "flowRate": 478 + "flowRate": 6 } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "cf645737-94a2-4ad7-b831-5bef7f231c06", + "key": "a3b84d03-7b16-4c8b-ab04-5e80d53c5008", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", @@ -4251,12 +4251,12 @@ }, { "commandType": "dropTipInPlace", - "key": "89b50486-6526-4583-bf14-0e69b1c9e734", + "key": "b3b763fc-d538-4b1c-9a72-8a1c85238e55", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } }, { "commandType": "pickUpTip", - "key": "96f89a25-617d-4bea-a1da-8fedf0cbf8f5", + "key": "aeb3764a-c819-4151-acb9-77d07399b13d", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4265,31 +4265,31 @@ }, { "commandType": "aspirate", - "key": "3911c02f-937a-46d6-bf7d-905a32a5be2e", + "key": "9b15d50e-e1a3-4966-8584-5e32da3afa4c", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "a793a135-06aa-4ed6-a1d3-c176c7810afa:opentrons/opentrons_24_aluminumblock_nest_1.5ml_snapcap/1", "wellName": "A1", "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, - "flowRate": 478 + "flowRate": 6 } }, { "commandType": "dispense", - "key": "6d8cd974-888c-4839-8487-45979ccec2be", + "key": "ada5949a-0085-4f09-b65e-db092a2ddab6", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", "wellName": "D1", "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, - "flowRate": 478 + "flowRate": 6 } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "1e2db296-c028-469c-9c53-427802616e07", + "key": "fbfd8391-eb1e-416f-97b0-4ea4e631b8b5", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", @@ -4299,12 +4299,12 @@ }, { "commandType": "dropTipInPlace", - "key": "44e645f1-3e34-41d8-beb8-3f372040417f", + "key": "edc2c62c-4f1e-4b9d-958c-1f9d4594759b", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } }, { "commandType": "pickUpTip", - "key": "faac2fd6-a6c2-4476-855f-050e6de30f50", + "key": "e9f79e00-bc1f-4f92-9299-401a7d85d78b", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4313,31 +4313,31 @@ }, { "commandType": "aspirate", - "key": "8b84ae00-1522-415a-ae6b-d5ac1d51a88a", + "key": "f361f6e5-a558-48dd-b808-383d48305944", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "a793a135-06aa-4ed6-a1d3-c176c7810afa:opentrons/opentrons_24_aluminumblock_nest_1.5ml_snapcap/1", "wellName": "A1", "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, - "flowRate": 478 + "flowRate": 6 } }, { "commandType": "dispense", - "key": "5e8a967a-e46b-4174-843e-8ceab5f51919", + "key": "ad9f20e5-c018-4241-8ee4-0b94bd4b4b13", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", "wellName": "D1", "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, - "flowRate": 478 + "flowRate": 6 } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "92b2bb2b-79dc-42a0-bdb5-aa0ab9b13e87", + "key": "c41c44f9-7969-4b9d-966f-7133927d1746", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", @@ -4347,12 +4347,12 @@ }, { "commandType": "dropTipInPlace", - "key": "8e019e03-08fb-4ffa-95f8-2b5772ead81f", + "key": "e2deb31d-b531-46a0-95b9-894c6143b51e", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } }, { "commandType": "pickUpTip", - "key": "7e002dcf-65f4-46b0-8809-d6f0316596c6", + "key": "ad15920f-80f3-4b31-8c69-7a9753760ac5", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4361,31 +4361,31 @@ }, { "commandType": "aspirate", - "key": "5cef4b58-609d-4998-913b-82ba2a4739eb", + "key": "ee11c611-bd0f-4039-b631-738aceae4b8b", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "a793a135-06aa-4ed6-a1d3-c176c7810afa:opentrons/opentrons_24_aluminumblock_nest_1.5ml_snapcap/1", "wellName": "A1", "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, - "flowRate": 478 + "flowRate": 6 } }, { "commandType": "dispense", - "key": "88c5ce01-4549-4ff8-b091-8b19d2e70b64", + "key": "dace1ad5-22a3-4731-8a0e-54378e936e41", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", "wellName": "E1", "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, - "flowRate": 478 + "flowRate": 6 } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "4cb6cc3d-003f-4c2b-b190-a5ebdbab9459", + "key": "c0075e01-b1d6-41fc-a482-541eba3dd9ce", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", @@ -4395,12 +4395,12 @@ }, { "commandType": "dropTipInPlace", - "key": "c934ec98-5a28-40ec-88cb-3b1860d8bac7", + "key": "287153c4-baee-46c6-81e0-db0cd90a8d7b", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } }, { "commandType": "pickUpTip", - "key": "bd57a694-9816-47fb-b4aa-c80d2c3a0b2c", + "key": "e956cb88-1387-4014-aea0-06237c9ea125", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4409,31 +4409,31 @@ }, { "commandType": "aspirate", - "key": "3793e59c-1d6c-43f7-bbbe-73c2baac4793", + "key": "3d870b55-af49-42b0-b877-7a3777fea82d", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "a793a135-06aa-4ed6-a1d3-c176c7810afa:opentrons/opentrons_24_aluminumblock_nest_1.5ml_snapcap/1", "wellName": "A1", "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, - "flowRate": 478 + "flowRate": 6 } }, { "commandType": "dispense", - "key": "8793518d-aaac-470d-af77-77a43d753675", + "key": "8d06248a-65a5-4372-a666-70ec956df1d4", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", "wellName": "E1", "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, - "flowRate": 478 + "flowRate": 6 } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "77726b6f-424e-4903-a898-bdf01df934f4", + "key": "3304feb9-69e8-4e70-a3b6-308706f06d0c", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", @@ -4443,12 +4443,12 @@ }, { "commandType": "dropTipInPlace", - "key": "95585fea-74b8-4d30-bd98-2019c1f024e9", + "key": "2f73eac1-8a7a-4bb2-b634-3c938bb6a541", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } }, { "commandType": "pickUpTip", - "key": "df9446b5-d7d2-4bb1-b64b-2cc5a544de96", + "key": "b08587bf-ac3a-4322-baa4-2d54ab4c74d8", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4457,31 +4457,31 @@ }, { "commandType": "aspirate", - "key": "fa1acf12-67ff-4cd7-9b36-81a4c6fa7942", + "key": "627b7b39-4646-42e5-8a6b-ab85c073631a", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "a793a135-06aa-4ed6-a1d3-c176c7810afa:opentrons/opentrons_24_aluminumblock_nest_1.5ml_snapcap/1", "wellName": "A1", "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, - "flowRate": 478 + "flowRate": 6 } }, { "commandType": "dispense", - "key": "9a9eeb5d-f5f8-43bb-b0f6-ccbb956d0a2b", + "key": "f96068bb-8730-46d2-9649-e77060a67d96", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", "wellName": "F1", "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, - "flowRate": 478 + "flowRate": 6 } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "f6c1a951-4fce-48b5-8990-6cefabb81620", + "key": "717da31c-723f-4761-8a9e-c46e3a0d95d9", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", @@ -4491,12 +4491,12 @@ }, { "commandType": "dropTipInPlace", - "key": "479a02e3-e2f5-4c45-96f7-e8517fc17bd4", + "key": "9b69289d-3b6c-4caa-ab71-eee65591d5d7", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } }, { "commandType": "pickUpTip", - "key": "57d8e8c3-64ba-416d-bbed-eb7675ddde76", + "key": "61f66087-286a-4309-8f56-e95e1d3450db", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4505,31 +4505,31 @@ }, { "commandType": "aspirate", - "key": "db03f00e-5aff-4164-a864-f18ca75212e2", + "key": "fcd20bdc-8cd3-4dc4-88ff-572317dfeafa", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "a793a135-06aa-4ed6-a1d3-c176c7810afa:opentrons/opentrons_24_aluminumblock_nest_1.5ml_snapcap/1", "wellName": "A1", "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, - "flowRate": 478 + "flowRate": 6 } }, { "commandType": "dispense", - "key": "0d057a50-c927-4f04-8bed-9fb9681423de", + "key": "cc4e76bc-f89a-45e5-8200-1bfd3ba3c950", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", "wellName": "F1", "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, - "flowRate": 478 + "flowRate": 6 } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "b69e1555-3b19-444d-afa8-3b464bd4403b", + "key": "f98a9dd9-6368-45ad-bf34-374ebd304017", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", @@ -4539,12 +4539,12 @@ }, { "commandType": "dropTipInPlace", - "key": "2f509f24-3b12-4fee-ad61-9f509021a38f", + "key": "28f596a5-d900-4335-82d1-c69c2a4f3476", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } }, { "commandType": "pickUpTip", - "key": "b9ecfc6b-e9f3-44ef-81be-b4d8136fcad6", + "key": "cf3e0222-4b78-4c11-8f7c-853edb173ef0", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4553,31 +4553,31 @@ }, { "commandType": "aspirate", - "key": "af8c7d1d-f2c6-4871-bfc3-ce5903e8a5a8", + "key": "87bf3bc3-d986-4d4e-9303-531db931ecf2", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "a793a135-06aa-4ed6-a1d3-c176c7810afa:opentrons/opentrons_24_aluminumblock_nest_1.5ml_snapcap/1", "wellName": "A1", "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, - "flowRate": 478 + "flowRate": 6 } }, { "commandType": "dispense", - "key": "86547661-826e-422d-90fb-5b91915e81ce", + "key": "7d4a2f34-efc4-4c69-ac95-12e90da24846", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", "wellName": "G1", "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, - "flowRate": 478 + "flowRate": 6 } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "f0e7042f-4bad-4bc5-8259-dd66fe9e8298", + "key": "c26ac9f4-f86a-410b-9524-3a107df76154", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", @@ -4587,12 +4587,12 @@ }, { "commandType": "dropTipInPlace", - "key": "d90df5ec-8ec5-4d07-84eb-3b223096ad96", + "key": "cc9ad177-40b1-4063-904f-bdcd5f534ba3", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } }, { "commandType": "pickUpTip", - "key": "8779a116-4dd8-4e75-bb64-971be73ce999", + "key": "6f27f601-b3a2-4d72-b1c7-d29fbef1e2fb", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4601,31 +4601,31 @@ }, { "commandType": "aspirate", - "key": "476d628d-0cd3-44f9-b6a3-3ad98688584a", + "key": "0d614bd3-9723-467a-a8f4-6793875071a6", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "a793a135-06aa-4ed6-a1d3-c176c7810afa:opentrons/opentrons_24_aluminumblock_nest_1.5ml_snapcap/1", "wellName": "A1", "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, - "flowRate": 478 + "flowRate": 6 } }, { "commandType": "dispense", - "key": "fb2aa4ac-4534-4489-a312-3a48b9c53000", + "key": "321bc387-8de7-4456-99d2-f61e31f49ac4", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", "wellName": "G1", "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, - "flowRate": 478 + "flowRate": 6 } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "f0b33c82-2628-44de-81dc-bf96c09bf10c", + "key": "23c76ed2-6751-4f8d-b061-02e54bae4b92", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", @@ -4635,12 +4635,12 @@ }, { "commandType": "dropTipInPlace", - "key": "825d8d92-b475-4ad1-bab3-59bce3790ad2", + "key": "a33f1f9c-c1eb-42c5-b2d2-dc81d0c92207", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } }, { "commandType": "pickUpTip", - "key": "f5812c27-3bf2-49d6-bcf2-e1d84cd31615", + "key": "fa8827df-09aa-41df-b2af-794dafab3f36", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4649,31 +4649,31 @@ }, { "commandType": "aspirate", - "key": "48efc02b-2950-44cd-bddc-d8567bb2ef0d", + "key": "222b1e4d-81fb-44c5-beff-d39ae967766c", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "a793a135-06aa-4ed6-a1d3-c176c7810afa:opentrons/opentrons_24_aluminumblock_nest_1.5ml_snapcap/1", "wellName": "A1", "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, - "flowRate": 478 + "flowRate": 6 } }, { "commandType": "dispense", - "key": "82c1ca16-ce8d-4144-9f77-2235d3b38a1d", + "key": "d6644b59-fd5b-44cf-a5b4-da4bec2ffcd1", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", "wellName": "H1", "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, - "flowRate": 478 + "flowRate": 6 } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "f904e526-6210-4665-b80f-aaf798998bff", + "key": "62a05dff-fd3d-47ec-a852-7ec365fdc60a", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", @@ -4683,12 +4683,12 @@ }, { "commandType": "dropTipInPlace", - "key": "a2d3c0d6-eb9c-49e1-b956-714799ad22c4", + "key": "dcbbb300-64a6-4deb-9733-19b86574106a", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } }, { "commandType": "pickUpTip", - "key": "fc43bd31-0414-4eaa-b5c2-f19569955525", + "key": "882ee6ef-f2a3-4478-b88a-fd650c11cbc9", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4697,31 +4697,31 @@ }, { "commandType": "aspirate", - "key": "e1be24da-66a0-4012-b934-e21ab115fba5", + "key": "4745b4e5-0fed-427b-961a-c1e346e5f591", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "a793a135-06aa-4ed6-a1d3-c176c7810afa:opentrons/opentrons_24_aluminumblock_nest_1.5ml_snapcap/1", "wellName": "A1", "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, - "flowRate": 478 + "flowRate": 6 } }, { "commandType": "dispense", - "key": "bd3c42c0-63b0-4b99-9ec2-f763fc74fab2", + "key": "916ce3bf-32a1-45e1-b704-32b75db4e572", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", "wellName": "H1", "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, - "flowRate": 478 + "flowRate": 6 } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "d1407b93-de54-4cdf-979a-a407c79ac352", + "key": "62fc2bbb-ee9f-4769-9c6d-7eae1d56b7f3", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", @@ -4731,12 +4731,12 @@ }, { "commandType": "dropTipInPlace", - "key": "4317a410-eceb-4130-b499-f6e717887fee", + "key": "459eed51-26e1-4f67-946c-5f281d9ff5c4", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } }, { "commandType": "pickUpTip", - "key": "789d33d5-9931-4e3d-b128-8edb6a77c669", + "key": "a11d26ea-07d0-4fbe-95a8-3229bf3a7974", "params": { "pipetteId": "6d1e53c3-2db3-451b-ad60-3fe13781a193", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4745,7 +4745,7 @@ }, { "commandType": "configureForVolume", - "key": "54380bee-ed59-4701-a5ff-5a7d62786c3f", + "key": "8355523c-68f9-4d67-b7f0-c19b39a20d58", "params": { "pipetteId": "6d1e53c3-2db3-451b-ad60-3fe13781a193", "volume": 10 @@ -4753,55 +4753,55 @@ }, { "commandType": "aspirate", - "key": "f5b8f3b4-e2b2-4d42-8916-9568ed131a61", + "key": "cb6f6fd9-ce96-4788-930a-bcb4fc73cab8", "params": { "pipetteId": "6d1e53c3-2db3-451b-ad60-3fe13781a193", "volume": 10, "labwareId": "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", "wellName": "A1", "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, - "flowRate": 35 + "flowRate": 8 } }, { "commandType": "dispense", - "key": "ef25611f-b9d5-4d57-a989-578ea42962c2", + "key": "d72adc76-8ece-47d3-86d2-5ccec5b507a4", "params": { "pipetteId": "6d1e53c3-2db3-451b-ad60-3fe13781a193", "volume": 10, "labwareId": "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", "wellName": "A1", "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, - "flowRate": 57 + "flowRate": 8 } }, { "commandType": "aspirate", - "key": "2f000ba7-517f-4f08-8179-33063edd9283", + "key": "aefc83b0-fcba-4010-b71a-9b79e6134779", "params": { "pipetteId": "6d1e53c3-2db3-451b-ad60-3fe13781a193", "volume": 10, "labwareId": "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", "wellName": "A1", "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, - "flowRate": 35 + "flowRate": 8 } }, { "commandType": "dispense", - "key": "8884b66f-6179-4692-86f9-1ee5809f1b05", + "key": "955873e5-8fcd-43d4-9f6c-3281922fc97d", "params": { "pipetteId": "6d1e53c3-2db3-451b-ad60-3fe13781a193", "volume": 10, "labwareId": "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", "wellName": "A1", "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, - "flowRate": 57 + "flowRate": 8 } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "094f9abf-d205-4f40-96e6-d92d80c9efca", + "key": "a237c669-fe56-434a-a5fc-225ba5403b28", "params": { "pipetteId": "6d1e53c3-2db3-451b-ad60-3fe13781a193", "addressableAreaName": "movableTrashA3", @@ -4811,12 +4811,12 @@ }, { "commandType": "dropTipInPlace", - "key": "b7a75837-05f9-4fd5-ae46-d36c67717daf", + "key": "87d1c5d5-c40e-480a-a0bf-4a8a63bae3cd", "params": { "pipetteId": "6d1e53c3-2db3-451b-ad60-3fe13781a193" } }, { "commandType": "moveLabware", - "key": "291ca892-3619-4784-8a32-b8c379399ead", + "key": "98e741c6-01c6-43d5-8d98-e3950b7dabda", "params": { "labwareId": "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", "strategy": "usingGripper", @@ -4825,12 +4825,12 @@ }, { "commandType": "waitForDuration", - "key": "7a21f909-db61-4239-b26e-61af35639ff7", + "key": "da873c66-a7e4-4810-b2d1-ab037e9156d1", "params": { "seconds": 60, "message": "" } }, { "commandType": "moveLabware", - "key": "d7f77df9-9ce5-4a46-8764-6b47814a31f5", + "key": "58ced158-ae4d-4275-814b-cf29bacda1c0", "params": { "labwareId": "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", "strategy": "usingGripper", @@ -4839,21 +4839,21 @@ }, { "commandType": "heaterShaker/closeLabwareLatch", - "key": "5411a7c9-fd75-48ad-8390-f42c84820d8b", + "key": "2706f0f9-5898-47e3-b53f-06df74598b4e", "params": { "moduleId": "c19dffa3-cb34-4702-bcf6-dcea786257d1:heaterShakerModuleType" } }, { "commandType": "heaterShaker/deactivateHeater", - "key": "4a9a018e-c6d7-4cb6-b400-cdac31c01c9a", + "key": "073eac12-998e-4075-bcb5-feb215d5f251", "params": { "moduleId": "c19dffa3-cb34-4702-bcf6-dcea786257d1:heaterShakerModuleType" } }, { "commandType": "heaterShaker/setAndWaitForShakeSpeed", - "key": "f5382798-ca5f-4052-9444-4ad5bd689286", + "key": "37fedb11-cfa0-494d-905f-e5539c2960e6", "params": { "moduleId": "c19dffa3-cb34-4702-bcf6-dcea786257d1:heaterShakerModuleType", "rpm": 500 @@ -4861,28 +4861,28 @@ }, { "commandType": "heaterShaker/deactivateHeater", - "key": "18be95c2-222b-4575-88df-cfdf6b5b2e29", + "key": "6431c63c-608d-4f82-bc68-ade76b8c1cc2", "params": { "moduleId": "c19dffa3-cb34-4702-bcf6-dcea786257d1:heaterShakerModuleType" } }, { "commandType": "heaterShaker/deactivateShaker", - "key": "781b4a44-6586-4817-9dcd-e080564f89b4", + "key": "a22834db-00b7-4f66-a681-9cc5dd17031e", "params": { "moduleId": "c19dffa3-cb34-4702-bcf6-dcea786257d1:heaterShakerModuleType" } }, { "commandType": "heaterShaker/openLabwareLatch", - "key": "f71f0827-5e7e-4833-af6b-e6eb9ca9ec50", + "key": "af548bbd-5620-405a-bda0-ac08ca06fbbd", "params": { "moduleId": "c19dffa3-cb34-4702-bcf6-dcea786257d1:heaterShakerModuleType" } }, { "commandType": "moveLabware", - "key": "6074e2ae-f4a7-408b-b85c-f729124acafd", + "key": "ffb00dfa-99db-4744-9bde-538d0aa7b1a7", "params": { "labwareId": "a793a135-06aa-4ed6-a1d3-c176c7810afa:opentrons/opentrons_24_aluminumblock_nest_1.5ml_snapcap/1", "strategy": "manualMoveWithPause", @@ -4891,14 +4891,14 @@ }, { "commandType": "temperatureModule/deactivate", - "key": "37c9d0bb-8a50-4f79-9078-2bbf248959d7", + "key": "8e0e035d-33a2-4995-a557-26c7951de915", "params": { "moduleId": "ef44ad7f-0fd9-46d6-8bc0-c70785644cc8:temperatureModuleType" } }, { "commandType": "moveLabware", - "key": "cd6c624a-64dc-459f-b3e4-531829321734", + "key": "36c8ae59-9d10-428a-b6fd-3e3b6b49ed09", "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 92ce0949f986..9848033ccd03 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": 1701659583856, + "lastModified": 1711047424926, "category": null, "subcategory": null, "tags": [] @@ -15,7 +15,7 @@ "name": "opentrons/protocol-designer", "version": "8.0.0", "data": { - "_internalAppBuildDate": "Mon, 04 Dec 2023 03:04:04 GMT", + "_internalAppBuildDate": "Thu, 21 Mar 2024 18:51:59 GMT", "defaultValues": { "aspirate_mmFromBottom": 1, "dispense_mmFromBottom": 0.5, @@ -59,8 +59,6 @@ }, "savedStepForms": { "__INITIAL_DECK_SETUP_STEP__": { - "stepType": "manualIntervention", - "id": "__INITIAL_DECK_SETUP_STEP__", "labwareLocationUpdate": { "f2d371ea-5146-4c89-8200-9c056a7f321a:opentrons/opentrons_flex_96_tiprack_1000ul/1": "C2", "54370838-4fca-4a14-b88a-7840e4903649:opentrons/opentrons_96_wellplate_200ul_pcr_full_skirt/2": "fd6da9f1-d63b-414b-929e-c646b64790e9:thermocyclerModuleType", @@ -73,13 +71,11 @@ "moduleLocationUpdate": { "23347241-80bb-4a7e-9c91-5d9727a9e483:heaterShakerModuleType": "D1", "fd6da9f1-d63b-414b-929e-c646b64790e9:thermocyclerModuleType": "B1" - } + }, + "stepType": "manualIntervention", + "id": "__INITIAL_DECK_SETUP_STEP__" }, "dcec0c89-338b-453b-a79b-c081830ff138": { - "id": "dcec0c89-338b-453b-a79b-c081830ff138", - "stepType": "thermocycler", - "stepName": "thermocycler", - "stepDetails": "", "thermocyclerFormType": "thermocyclerState", "moduleId": "fd6da9f1-d63b-414b-929e-c646b64790e9:thermocyclerModuleType", "blockIsActive": false, @@ -95,22 +91,22 @@ "blockTargetTempHold": null, "lidIsActiveHold": false, "lidTargetTempHold": null, - "lidOpenHold": null + "lidOpenHold": null, + "id": "dcec0c89-338b-453b-a79b-c081830ff138", + "stepType": "thermocycler", + "stepName": "thermocycler", + "stepDetails": "" }, "e6904828-c44c-4c25-8144-1b7921b5f8dc": { + "labware": "8bacda22-9e05-45e8-bef4-cc04414a204f:opentrons/axygen_1_reservoir_90ml/1", + "useGripper": true, + "newLocation": "C1", "id": "e6904828-c44c-4c25-8144-1b7921b5f8dc", "stepType": "moveLabware", "stepName": "move labware", - "stepDetails": "", - "labware": "8bacda22-9e05-45e8-bef4-cc04414a204f:opentrons/axygen_1_reservoir_90ml/1", - "useGripper": true, - "newLocation": "C1" + "stepDetails": "" }, "d2f74144-a7bf-4ba2-aaab-30d70b2b62c7": { - "id": "d2f74144-a7bf-4ba2-aaab-30d70b2b62c7", - "stepType": "moveLiquid", - "stepName": "transfer", - "stepDetails": "", "pipette": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": "100", "changeTip": "always", @@ -154,13 +150,13 @@ "dispense_delay_seconds": "1", "dispense_delay_mmFromBottom": null, "dropTip_location": "9d61f642-8f9b-467d-b2f7-b67fb162fd26:wasteChute", - "nozzles": null + "nozzles": null, + "id": "d2f74144-a7bf-4ba2-aaab-30d70b2b62c7", + "stepType": "moveLiquid", + "stepName": "transfer", + "stepDetails": "" }, "240a2c96-3db8-4679-bdac-049306b7b9c4": { - "id": "240a2c96-3db8-4679-bdac-049306b7b9c4", - "stepType": "thermocycler", - "stepName": "thermocycler", - "stepDetails": "", "thermocyclerFormType": "thermocyclerState", "moduleId": "fd6da9f1-d63b-414b-929e-c646b64790e9:thermocyclerModuleType", "blockIsActive": true, @@ -176,26 +172,26 @@ "blockTargetTempHold": null, "lidIsActiveHold": false, "lidTargetTempHold": null, - "lidOpenHold": null + "lidOpenHold": null, + "id": "240a2c96-3db8-4679-bdac-049306b7b9c4", + "stepType": "thermocycler", + "stepName": "thermocycler", + "stepDetails": "" }, "bfa5b548-f9eb-4a80-95d5-26e41cc2c69e": { - "id": "bfa5b548-f9eb-4a80-95d5-26e41cc2c69e", - "stepType": "pause", - "stepName": "pause", - "stepDetails": "", "pauseAction": "untilTime", "pauseHour": null, "pauseMinute": "1", "pauseSecond": null, "pauseMessage": "", "moduleId": "23347241-80bb-4a7e-9c91-5d9727a9e483:heaterShakerModuleType", - "pauseTemperature": null + "pauseTemperature": null, + "id": "bfa5b548-f9eb-4a80-95d5-26e41cc2c69e", + "stepType": "pause", + "stepName": "pause", + "stepDetails": "" }, "bc3245e5-b22e-492a-9937-03aed3a07710": { - "id": "bc3245e5-b22e-492a-9937-03aed3a07710", - "stepType": "thermocycler", - "stepName": "thermocycler", - "stepDetails": "", "thermocyclerFormType": "thermocyclerState", "moduleId": "fd6da9f1-d63b-414b-929e-c646b64790e9:thermocyclerModuleType", "blockIsActive": false, @@ -211,22 +207,22 @@ "blockTargetTempHold": null, "lidIsActiveHold": false, "lidTargetTempHold": null, - "lidOpenHold": null + "lidOpenHold": null, + "id": "bc3245e5-b22e-492a-9937-03aed3a07710", + "stepType": "thermocycler", + "stepName": "thermocycler", + "stepDetails": "" }, "8782dcc1-8960-4d13-9b29-e8837228ba56": { + "labware": "54370838-4fca-4a14-b88a-7840e4903649:opentrons/opentrons_96_wellplate_200ul_pcr_full_skirt/2", + "useGripper": true, + "newLocation": "7c4d59fa-0e50-442f-adce-9e4b0c7f0b88:opentrons/opentrons_96_pcr_adapter/1", "id": "8782dcc1-8960-4d13-9b29-e8837228ba56", "stepType": "moveLabware", "stepName": "move labware", - "stepDetails": "", - "labware": "54370838-4fca-4a14-b88a-7840e4903649:opentrons/opentrons_96_wellplate_200ul_pcr_full_skirt/2", - "useGripper": true, - "newLocation": "7c4d59fa-0e50-442f-adce-9e4b0c7f0b88:opentrons/opentrons_96_pcr_adapter/1" + "stepDetails": "" }, "b5dc46b1-52ac-4b61-9318-778fb437d1ef": { - "id": "b5dc46b1-52ac-4b61-9318-778fb437d1ef", - "stepType": "heaterShaker", - "stepName": "heater-shaker", - "stepDetails": "", "moduleId": "23347241-80bb-4a7e-9c91-5d9727a9e483:heaterShakerModuleType", "setHeaterShakerTemperature": null, "targetHeaterShakerTemperature": null, @@ -235,13 +231,13 @@ "latchOpen": true, "heaterShakerSetTimer": null, "heaterShakerTimerMinutes": null, - "heaterShakerTimerSeconds": null - }, - "8622d8f8-acbc-48ff-86f8-0476d1de0e02": { - "id": "8622d8f8-acbc-48ff-86f8-0476d1de0e02", + "heaterShakerTimerSeconds": null, + "id": "b5dc46b1-52ac-4b61-9318-778fb437d1ef", "stepType": "heaterShaker", "stepName": "heater-shaker", - "stepDetails": "", + "stepDetails": "" + }, + "8622d8f8-acbc-48ff-86f8-0476d1de0e02": { "moduleId": "23347241-80bb-4a7e-9c91-5d9727a9e483:heaterShakerModuleType", "setHeaterShakerTemperature": false, "targetHeaterShakerTemperature": null, @@ -250,22 +246,22 @@ "latchOpen": false, "heaterShakerSetTimer": true, "heaterShakerTimerMinutes": "1", - "heaterShakerTimerSeconds": null + "heaterShakerTimerSeconds": null, + "id": "8622d8f8-acbc-48ff-86f8-0476d1de0e02", + "stepType": "heaterShaker", + "stepName": "heater-shaker", + "stepDetails": "" }, "07dd4472-3ea4-475c-8fd3-18819519b401": { + "labware": "54370838-4fca-4a14-b88a-7840e4903649:opentrons/opentrons_96_wellplate_200ul_pcr_full_skirt/2", + "useGripper": true, + "newLocation": "B4", "id": "07dd4472-3ea4-475c-8fd3-18819519b401", "stepType": "moveLabware", "stepName": "move labware", - "stepDetails": "", - "labware": "54370838-4fca-4a14-b88a-7840e4903649:opentrons/opentrons_96_wellplate_200ul_pcr_full_skirt/2", - "useGripper": true, - "newLocation": "B4" + "stepDetails": "" }, "2b8f84e2-b079-41e8-a66e-ff8d9c5dfe1d": { - "id": "2b8f84e2-b079-41e8-a66e-ff8d9c5dfe1d", - "stepType": "heaterShaker", - "stepName": "heater-shaker", - "stepDetails": "", "moduleId": "23347241-80bb-4a7e-9c91-5d9727a9e483:heaterShakerModuleType", "setHeaterShakerTemperature": null, "targetHeaterShakerTemperature": null, @@ -274,16 +270,20 @@ "latchOpen": true, "heaterShakerSetTimer": null, "heaterShakerTimerMinutes": null, - "heaterShakerTimerSeconds": null + "heaterShakerTimerSeconds": null, + "id": "2b8f84e2-b079-41e8-a66e-ff8d9c5dfe1d", + "stepType": "heaterShaker", + "stepName": "heater-shaker", + "stepDetails": "" }, "ed84f11e-db82-4039-9e04-e619b03af42f": { + "labware": "f2d371ea-5146-4c89-8200-9c056a7f321a:opentrons/opentrons_flex_96_tiprack_1000ul/1", + "useGripper": true, + "newLocation": "cutoutD3", "id": "ed84f11e-db82-4039-9e04-e619b03af42f", "stepType": "moveLabware", "stepName": "move labware", - "stepDetails": "", - "labware": "f2d371ea-5146-4c89-8200-9c056a7f321a:opentrons/opentrons_flex_96_tiprack_1000ul/1", - "useGripper": true, - "newLocation": "cutoutD3" + "stepDetails": "" } }, "orderedStepIds": [ @@ -1320,45 +1320,7 @@ "opentrons_flex_96_tiprack_adapter": { "x": 0, "y": 0, "z": 121 } } }, - "opentrons/opentrons_96_wellplate_200ul_pcr_full_skirt/2": { - "namespace": "opentrons", - "version": 2, - "schemaVersion": 2, - "parameters": { - "loadName": "opentrons_96_wellplate_200ul_pcr_full_skirt", - "format": "96Standard", - "isTiprack": false, - "isMagneticModuleCompatible": true - }, - "metadata": { - "displayName": "Opentrons Tough 96 Well Plate 200 µL PCR Full Skirt", - "displayCategory": "wellPlate", - "displayVolumeUnits": "µL", - "tags": [] - }, - "brand": { - "brand": "Opentrons", - "brandId": ["991-00076"], - "links": [ - "https://shop.opentrons.com/tough-0.2-ml-96-well-pcr-plate-full-skirt/" - ] - }, - "dimensions": { - "xDimension": 127.76, - "yDimension": 85.48, - "zDimension": 16 - }, - "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 } - }, - "stackingOffsetWithModule": { - "magneticBlockV1": { "x": 0, "y": 0, "z": 3.54 }, - "thermocyclerModuleV2": { "x": 0, "y": 0, "z": 10.7 } - }, - "gripForce": 15, - "gripHeightFromLabwareBottom": 10, + "opentrons/opentrons_96_pcr_adapter/1": { "ordering": [ ["A1", "B1", "C1", "D1", "E1", "F1", "G1", "H1"], ["A2", "B2", "C2", "D2", "E2", "F2", "G2", "H2"], @@ -1373,870 +1335,882 @@ ["A11", "B11", "C11", "D11", "E11", "F11", "G11", "H11"], ["A12", "B12", "C12", "D12", "E12", "F12", "G12", "H12"] ], + "brand": { "brand": "Opentrons", "brandId": [] }, + "metadata": { + "displayName": "Opentrons 96 PCR Heater-Shaker Adapter", + "displayCategory": "adapter", + "displayVolumeUnits": "µL", + "tags": [] + }, + "dimensions": { + "xDimension": 111, + "yDimension": 75, + "zDimension": 13.85 + }, "wells": { "A1": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 14.38, - "y": 74.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 6, + "y": 69, + "z": 1.85 }, "B1": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 14.38, - "y": 65.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 6, + "y": 60, + "z": 1.85 }, "C1": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 14.38, - "y": 56.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 6, + "y": 51, + "z": 1.85 }, "D1": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 14.38, - "y": 47.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 6, + "y": 42, + "z": 1.85 }, "E1": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 14.38, - "y": 38.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 6, + "y": 33, + "z": 1.85 }, "F1": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 14.38, - "y": 29.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 6, + "y": 24, + "z": 1.85 }, "G1": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 14.38, - "y": 20.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 6, + "y": 15, + "z": 1.85 }, "H1": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 14.38, - "y": 11.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 6, + "y": 6, + "z": 1.85 }, "A2": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 23.38, - "y": 74.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 15, + "y": 69, + "z": 1.85 }, "B2": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 23.38, - "y": 65.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 15, + "y": 60, + "z": 1.85 }, "C2": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 23.38, - "y": 56.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 15, + "y": 51, + "z": 1.85 }, "D2": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 23.38, - "y": 47.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 15, + "y": 42, + "z": 1.85 }, "E2": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 23.38, - "y": 38.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 15, + "y": 33, + "z": 1.85 }, "F2": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 23.38, - "y": 29.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 15, + "y": 24, + "z": 1.85 }, "G2": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 23.38, - "y": 20.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 15, + "y": 15, + "z": 1.85 }, "H2": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 23.38, - "y": 11.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 15, + "y": 6, + "z": 1.85 }, "A3": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 32.38, - "y": 74.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 24, + "y": 69, + "z": 1.85 }, "B3": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 32.38, - "y": 65.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 24, + "y": 60, + "z": 1.85 }, "C3": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 32.38, - "y": 56.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 24, + "y": 51, + "z": 1.85 }, "D3": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 32.38, - "y": 47.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 24, + "y": 42, + "z": 1.85 }, "E3": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 32.38, - "y": 38.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 24, + "y": 33, + "z": 1.85 }, "F3": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 32.38, - "y": 29.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 24, + "y": 24, + "z": 1.85 }, "G3": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 32.38, - "y": 20.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 24, + "y": 15, + "z": 1.85 }, "H3": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 32.38, - "y": 11.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 24, + "y": 6, + "z": 1.85 }, "A4": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 41.38, - "y": 74.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 33, + "y": 69, + "z": 1.85 }, "B4": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 41.38, - "y": 65.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 33, + "y": 60, + "z": 1.85 }, "C4": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 41.38, - "y": 56.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 33, + "y": 51, + "z": 1.85 }, "D4": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 41.38, - "y": 47.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 33, + "y": 42, + "z": 1.85 }, "E4": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 41.38, - "y": 38.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 33, + "y": 33, + "z": 1.85 }, "F4": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 41.38, - "y": 29.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 33, + "y": 24, + "z": 1.85 }, "G4": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 41.38, - "y": 20.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 33, + "y": 15, + "z": 1.85 }, "H4": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 41.38, - "y": 11.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 33, + "y": 6, + "z": 1.85 }, "A5": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 50.38, - "y": 74.24, - "z": 1.05 - }, - "B5": { - "depth": 14.95, - "totalLiquidVolume": 200, + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 42, + "y": 69, + "z": 1.85 + }, + "B5": { + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 50.38, - "y": 65.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 42, + "y": 60, + "z": 1.85 }, "C5": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 50.38, - "y": 56.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 42, + "y": 51, + "z": 1.85 }, "D5": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 50.38, - "y": 47.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 42, + "y": 42, + "z": 1.85 }, "E5": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 50.38, - "y": 38.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 42, + "y": 33, + "z": 1.85 }, "F5": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 50.38, - "y": 29.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 42, + "y": 24, + "z": 1.85 }, "G5": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 50.38, - "y": 20.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 42, + "y": 15, + "z": 1.85 }, "H5": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 50.38, - "y": 11.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 42, + "y": 6, + "z": 1.85 }, "A6": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 59.38, - "y": 74.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 51, + "y": 69, + "z": 1.85 }, "B6": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 59.38, - "y": 65.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 51, + "y": 60, + "z": 1.85 }, "C6": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 59.38, - "y": 56.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 51, + "y": 51, + "z": 1.85 }, "D6": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 59.38, - "y": 47.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 51, + "y": 42, + "z": 1.85 }, "E6": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 59.38, - "y": 38.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 51, + "y": 33, + "z": 1.85 }, "F6": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 59.38, - "y": 29.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 51, + "y": 24, + "z": 1.85 }, "G6": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 59.38, - "y": 20.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 51, + "y": 15, + "z": 1.85 }, "H6": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 59.38, - "y": 11.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 51, + "y": 6, + "z": 1.85 }, "A7": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 68.38, - "y": 74.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 60, + "y": 69, + "z": 1.85 }, "B7": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 68.38, - "y": 65.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 60, + "y": 60, + "z": 1.85 }, "C7": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 68.38, - "y": 56.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 60, + "y": 51, + "z": 1.85 }, "D7": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 68.38, - "y": 47.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 60, + "y": 42, + "z": 1.85 }, "E7": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 68.38, - "y": 38.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 60, + "y": 33, + "z": 1.85 }, "F7": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 68.38, - "y": 29.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 60, + "y": 24, + "z": 1.85 }, "G7": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 68.38, - "y": 20.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 60, + "y": 15, + "z": 1.85 }, "H7": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 68.38, - "y": 11.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 60, + "y": 6, + "z": 1.85 }, "A8": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 77.38, - "y": 74.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 69, + "y": 69, + "z": 1.85 }, "B8": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 77.38, - "y": 65.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 69, + "y": 60, + "z": 1.85 }, "C8": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 77.38, - "y": 56.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 69, + "y": 51, + "z": 1.85 }, "D8": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 77.38, - "y": 47.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 69, + "y": 42, + "z": 1.85 }, "E8": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 77.38, - "y": 38.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 69, + "y": 33, + "z": 1.85 }, "F8": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 77.38, - "y": 29.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 69, + "y": 24, + "z": 1.85 }, "G8": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 77.38, - "y": 20.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 69, + "y": 15, + "z": 1.85 }, "H8": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 77.38, - "y": 11.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 69, + "y": 6, + "z": 1.85 }, "A9": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 86.38, - "y": 74.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 78, + "y": 69, + "z": 1.85 }, "B9": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 86.38, - "y": 65.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 78, + "y": 60, + "z": 1.85 }, "C9": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 86.38, - "y": 56.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 78, + "y": 51, + "z": 1.85 }, "D9": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 86.38, - "y": 47.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 78, + "y": 42, + "z": 1.85 }, "E9": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 86.38, - "y": 38.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 78, + "y": 33, + "z": 1.85 }, "F9": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 86.38, - "y": 29.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 78, + "y": 24, + "z": 1.85 }, "G9": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 86.38, - "y": 20.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 78, + "y": 15, + "z": 1.85 }, "H9": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 86.38, - "y": 11.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 78, + "y": 6, + "z": 1.85 }, "A10": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 95.38, - "y": 74.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 87, + "y": 69, + "z": 1.85 }, - "B10": { - "depth": 14.95, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.5, - "x": 95.38, - "y": 65.24, - "z": 1.05 + "B10": { + "depth": 12, + "shape": "circular", + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 87, + "y": 60, + "z": 1.85 }, "C10": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 95.38, - "y": 56.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 87, + "y": 51, + "z": 1.85 }, "D10": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 95.38, - "y": 47.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 87, + "y": 42, + "z": 1.85 }, "E10": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 95.38, - "y": 38.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 87, + "y": 33, + "z": 1.85 }, "F10": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 95.38, - "y": 29.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 87, + "y": 24, + "z": 1.85 }, "G10": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 95.38, - "y": 20.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 87, + "y": 15, + "z": 1.85 }, "H10": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 95.38, - "y": 11.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 87, + "y": 6, + "z": 1.85 }, "A11": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 104.38, - "y": 74.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 96, + "y": 69, + "z": 1.85 }, "B11": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 104.38, - "y": 65.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 96, + "y": 60, + "z": 1.85 }, "C11": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 104.38, - "y": 56.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 96, + "y": 51, + "z": 1.85 }, "D11": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 104.38, - "y": 47.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 96, + "y": 42, + "z": 1.85 }, "E11": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 104.38, - "y": 38.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 96, + "y": 33, + "z": 1.85 }, "F11": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 104.38, - "y": 29.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 96, + "y": 24, + "z": 1.85 }, "G11": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 104.38, - "y": 20.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 96, + "y": 15, + "z": 1.85 }, "H11": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 104.38, - "y": 11.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 96, + "y": 6, + "z": 1.85 }, "A12": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 113.38, - "y": 74.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 105, + "y": 69, + "z": 1.85 }, "B12": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 113.38, - "y": 65.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 105, + "y": 60, + "z": 1.85 }, "C12": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 113.38, - "y": 56.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 105, + "y": 51, + "z": 1.85 }, "D12": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 113.38, - "y": 47.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 105, + "y": 42, + "z": 1.85 }, "E12": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 113.38, - "y": 38.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 105, + "y": 33, + "z": 1.85 }, "F12": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 113.38, - "y": 29.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 105, + "y": 24, + "z": 1.85 }, - "G12": { - "depth": 14.95, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.5, - "x": 113.38, - "y": 20.24, - "z": 1.05 + "G12": { + "depth": 12, + "shape": "circular", + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 105, + "y": 15, + "z": 1.85 }, "H12": { - "depth": 14.95, - "totalLiquidVolume": 200, + "depth": 12, "shape": "circular", - "diameter": 5.5, - "x": 113.38, - "y": 11.24, - "z": 1.05 + "diameter": 5.64, + "totalLiquidVolume": 0, + "x": 105, + "y": 6, + "z": 1.85 } }, "groups": [ @@ -2341,9 +2315,65 @@ "H12" ] } - ] + ], + "parameters": { + "format": "96Standard", + "quirks": [], + "isTiprack": false, + "isMagneticModuleCompatible": false, + "loadName": "opentrons_96_pcr_adapter" + }, + "namespace": "opentrons", + "version": 1, + "schemaVersion": 2, + "allowedRoles": ["adapter"], + "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 } + } + } }, - "opentrons/opentrons_96_pcr_adapter/1": { + "opentrons/opentrons_96_wellplate_200ul_pcr_full_skirt/2": { + "namespace": "opentrons", + "version": 2, + "schemaVersion": 2, + "parameters": { + "loadName": "opentrons_96_wellplate_200ul_pcr_full_skirt", + "format": "96Standard", + "isTiprack": false, + "isMagneticModuleCompatible": true + }, + "metadata": { + "displayName": "Opentrons Tough 96 Well Plate 200 µL PCR Full Skirt", + "displayCategory": "wellPlate", + "displayVolumeUnits": "µL", + "tags": [] + }, + "brand": { + "brand": "Opentrons", + "brandId": ["991-00076"], + "links": [ + "https://shop.opentrons.com/tough-0.2-ml-96-well-pcr-plate-full-skirt/" + ] + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 16 + }, + "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 } + }, + "stackingOffsetWithModule": { + "magneticBlockV1": { "x": 0, "y": 0, "z": 3.54 }, + "thermocyclerModuleV2": { "x": 0, "y": 0, "z": 10.7 } + }, + "gripForce": 15, + "gripHeightFromLabwareBottom": 10, "ordering": [ ["A1", "B1", "C1", "D1", "E1", "F1", "G1", "H1"], ["A2", "B2", "C2", "D2", "E2", "F2", "G2", "H2"], @@ -2358,882 +2388,870 @@ ["A11", "B11", "C11", "D11", "E11", "F11", "G11", "H11"], ["A12", "B12", "C12", "D12", "E12", "F12", "G12", "H12"] ], - "brand": { "brand": "Opentrons", "brandId": [] }, - "metadata": { - "displayName": "Opentrons 96 PCR Heater-Shaker Adapter", - "displayCategory": "adapter", - "displayVolumeUnits": "µL", - "tags": [] - }, - "dimensions": { - "xDimension": 111, - "yDimension": 75, - "zDimension": 13.85 - }, "wells": { "A1": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 6, - "y": 69, - "z": 1.85 + "diameter": 5.5, + "x": 14.38, + "y": 74.24, + "z": 1.05 }, "B1": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 6, - "y": 60, - "z": 1.85 + "diameter": 5.5, + "x": 14.38, + "y": 65.24, + "z": 1.05 }, "C1": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 6, - "y": 51, - "z": 1.85 + "diameter": 5.5, + "x": 14.38, + "y": 56.24, + "z": 1.05 }, "D1": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 6, - "y": 42, - "z": 1.85 + "diameter": 5.5, + "x": 14.38, + "y": 47.24, + "z": 1.05 }, "E1": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 6, - "y": 33, - "z": 1.85 + "diameter": 5.5, + "x": 14.38, + "y": 38.24, + "z": 1.05 }, "F1": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 6, - "y": 24, - "z": 1.85 + "diameter": 5.5, + "x": 14.38, + "y": 29.24, + "z": 1.05 }, "G1": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 6, - "y": 15, - "z": 1.85 + "diameter": 5.5, + "x": 14.38, + "y": 20.24, + "z": 1.05 }, "H1": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 6, - "y": 6, - "z": 1.85 + "diameter": 5.5, + "x": 14.38, + "y": 11.24, + "z": 1.05 }, "A2": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 15, - "y": 69, - "z": 1.85 + "diameter": 5.5, + "x": 23.38, + "y": 74.24, + "z": 1.05 }, "B2": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 15, - "y": 60, - "z": 1.85 + "diameter": 5.5, + "x": 23.38, + "y": 65.24, + "z": 1.05 }, "C2": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 15, - "y": 51, - "z": 1.85 + "diameter": 5.5, + "x": 23.38, + "y": 56.24, + "z": 1.05 }, "D2": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 15, - "y": 42, - "z": 1.85 + "diameter": 5.5, + "x": 23.38, + "y": 47.24, + "z": 1.05 }, "E2": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 15, - "y": 33, - "z": 1.85 + "diameter": 5.5, + "x": 23.38, + "y": 38.24, + "z": 1.05 }, - "F2": { - "depth": 12, - "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 15, - "y": 24, - "z": 1.85 + "F2": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 23.38, + "y": 29.24, + "z": 1.05 }, "G2": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 15, - "y": 15, - "z": 1.85 + "diameter": 5.5, + "x": 23.38, + "y": 20.24, + "z": 1.05 }, "H2": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 15, - "y": 6, - "z": 1.85 + "diameter": 5.5, + "x": 23.38, + "y": 11.24, + "z": 1.05 }, "A3": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 24, - "y": 69, - "z": 1.85 + "diameter": 5.5, + "x": 32.38, + "y": 74.24, + "z": 1.05 }, "B3": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 24, - "y": 60, - "z": 1.85 + "diameter": 5.5, + "x": 32.38, + "y": 65.24, + "z": 1.05 }, "C3": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 24, - "y": 51, - "z": 1.85 + "diameter": 5.5, + "x": 32.38, + "y": 56.24, + "z": 1.05 }, "D3": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 24, - "y": 42, - "z": 1.85 + "diameter": 5.5, + "x": 32.38, + "y": 47.24, + "z": 1.05 }, "E3": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 24, - "y": 33, - "z": 1.85 + "diameter": 5.5, + "x": 32.38, + "y": 38.24, + "z": 1.05 }, "F3": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 24, - "y": 24, - "z": 1.85 + "diameter": 5.5, + "x": 32.38, + "y": 29.24, + "z": 1.05 }, "G3": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 24, - "y": 15, - "z": 1.85 + "diameter": 5.5, + "x": 32.38, + "y": 20.24, + "z": 1.05 }, "H3": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 24, - "y": 6, - "z": 1.85 + "diameter": 5.5, + "x": 32.38, + "y": 11.24, + "z": 1.05 }, "A4": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 33, - "y": 69, - "z": 1.85 + "diameter": 5.5, + "x": 41.38, + "y": 74.24, + "z": 1.05 }, "B4": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 33, - "y": 60, - "z": 1.85 + "diameter": 5.5, + "x": 41.38, + "y": 65.24, + "z": 1.05 }, "C4": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 33, - "y": 51, - "z": 1.85 + "diameter": 5.5, + "x": 41.38, + "y": 56.24, + "z": 1.05 }, "D4": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 33, - "y": 42, - "z": 1.85 + "diameter": 5.5, + "x": 41.38, + "y": 47.24, + "z": 1.05 }, "E4": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 33, - "y": 33, - "z": 1.85 + "diameter": 5.5, + "x": 41.38, + "y": 38.24, + "z": 1.05 }, "F4": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 33, - "y": 24, - "z": 1.85 + "diameter": 5.5, + "x": 41.38, + "y": 29.24, + "z": 1.05 }, "G4": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 33, - "y": 15, - "z": 1.85 + "diameter": 5.5, + "x": 41.38, + "y": 20.24, + "z": 1.05 }, "H4": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 33, - "y": 6, - "z": 1.85 + "diameter": 5.5, + "x": 41.38, + "y": 11.24, + "z": 1.05 }, "A5": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 42, - "y": 69, - "z": 1.85 + "diameter": 5.5, + "x": 50.38, + "y": 74.24, + "z": 1.05 }, "B5": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 42, - "y": 60, - "z": 1.85 + "diameter": 5.5, + "x": 50.38, + "y": 65.24, + "z": 1.05 }, - "C5": { - "depth": 12, - "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 42, - "y": 51, - "z": 1.85 + "C5": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 50.38, + "y": 56.24, + "z": 1.05 }, "D5": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 42, - "y": 42, - "z": 1.85 + "diameter": 5.5, + "x": 50.38, + "y": 47.24, + "z": 1.05 }, "E5": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 42, - "y": 33, - "z": 1.85 + "diameter": 5.5, + "x": 50.38, + "y": 38.24, + "z": 1.05 }, "F5": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 42, - "y": 24, - "z": 1.85 + "diameter": 5.5, + "x": 50.38, + "y": 29.24, + "z": 1.05 }, "G5": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 42, - "y": 15, - "z": 1.85 + "diameter": 5.5, + "x": 50.38, + "y": 20.24, + "z": 1.05 }, "H5": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 42, - "y": 6, - "z": 1.85 + "diameter": 5.5, + "x": 50.38, + "y": 11.24, + "z": 1.05 }, "A6": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 51, - "y": 69, - "z": 1.85 + "diameter": 5.5, + "x": 59.38, + "y": 74.24, + "z": 1.05 }, "B6": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 51, - "y": 60, - "z": 1.85 + "diameter": 5.5, + "x": 59.38, + "y": 65.24, + "z": 1.05 }, "C6": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 51, - "y": 51, - "z": 1.85 + "diameter": 5.5, + "x": 59.38, + "y": 56.24, + "z": 1.05 }, "D6": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 51, - "y": 42, - "z": 1.85 + "diameter": 5.5, + "x": 59.38, + "y": 47.24, + "z": 1.05 }, "E6": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 51, - "y": 33, - "z": 1.85 + "diameter": 5.5, + "x": 59.38, + "y": 38.24, + "z": 1.05 }, "F6": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 51, - "y": 24, - "z": 1.85 + "diameter": 5.5, + "x": 59.38, + "y": 29.24, + "z": 1.05 }, "G6": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 51, - "y": 15, - "z": 1.85 + "diameter": 5.5, + "x": 59.38, + "y": 20.24, + "z": 1.05 }, "H6": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 51, - "y": 6, - "z": 1.85 + "diameter": 5.5, + "x": 59.38, + "y": 11.24, + "z": 1.05 }, "A7": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 60, - "y": 69, - "z": 1.85 + "diameter": 5.5, + "x": 68.38, + "y": 74.24, + "z": 1.05 }, "B7": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 60, - "y": 60, - "z": 1.85 + "diameter": 5.5, + "x": 68.38, + "y": 65.24, + "z": 1.05 }, "C7": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 60, - "y": 51, - "z": 1.85 + "diameter": 5.5, + "x": 68.38, + "y": 56.24, + "z": 1.05 }, "D7": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 60, - "y": 42, - "z": 1.85 + "diameter": 5.5, + "x": 68.38, + "y": 47.24, + "z": 1.05 }, "E7": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 60, - "y": 33, - "z": 1.85 + "diameter": 5.5, + "x": 68.38, + "y": 38.24, + "z": 1.05 }, "F7": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 60, - "y": 24, - "z": 1.85 + "diameter": 5.5, + "x": 68.38, + "y": 29.24, + "z": 1.05 }, "G7": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 60, - "y": 15, - "z": 1.85 + "diameter": 5.5, + "x": 68.38, + "y": 20.24, + "z": 1.05 }, - "H7": { - "depth": 12, - "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 60, - "y": 6, - "z": 1.85 + "H7": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 68.38, + "y": 11.24, + "z": 1.05 }, "A8": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 69, - "y": 69, - "z": 1.85 + "diameter": 5.5, + "x": 77.38, + "y": 74.24, + "z": 1.05 }, "B8": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 69, - "y": 60, - "z": 1.85 + "diameter": 5.5, + "x": 77.38, + "y": 65.24, + "z": 1.05 }, "C8": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 69, - "y": 51, - "z": 1.85 + "diameter": 5.5, + "x": 77.38, + "y": 56.24, + "z": 1.05 }, "D8": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 69, - "y": 42, - "z": 1.85 + "diameter": 5.5, + "x": 77.38, + "y": 47.24, + "z": 1.05 }, "E8": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 69, - "y": 33, - "z": 1.85 + "diameter": 5.5, + "x": 77.38, + "y": 38.24, + "z": 1.05 }, "F8": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 69, - "y": 24, - "z": 1.85 + "diameter": 5.5, + "x": 77.38, + "y": 29.24, + "z": 1.05 }, "G8": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 69, - "y": 15, - "z": 1.85 + "diameter": 5.5, + "x": 77.38, + "y": 20.24, + "z": 1.05 }, "H8": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 69, - "y": 6, - "z": 1.85 + "diameter": 5.5, + "x": 77.38, + "y": 11.24, + "z": 1.05 }, "A9": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 78, - "y": 69, - "z": 1.85 + "diameter": 5.5, + "x": 86.38, + "y": 74.24, + "z": 1.05 }, "B9": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 78, - "y": 60, - "z": 1.85 + "diameter": 5.5, + "x": 86.38, + "y": 65.24, + "z": 1.05 }, "C9": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 78, - "y": 51, - "z": 1.85 + "diameter": 5.5, + "x": 86.38, + "y": 56.24, + "z": 1.05 }, "D9": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 78, - "y": 42, - "z": 1.85 + "diameter": 5.5, + "x": 86.38, + "y": 47.24, + "z": 1.05 }, "E9": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 78, - "y": 33, - "z": 1.85 + "diameter": 5.5, + "x": 86.38, + "y": 38.24, + "z": 1.05 }, "F9": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 78, - "y": 24, - "z": 1.85 + "diameter": 5.5, + "x": 86.38, + "y": 29.24, + "z": 1.05 }, "G9": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 78, - "y": 15, - "z": 1.85 + "diameter": 5.5, + "x": 86.38, + "y": 20.24, + "z": 1.05 }, "H9": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 78, - "y": 6, - "z": 1.85 + "diameter": 5.5, + "x": 86.38, + "y": 11.24, + "z": 1.05 }, "A10": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 87, - "y": 69, - "z": 1.85 + "diameter": 5.5, + "x": 95.38, + "y": 74.24, + "z": 1.05 }, "B10": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 87, - "y": 60, - "z": 1.85 + "diameter": 5.5, + "x": 95.38, + "y": 65.24, + "z": 1.05 }, "C10": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 87, - "y": 51, - "z": 1.85 + "diameter": 5.5, + "x": 95.38, + "y": 56.24, + "z": 1.05 }, "D10": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 87, - "y": 42, - "z": 1.85 + "diameter": 5.5, + "x": 95.38, + "y": 47.24, + "z": 1.05 }, - "E10": { - "depth": 12, - "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 87, - "y": 33, - "z": 1.85 + "E10": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 95.38, + "y": 38.24, + "z": 1.05 }, "F10": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 87, - "y": 24, - "z": 1.85 + "diameter": 5.5, + "x": 95.38, + "y": 29.24, + "z": 1.05 }, "G10": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 87, - "y": 15, - "z": 1.85 + "diameter": 5.5, + "x": 95.38, + "y": 20.24, + "z": 1.05 }, "H10": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 87, - "y": 6, - "z": 1.85 + "diameter": 5.5, + "x": 95.38, + "y": 11.24, + "z": 1.05 }, "A11": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 96, - "y": 69, - "z": 1.85 + "diameter": 5.5, + "x": 104.38, + "y": 74.24, + "z": 1.05 }, "B11": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 96, - "y": 60, - "z": 1.85 + "diameter": 5.5, + "x": 104.38, + "y": 65.24, + "z": 1.05 }, "C11": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 96, - "y": 51, - "z": 1.85 + "diameter": 5.5, + "x": 104.38, + "y": 56.24, + "z": 1.05 }, "D11": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 96, - "y": 42, - "z": 1.85 + "diameter": 5.5, + "x": 104.38, + "y": 47.24, + "z": 1.05 }, "E11": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 96, - "y": 33, - "z": 1.85 + "diameter": 5.5, + "x": 104.38, + "y": 38.24, + "z": 1.05 }, "F11": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 96, - "y": 24, - "z": 1.85 + "diameter": 5.5, + "x": 104.38, + "y": 29.24, + "z": 1.05 }, "G11": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 96, - "y": 15, - "z": 1.85 + "diameter": 5.5, + "x": 104.38, + "y": 20.24, + "z": 1.05 }, "H11": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 96, - "y": 6, - "z": 1.85 + "diameter": 5.5, + "x": 104.38, + "y": 11.24, + "z": 1.05 }, "A12": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 105, - "y": 69, - "z": 1.85 + "diameter": 5.5, + "x": 113.38, + "y": 74.24, + "z": 1.05 }, "B12": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 105, - "y": 60, - "z": 1.85 + "diameter": 5.5, + "x": 113.38, + "y": 65.24, + "z": 1.05 }, "C12": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 105, - "y": 51, - "z": 1.85 + "diameter": 5.5, + "x": 113.38, + "y": 56.24, + "z": 1.05 }, "D12": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 105, - "y": 42, - "z": 1.85 + "diameter": 5.5, + "x": 113.38, + "y": 47.24, + "z": 1.05 }, "E12": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 105, - "y": 33, - "z": 1.85 + "diameter": 5.5, + "x": 113.38, + "y": 38.24, + "z": 1.05 }, "F12": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 105, - "y": 24, - "z": 1.85 + "diameter": 5.5, + "x": 113.38, + "y": 29.24, + "z": 1.05 }, "G12": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 105, - "y": 15, - "z": 1.85 + "diameter": 5.5, + "x": 113.38, + "y": 20.24, + "z": 1.05 }, "H12": { - "depth": 12, + "depth": 14.95, + "totalLiquidVolume": 200, "shape": "circular", - "diameter": 5.64, - "totalLiquidVolume": 0, - "x": 105, - "y": 6, - "z": 1.85 + "diameter": 5.5, + "x": 113.38, + "y": 11.24, + "z": 1.05 } }, "groups": [ @@ -3338,25 +3356,7 @@ "H12" ] } - ], - "parameters": { - "format": "96Standard", - "quirks": [], - "isTiprack": false, - "isMagneticModuleCompatible": false, - "loadName": "opentrons_96_pcr_adapter" - }, - "namespace": "opentrons", - "version": 1, - "schemaVersion": 2, - "allowedRoles": ["adapter"], - "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 } - } - } + ] }, "opentrons/axygen_1_reservoir_90ml/1": { "ordering": [["A1"]], @@ -3418,7 +3418,7 @@ "commandSchemaId": "opentronsCommandSchemaV8", "commands": [ { - "key": "218e9dfc-6036-4b3a-961a-6ae1b15a6a9e", + "key": "1809fd39-db28-4928-8773-31bc536fe765", "commandType": "loadPipette", "params": { "pipetteName": "p1000_single_flex", @@ -3427,7 +3427,7 @@ } }, { - "key": "85f93f33-67e9-41f6-b749-3d10d20c3c46", + "key": "3a5f75b2-15c9-404f-9b87-f102beeb1a45", "commandType": "loadModule", "params": { "model": "heaterShakerModuleV1", @@ -3436,7 +3436,7 @@ } }, { - "key": "3d216d80-8112-4c67-8bf7-c5901f490ac4", + "key": "a13ba2f1-e557-4d2f-a304-87847ce68887", "commandType": "loadModule", "params": { "model": "thermocyclerModuleV2", @@ -3445,7 +3445,7 @@ } }, { - "key": "3dd786db-df11-4fc4-8277-8e65c8894d4a", + "key": "e3f1abb9-b076-4b56-a593-0b4033462fea", "commandType": "loadLabware", "params": { "displayName": "Opentrons 96 PCR Heater-Shaker Adapter", @@ -3459,7 +3459,7 @@ } }, { - "key": "ff711b8d-7a74-442e-8972-e287581c59d1", + "key": "9d92792f-e5d1-4259-8e4b-da8ea83f28df", "commandType": "loadLabware", "params": { "displayName": "Opentrons Flex 96 Tip Rack 1000 µL", @@ -3471,7 +3471,7 @@ } }, { - "key": "9e62c4ba-dcbb-47b5-9d75-cc8afa7bcb59", + "key": "d03df580-7915-4bba-9d34-e92039cfe24d", "commandType": "loadLabware", "params": { "displayName": "Opentrons Tough 96 Well Plate 200 µL PCR Full Skirt", @@ -3485,7 +3485,7 @@ } }, { - "key": "7f5ab1f3-9bd0-475f-b352-280d8ffb1404", + "key": "d1e4cf27-a1db-48c4-b784-a21014bb234b", "commandType": "loadLabware", "params": { "displayName": "Axygen 1 Well Reservoir 90 mL", @@ -3498,7 +3498,7 @@ }, { "commandType": "loadLiquid", - "key": "fab47ab6-bff7-4667-a3b3-d04d63733660", + "key": "64129bfd-92d7-4c70-9380-33785a6041ff", "params": { "liquidId": "1", "labwareId": "54370838-4fca-4a14-b88a-7840e4903649:opentrons/opentrons_96_wellplate_200ul_pcr_full_skirt/2", @@ -3516,7 +3516,7 @@ }, { "commandType": "loadLiquid", - "key": "a704c87c-ccfc-46c5-a64b-ab1ccd46037c", + "key": "ac47f11d-0d9c-48d7-b45b-9ecb269a9a50", "params": { "liquidId": "0", "labwareId": "8bacda22-9e05-45e8-bef4-cc04414a204f:opentrons/axygen_1_reservoir_90ml/1", @@ -3525,14 +3525,14 @@ }, { "commandType": "thermocycler/openLid", - "key": "c6789048-a5d9-44c1-a575-e00eeab7f133", + "key": "bfa8af0c-4cb2-49d3-912b-b07e90a1f752", "params": { "moduleId": "fd6da9f1-d63b-414b-929e-c646b64790e9:thermocyclerModuleType" } }, { "commandType": "moveLabware", - "key": "3b30a344-59d2-4560-af7f-e522c4c20a1a", + "key": "a991e2d5-5be6-43b1-9a71-2f229aea392f", "params": { "labwareId": "8bacda22-9e05-45e8-bef4-cc04414a204f:opentrons/axygen_1_reservoir_90ml/1", "strategy": "usingGripper", @@ -3541,7 +3541,7 @@ }, { "commandType": "pickUpTip", - "key": "976ffeb8-1715-422c-b51a-b6cc907af6f2", + "key": "55826f7b-111e-4768-a6d3-d0a4c4a5e20d", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "labwareId": "f2d371ea-5146-4c89-8200-9c056a7f321a:opentrons/opentrons_flex_96_tiprack_1000ul/1", @@ -3550,31 +3550,31 @@ }, { "commandType": "aspirate", - "key": "d37a1d88-bf7f-4cc0-9830-e43d8e64f05c", + "key": "bb5688fe-2909-4755-be74-1850d4d05735", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, "labwareId": "8bacda22-9e05-45e8-bef4-cc04414a204f:opentrons/axygen_1_reservoir_90ml/1", "wellName": "A1", "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, - "flowRate": 478 + "flowRate": 160 } }, { "commandType": "dispense", - "key": "3d2356d5-d7eb-43c9-b2be-bf4a16e600d5", + "key": "33f7aa0b-80e4-41f0-a841-d8aacb4c7f32", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, "labwareId": "54370838-4fca-4a14-b88a-7840e4903649:opentrons/opentrons_96_wellplate_200ul_pcr_full_skirt/2", "wellName": "A1", "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, - "flowRate": 478 + "flowRate": 160 } }, { "commandType": "moveToAddressableArea", - "key": "d18252a3-48cd-4a17-b2ba-27c504564480", + "key": "650a3b63-379d-4327-ae55-9752d04497ab", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "addressableAreaName": "1ChannelWasteChute", @@ -3583,12 +3583,12 @@ }, { "commandType": "dropTipInPlace", - "key": "08fc3f60-be44-4bf7-a571-1248a40bf8cf", + "key": "40c51d0f-5a80-4355-91c1-aaaba7489f37", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc" } }, { "commandType": "pickUpTip", - "key": "fa26bd0f-0719-4dfb-a905-bb3c01a2642a", + "key": "006d7584-e3ad-43a9-8fa1-0688f1d74304", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "labwareId": "f2d371ea-5146-4c89-8200-9c056a7f321a:opentrons/opentrons_flex_96_tiprack_1000ul/1", @@ -3597,31 +3597,31 @@ }, { "commandType": "aspirate", - "key": "4d817f29-2049-4cb4-b8d7-230cd34c8ab8", + "key": "562c0ad9-1f97-4e74-af40-107e12019e41", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, "labwareId": "8bacda22-9e05-45e8-bef4-cc04414a204f:opentrons/axygen_1_reservoir_90ml/1", "wellName": "A1", "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, - "flowRate": 478 + "flowRate": 160 } }, { "commandType": "dispense", - "key": "eba62a93-d957-4d07-b24d-75833d332f54", + "key": "cbd55dd4-a746-4bf5-bf43-73afd95ebff2", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, "labwareId": "54370838-4fca-4a14-b88a-7840e4903649:opentrons/opentrons_96_wellplate_200ul_pcr_full_skirt/2", "wellName": "B1", "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, - "flowRate": 478 + "flowRate": 160 } }, { "commandType": "moveToAddressableArea", - "key": "e77ae2f7-62c1-4d4d-8953-007eabd265f7", + "key": "1bac0a50-7a55-4abe-905c-547f006fd62c", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "addressableAreaName": "1ChannelWasteChute", @@ -3630,12 +3630,12 @@ }, { "commandType": "dropTipInPlace", - "key": "3ecd1919-5454-4cd1-8d30-5546ee63dc34", + "key": "480d48a6-b825-406a-bc6c-b95b457a1eba", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc" } }, { "commandType": "pickUpTip", - "key": "1384b97f-7ef2-4c32-8190-5a5bf77bcba5", + "key": "aed7d916-7957-4608-8678-895cd03f2bb8", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "labwareId": "f2d371ea-5146-4c89-8200-9c056a7f321a:opentrons/opentrons_flex_96_tiprack_1000ul/1", @@ -3644,31 +3644,31 @@ }, { "commandType": "aspirate", - "key": "341c9cc2-a8cf-4931-8eb8-e17611aed279", + "key": "6c2a45d8-449f-4d46-858d-01c349ec7481", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, "labwareId": "8bacda22-9e05-45e8-bef4-cc04414a204f:opentrons/axygen_1_reservoir_90ml/1", "wellName": "A1", "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, - "flowRate": 478 + "flowRate": 160 } }, { "commandType": "dispense", - "key": "234cd6e1-b13e-44cf-ac6f-42d6d93431c2", + "key": "2259e5af-9e35-45bc-b869-105e0d6bda3e", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, "labwareId": "54370838-4fca-4a14-b88a-7840e4903649:opentrons/opentrons_96_wellplate_200ul_pcr_full_skirt/2", "wellName": "C1", "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, - "flowRate": 478 + "flowRate": 160 } }, { "commandType": "moveToAddressableArea", - "key": "752b7cd9-8e26-48dd-92ea-25b27d3f1148", + "key": "4422ed17-8cf6-47f4-b945-352f17a81fb0", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "addressableAreaName": "1ChannelWasteChute", @@ -3677,12 +3677,12 @@ }, { "commandType": "dropTipInPlace", - "key": "bf749183-a4d7-4b50-88e5-0dbc707a776d", + "key": "33bf2ffd-b472-4d01-a063-e6d78cd10f6e", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc" } }, { "commandType": "pickUpTip", - "key": "db84e3d5-cb2c-4405-9d29-de07bf2baadf", + "key": "0b9fe44a-1d94-48ed-9d52-058fb8639425", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "labwareId": "f2d371ea-5146-4c89-8200-9c056a7f321a:opentrons/opentrons_flex_96_tiprack_1000ul/1", @@ -3691,31 +3691,31 @@ }, { "commandType": "aspirate", - "key": "ae2ed07d-1d95-4744-80d2-f8c93312b616", + "key": "d617d4ec-ae3c-4517-acea-7ff57af655ef", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, "labwareId": "8bacda22-9e05-45e8-bef4-cc04414a204f:opentrons/axygen_1_reservoir_90ml/1", "wellName": "A1", "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, - "flowRate": 478 + "flowRate": 160 } }, { "commandType": "dispense", - "key": "d02ffda4-bfed-49ac-81d9-5033cbd096f9", + "key": "99bf9993-2553-4adc-9131-be9fe370b9df", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, "labwareId": "54370838-4fca-4a14-b88a-7840e4903649:opentrons/opentrons_96_wellplate_200ul_pcr_full_skirt/2", "wellName": "D1", "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, - "flowRate": 478 + "flowRate": 160 } }, { "commandType": "moveToAddressableArea", - "key": "4e9250c8-60e5-419c-b5a2-2932f72e81a3", + "key": "4f05b8d1-319d-40b5-a006-31a41ad5742f", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "addressableAreaName": "1ChannelWasteChute", @@ -3724,12 +3724,12 @@ }, { "commandType": "dropTipInPlace", - "key": "5c2756b1-7c96-4884-a76e-b7d5597b41af", + "key": "8faee0ed-2458-45d7-b09f-8021317417cd", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc" } }, { "commandType": "pickUpTip", - "key": "24063ff4-bde0-43ea-af16-da70772ed83b", + "key": "bf3176ac-63db-4218-8042-d5683092a66d", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "labwareId": "f2d371ea-5146-4c89-8200-9c056a7f321a:opentrons/opentrons_flex_96_tiprack_1000ul/1", @@ -3738,31 +3738,31 @@ }, { "commandType": "aspirate", - "key": "92d4f69c-67c1-4a25-8e6d-9a73ac52f1ec", + "key": "fbea3f6f-0421-428a-bf21-6cda35b30407", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, "labwareId": "8bacda22-9e05-45e8-bef4-cc04414a204f:opentrons/axygen_1_reservoir_90ml/1", "wellName": "A1", "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, - "flowRate": 478 + "flowRate": 160 } }, { "commandType": "dispense", - "key": "c01962df-98e3-4889-b243-bf1e00ed59cb", + "key": "fedd8c6f-777b-4913-afd9-63c919394a5c", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, "labwareId": "54370838-4fca-4a14-b88a-7840e4903649:opentrons/opentrons_96_wellplate_200ul_pcr_full_skirt/2", "wellName": "E1", "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, - "flowRate": 478 + "flowRate": 160 } }, { "commandType": "moveToAddressableArea", - "key": "8cc3f36e-29b9-4347-ab7b-6916b11761c3", + "key": "a1934186-6d8b-4fdf-b17a-8f9e93f63417", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "addressableAreaName": "1ChannelWasteChute", @@ -3771,12 +3771,12 @@ }, { "commandType": "dropTipInPlace", - "key": "f9100143-c9de-436c-a1c4-9f241b48f28d", + "key": "4fb7ea89-471a-47c4-8af8-0a6bfdae1d74", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc" } }, { "commandType": "pickUpTip", - "key": "863d42f2-671f-437a-81d9-76b73bd0d403", + "key": "f66afc4e-9476-4ca4-9cdc-a66257031413", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "labwareId": "f2d371ea-5146-4c89-8200-9c056a7f321a:opentrons/opentrons_flex_96_tiprack_1000ul/1", @@ -3785,31 +3785,31 @@ }, { "commandType": "aspirate", - "key": "eb86e6c1-9f07-4809-a9b4-3424c65d4a0d", + "key": "a629a9e7-e34f-4693-8479-3cb27d44d0b6", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, "labwareId": "8bacda22-9e05-45e8-bef4-cc04414a204f:opentrons/axygen_1_reservoir_90ml/1", "wellName": "A1", "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, - "flowRate": 478 + "flowRate": 160 } }, { "commandType": "dispense", - "key": "63963156-9749-469f-9fef-2dd101164b33", + "key": "f831d4dd-c2c2-4429-9314-2fbef18546d6", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, "labwareId": "54370838-4fca-4a14-b88a-7840e4903649:opentrons/opentrons_96_wellplate_200ul_pcr_full_skirt/2", "wellName": "F1", "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, - "flowRate": 478 + "flowRate": 160 } }, { "commandType": "moveToAddressableArea", - "key": "46453561-dc88-426b-9c19-d9b27a902a50", + "key": "e05ddba8-7f1b-45a6-a8d9-9de8b01146bc", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "addressableAreaName": "1ChannelWasteChute", @@ -3818,12 +3818,12 @@ }, { "commandType": "dropTipInPlace", - "key": "2ac1c8e2-f789-40cb-912b-bb5b77bcf0f6", + "key": "059f01dc-eb9f-4cfd-92cf-0b67113e4c2d", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc" } }, { "commandType": "pickUpTip", - "key": "8e79d987-6b4c-4de7-a34f-47022b814420", + "key": "2d85f593-c882-45b2-89ec-f3bd9cd7c645", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "labwareId": "f2d371ea-5146-4c89-8200-9c056a7f321a:opentrons/opentrons_flex_96_tiprack_1000ul/1", @@ -3832,31 +3832,31 @@ }, { "commandType": "aspirate", - "key": "24ecca70-7452-4721-a1a1-6be942e89cfb", + "key": "860d1800-6f8d-46d6-a939-81569e9641fc", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, "labwareId": "8bacda22-9e05-45e8-bef4-cc04414a204f:opentrons/axygen_1_reservoir_90ml/1", "wellName": "A1", "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, - "flowRate": 478 + "flowRate": 160 } }, { "commandType": "dispense", - "key": "d1264dba-ccac-492b-aaba-e575d35c2aec", + "key": "1d9ef0b0-926e-446c-b0df-c57dfc97f34e", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, "labwareId": "54370838-4fca-4a14-b88a-7840e4903649:opentrons/opentrons_96_wellplate_200ul_pcr_full_skirt/2", "wellName": "G1", "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, - "flowRate": 478 + "flowRate": 160 } }, { "commandType": "moveToAddressableArea", - "key": "108f9a39-3f10-474b-a86b-4dca765c3c61", + "key": "c2954781-c45e-46ff-a8fa-36faea77630c", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "addressableAreaName": "1ChannelWasteChute", @@ -3865,12 +3865,12 @@ }, { "commandType": "dropTipInPlace", - "key": "0ded1139-533a-4590-b520-871ba41c5e8b", + "key": "05db8e46-e6c4-4039-84ca-cf7a11042eb9", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc" } }, { "commandType": "pickUpTip", - "key": "b4ca24ff-2448-481b-ba2c-052a98f47204", + "key": "2cbabc82-4412-4bc5-a7d2-12b74b39b641", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "labwareId": "f2d371ea-5146-4c89-8200-9c056a7f321a:opentrons/opentrons_flex_96_tiprack_1000ul/1", @@ -3879,31 +3879,31 @@ }, { "commandType": "aspirate", - "key": "070b74b2-ef42-42a3-98c9-394f0f31903b", + "key": "9f9e94a0-4a33-441c-8864-e64f9a0fda07", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, "labwareId": "8bacda22-9e05-45e8-bef4-cc04414a204f:opentrons/axygen_1_reservoir_90ml/1", "wellName": "A1", "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, - "flowRate": 478 + "flowRate": 160 } }, { "commandType": "dispense", - "key": "0dcfa1ff-2feb-4deb-a1a0-aeda9d1479ba", + "key": "d2144ca8-ca39-484a-a8a0-9c70e613be8a", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, "labwareId": "54370838-4fca-4a14-b88a-7840e4903649:opentrons/opentrons_96_wellplate_200ul_pcr_full_skirt/2", "wellName": "H1", "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, - "flowRate": 478 + "flowRate": 160 } }, { "commandType": "moveToAddressableArea", - "key": "66e18af3-14c4-429a-9045-b38f7579d3dd", + "key": "e8f7d982-7346-4e25-81b1-98e0412553d2", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "addressableAreaName": "1ChannelWasteChute", @@ -3912,19 +3912,19 @@ }, { "commandType": "dropTipInPlace", - "key": "0a6aa502-9f2a-4a39-8e4c-a980e480a8f3", + "key": "880baa31-8fdb-4e11-9183-d90052fca1e2", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc" } }, { "commandType": "thermocycler/closeLid", - "key": "e38a94f4-30f7-4528-8508-1c1be5ab9c36", + "key": "e1c31c80-51e8-47db-be63-29d861843b56", "params": { "moduleId": "fd6da9f1-d63b-414b-929e-c646b64790e9:thermocyclerModuleType" } }, { "commandType": "thermocycler/setTargetBlockTemperature", - "key": "1f08bd29-4750-4713-961b-9a2dbebcd001", + "key": "ae59fc04-b753-482e-87f0-8680cdccb6c4", "params": { "moduleId": "fd6da9f1-d63b-414b-929e-c646b64790e9:thermocyclerModuleType", "celsius": 40 @@ -3932,47 +3932,47 @@ }, { "commandType": "thermocycler/waitForBlockTemperature", - "key": "b9c5d3b4-51a7-4cfe-99db-9c3b83c79230", + "key": "66261c91-97d7-4170-b2f6-462ad85b660e", "params": { "moduleId": "fd6da9f1-d63b-414b-929e-c646b64790e9:thermocyclerModuleType" } }, { "commandType": "waitForDuration", - "key": "9a0ac176-868d-4f0f-8b23-6ae031f2b681", + "key": "d09638c2-a49c-4b38-b22f-d581fb68feca", "params": { "seconds": 60, "message": "" } }, { "commandType": "thermocycler/openLid", - "key": "bee91ff3-8a69-4c9b-8ef5-9dbbdbb0411a", + "key": "b5017439-7aa1-483a-a475-3b03ce1a4505", "params": { "moduleId": "fd6da9f1-d63b-414b-929e-c646b64790e9:thermocyclerModuleType" } }, { "commandType": "thermocycler/deactivateBlock", - "key": "8c2743c1-6597-4522-946c-561f8d9b25ef", + "key": "b9e78735-3881-4493-82cb-4bd628bd288d", "params": { "moduleId": "fd6da9f1-d63b-414b-929e-c646b64790e9:thermocyclerModuleType" } }, { "commandType": "heaterShaker/deactivateHeater", - "key": "ecf793ae-ff88-4612-a634-e1313331f4df", + "key": "af91feaf-c12a-4059-abbf-91d33820a1c0", "params": { "moduleId": "23347241-80bb-4a7e-9c91-5d9727a9e483:heaterShakerModuleType" } }, { "commandType": "heaterShaker/openLabwareLatch", - "key": "1283880b-1d8e-4810-be5c-8ced5c0110b1", + "key": "7a7352ad-9879-4b2e-bc48-540ac0b2ad3b", "params": { "moduleId": "23347241-80bb-4a7e-9c91-5d9727a9e483:heaterShakerModuleType" } }, { "commandType": "moveLabware", - "key": "0a818fa8-2db8-4d26-b02c-1e44963c3946", + "key": "a2fe52a9-4acf-4599-afc3-5ed26bd579a8", "params": { "labwareId": "54370838-4fca-4a14-b88a-7840e4903649:opentrons/opentrons_96_wellplate_200ul_pcr_full_skirt/2", "strategy": "usingGripper", @@ -3983,21 +3983,21 @@ }, { "commandType": "heaterShaker/closeLabwareLatch", - "key": "aec0cc18-96d5-40cd-8e0b-8cd228f2e009", + "key": "b057b4d6-57ae-4443-b798-2e6d9103c2e5", "params": { "moduleId": "23347241-80bb-4a7e-9c91-5d9727a9e483:heaterShakerModuleType" } }, { "commandType": "heaterShaker/deactivateHeater", - "key": "a82263b7-2b77-46c6-844f-4bcf17af7dbe", + "key": "cb6fba71-dfd4-468b-a351-22279bfad1c1", "params": { "moduleId": "23347241-80bb-4a7e-9c91-5d9727a9e483:heaterShakerModuleType" } }, { "commandType": "heaterShaker/setAndWaitForShakeSpeed", - "key": "d284c43a-acfe-4184-a7e4-3c936b770acf", + "key": "a8c7211e-11f9-41e2-b977-68b513a2db5d", "params": { "moduleId": "23347241-80bb-4a7e-9c91-5d9727a9e483:heaterShakerModuleType", "rpm": 200 @@ -4005,40 +4005,40 @@ }, { "commandType": "waitForDuration", - "key": "017afd08-4027-4747-b280-0b0e8966ea6c", + "key": "91be8718-5404-496e-957d-011a33f9cfe0", "params": { "seconds": 60 } }, { "commandType": "heaterShaker/deactivateShaker", - "key": "93bd7cc3-d33c-492d-9044-670ea4ab74aa", + "key": "11592571-7419-4880-b987-ace8edf90b8a", "params": { "moduleId": "23347241-80bb-4a7e-9c91-5d9727a9e483:heaterShakerModuleType" } }, { "commandType": "heaterShaker/deactivateHeater", - "key": "3a2642df-3e88-46c8-ade5-191d3a44c07a", + "key": "3da43478-0315-4c19-aaf2-087b174e1ecf", "params": { "moduleId": "23347241-80bb-4a7e-9c91-5d9727a9e483:heaterShakerModuleType" } }, { "commandType": "heaterShaker/deactivateHeater", - "key": "f09129ff-e21d-4c8f-a07f-e037d67a5e07", + "key": "7038cc9a-87e9-4554-a69d-3828d1cf9273", "params": { "moduleId": "23347241-80bb-4a7e-9c91-5d9727a9e483:heaterShakerModuleType" } }, { "commandType": "heaterShaker/openLabwareLatch", - "key": "352c3f4d-6467-4f6a-80b5-4a424f4bce71", + "key": "4a2c5d7f-31c0-40ff-ab77-b5eb167f4008", "params": { "moduleId": "23347241-80bb-4a7e-9c91-5d9727a9e483:heaterShakerModuleType" } }, { "commandType": "moveLabware", - "key": "841d359f-6b6a-4c0a-817c-c0dafc2b4c30", + "key": "b2f3676b-da1a-411e-b106-fc761a5ce11b", "params": { "labwareId": "54370838-4fca-4a14-b88a-7840e4903649:opentrons/opentrons_96_wellplate_200ul_pcr_full_skirt/2", "strategy": "usingGripper", @@ -4047,7 +4047,7 @@ }, { "commandType": "moveLabware", - "key": "ed6a526a-4237-4f52-b3fd-b0506d25455f", + "key": "f76dccda-5917-48cf-97eb-efd0ae2138f2", "params": { "labwareId": "f2d371ea-5146-4c89-8200-9c056a7f321a:opentrons/opentrons_flex_96_tiprack_1000ul/1", "strategy": "usingGripper", diff --git a/protocol-designer/src/components/BatchEditForm/BatchEditMix.tsx b/protocol-designer/src/components/BatchEditForm/BatchEditMix.tsx index e21aca76ff0c..b147d5e59da2 100644 --- a/protocol-designer/src/components/BatchEditForm/BatchEditMix.tsx +++ b/protocol-designer/src/components/BatchEditForm/BatchEditMix.tsx @@ -84,6 +84,7 @@ export const BatchEditMix = (props: BatchEditMixProps): JSX.Element => { {...propsForFields.aspirate_flowRate} pipetteId={getPipetteIdForForm()} flowRateType="aspirate" + volume={propsForFields.volume.value} /> { {...propsForFields.dispense_flowRate} pipetteId={getPipetteIdForForm()} flowRateType="dispense" + volume={propsForFields.volume.value} />
) } diff --git a/protocol-designer/src/components/StepEditForm/fields/WellSelectionField/WellSelectionModal.tsx b/protocol-designer/src/components/StepEditForm/fields/WellSelectionField/WellSelectionModal.tsx index 0e7367ae0696..5a9c6424ff3d 100644 --- a/protocol-designer/src/components/StepEditForm/fields/WellSelectionField/WellSelectionModal.tsx +++ b/protocol-designer/src/components/StepEditForm/fields/WellSelectionField/WellSelectionModal.tsx @@ -13,7 +13,7 @@ import { import { sortWells, LabwareDefinition2, - PipetteNameSpecs, + PipetteV2Specs, } from '@opentrons/shared-data' import { arrayToWellGroup } from '../../../../utils' @@ -54,7 +54,7 @@ interface WellSelectionModalComponentProps { updateHighlightedWells: (wellGroup: WellGroup) => unknown wellContents: ContentsByWell labwareDef?: LabwareDefinition2 | null - pipetteSpec?: PipetteNameSpecs | null + pipetteSpec?: PipetteV2Specs | null } const WellSelectionModalComponent = ( diff --git a/protocol-designer/src/components/StepEditForm/forms/MixForm.tsx b/protocol-designer/src/components/StepEditForm/forms/MixForm.tsx index 2b85c5cd3484..8d43e9a10b25 100644 --- a/protocol-designer/src/components/StepEditForm/forms/MixForm.tsx +++ b/protocol-designer/src/components/StepEditForm/forms/MixForm.tsx @@ -111,6 +111,7 @@ export const MixForm = (props: StepFormProps): JSX.Element => { {...propsForFields.aspirate_flowRate} pipetteId={formData.pipette} flowRateType="aspirate" + volume={propsForFields.volume.value} /> { {...propsForFields.dispense_flowRate} pipetteId={formData.pipette} flowRateType="dispense" + volume={propsForFields.volume.value} />
diff --git a/protocol-designer/src/components/StepEditForm/forms/MoveLiquidForm/SourceDestFields.tsx b/protocol-designer/src/components/StepEditForm/forms/MoveLiquidForm/SourceDestFields.tsx index 466264374cd6..2f0e8bdc3b0e 100644 --- a/protocol-designer/src/components/StepEditForm/forms/MoveLiquidForm/SourceDestFields.tsx +++ b/protocol-designer/src/components/StepEditForm/forms/MoveLiquidForm/SourceDestFields.tsx @@ -37,6 +37,7 @@ const makeAddFieldNamePrefix = (prefix: string) => ( export const SourceDestFields = (props: SourceDestFieldsProps): JSX.Element => { const { className, formData, prefix, propsForFields } = props const { t } = useTranslation(['form', 'application']) + const additionalEquipmentEntities = useSelector( getAdditionalEquipmentEntities ) @@ -90,6 +91,7 @@ export const SourceDestFields = (props: SourceDestFieldsProps): JSX.Element => { {...propsForFields[addFieldNamePrefix('flowRate')]} pipetteId={formData.pipette} flowRateType={prefix} + volume={propsForFields.volume.value} /> pipetteSpecs && pipetteSpecs.channels !== 1) const crashablePipetteSelected = getIsCrashablePipetteSelected( diff --git a/protocol-designer/src/components/modals/CreateFileWizard/PipetteTipsTile.tsx b/protocol-designer/src/components/modals/CreateFileWizard/PipetteTipsTile.tsx index cbe4075b3e3c..4bc9fcec60e2 100644 --- a/protocol-designer/src/components/modals/CreateFileWizard/PipetteTipsTile.tsx +++ b/protocol-designer/src/components/modals/CreateFileWizard/PipetteTipsTile.tsx @@ -23,7 +23,7 @@ import { Btn, JUSTIFY_END, } from '@opentrons/components' -import { getPipetteNameSpecs } from '@opentrons/shared-data' +import { getPipetteSpecsV2 } from '@opentrons/shared-data' import { getLabwareDefsByURI } from '../../../labware-defs/selectors' import { createCustomTiprackDef } from '../../../labware-defs/actions' import { getAllowAllTipracks } from '../../../feature-flags/selectors' @@ -72,8 +72,7 @@ export function PipetteTipsTile(props: PipetteTipsTileProps): JSX.Element { const tileHeader = t('choose_tips_for_pipette', { pipetteName: firstPipetteName != null - ? getPipetteNameSpecs(firstPipetteName as PipetteName)?.displayName ?? - '' + ? getPipetteSpecsV2(firstPipetteName as PipetteName)?.displayName ?? '' : '', }) @@ -160,8 +159,8 @@ function PipetteTipsField(props: PipetteTipsFieldProps): JSX.Element | null { const selectedPipetteName = pipettesByMount[mount].pipetteName const selectedPipetteDefaultTipracks = selectedPipetteName != null - ? getPipetteNameSpecs(selectedPipetteName as PipetteName) - ?.defaultTipracks ?? [] + ? getPipetteSpecsV2(selectedPipetteName as PipetteName)?.liquids.default + .defaultTipracks ?? [] : [] const tiprackOptions = getTiprackOptions({ allLabware: allLabware, diff --git a/protocol-designer/src/components/modals/CreateFileWizard/PipetteTypeTile.tsx b/protocol-designer/src/components/modals/CreateFileWizard/PipetteTypeTile.tsx index 2c1a234ee501..8acc344ba7df 100644 --- a/protocol-designer/src/components/modals/CreateFileWizard/PipetteTypeTile.tsx +++ b/protocol-designer/src/components/modals/CreateFileWizard/PipetteTypeTile.tsx @@ -18,9 +18,9 @@ import { OT2_ROBOT_TYPE, OT3_PIPETTES, getAllPipetteNames, - getPipetteNameSpecs, LEFT, RIGHT, + getPipetteSpecsV2, } from '@opentrons/shared-data' import { GoBack } from './GoBack' @@ -141,7 +141,7 @@ function PipetteField(props: OT2FieldProps): JSX.Element { ) .map(name => ({ value: name, - name: getPipetteNameSpecs(name)?.displayName ?? '', + name: getPipetteSpecsV2(name)?.displayName ?? '', })) const noneOption = allowNoPipette ? [{ name: 'None', value: '' }] : [] return display96Channel @@ -180,7 +180,7 @@ function PipetteField(props: OT2FieldProps): JSX.Element { imageStyle={css` max-height: 3rem; `} - pipetteSpecs={getPipetteNameSpecs(o.value as PipetteName)} + pipetteSpecs={getPipetteSpecsV2(o.value as PipetteName)} /> ) } diff --git a/protocol-designer/src/components/modals/CreateFileWizard/__tests__/CreateFileWizard.test.tsx b/protocol-designer/src/components/modals/CreateFileWizard/__tests__/CreateFileWizard.test.tsx index eeaf6df3362c..dbfdc99fde6d 100644 --- a/protocol-designer/src/components/modals/CreateFileWizard/__tests__/CreateFileWizard.test.tsx +++ b/protocol-designer/src/components/modals/CreateFileWizard/__tests__/CreateFileWizard.test.tsx @@ -151,7 +151,7 @@ describe('CreateFileWizard', () => { screen.getByText('Step 2 / 7') // select flex pipette fireEvent.click( - screen.getByLabelText('EquipmentOption_flex_Flex 1-Channel 50 μL') + screen.getByLabelText('EquipmentOption_flex_Flex 1-Channel 1000 μL') ) next = screen.getByRole('button', { name: 'Next' }) fireEvent.click(next) diff --git a/protocol-designer/src/components/modals/CreateFileWizard/__tests__/PipetteTipsTile.test.tsx b/protocol-designer/src/components/modals/CreateFileWizard/__tests__/PipetteTipsTile.test.tsx index d4f6c804ef06..9995dc192e5b 100644 --- a/protocol-designer/src/components/modals/CreateFileWizard/__tests__/PipetteTipsTile.test.tsx +++ b/protocol-designer/src/components/modals/CreateFileWizard/__tests__/PipetteTipsTile.test.tsx @@ -37,7 +37,7 @@ const values = { }, pipettesByMount: { left: { - pipetteName: 'p50_single_flex', + pipetteName: 'p1000_single_flex', tiprackDefURI: 'opentrons/opentrons_flex_96_tiprack_200ul/1', }, right: { pipetteName: null, tiprackDefURI: null }, @@ -98,10 +98,10 @@ describe('PipetteTipsTile', () => { afterEach(() => { cleanup() }) - it('renders default tiprack options for 50uL flex pipette and btn ctas work', () => { + it('renders default tiprack options for 1000uL flex pipette and btn ctas work', () => { render(props) - screen.getByText('Choose tips for Flex 1-Channel 50 μL') - screen.getByText('mock EquipmentOption') + screen.getByText('Choose tips for Flex 1-Channel 1000 μL') + screen.getAllByText('mock EquipmentOption') screen.getByText('Go back') fireEvent.click(screen.getByRole('button', { name: 'GoBack_button' })) expect(props.goBack).toHaveBeenCalled() @@ -131,15 +131,15 @@ describe('PipetteTipsTile', () => { }, ]) render(props) - screen.getByText('Choose tips for Flex 1-Channel 50 μL') + screen.getByText('Choose tips for Flex 1-Channel 1000 μL') fireEvent.click(screen.getByLabelText('PipetteTipsTile_customTipButton')) screen.getByText('Custom tips') - expect(screen.getAllByText('mock EquipmentOption')).toHaveLength(2) + expect(screen.getAllByText('mock EquipmentOption')).toHaveLength(3) }) - it('renders all tiprack options for 50uL flex pipette when all tipracks are true', () => { + it('renders all tiprack options for 1000uL flex pipette when all tipracks are true', () => { vi.mocked(getAllowAllTipracks).mockReturnValue(true) render(props) - screen.getByText('Choose tips for Flex 1-Channel 50 μL') + screen.getByText('Choose tips for Flex 1-Channel 1000 μL') expect(screen.getAllByText('mock EquipmentOption')).toHaveLength(2) }) it('renders default options for 10uL ot-2 pipette', () => { diff --git a/protocol-designer/src/components/modals/FilePipettesModal/PipetteDiagram.tsx b/protocol-designer/src/components/modals/FilePipettesModal/PipetteDiagram.tsx index e6d57fe539d8..9b8862139336 100644 --- a/protocol-designer/src/components/modals/FilePipettesModal/PipetteDiagram.tsx +++ b/protocol-designer/src/components/modals/FilePipettesModal/PipetteDiagram.tsx @@ -4,7 +4,7 @@ import { css } from 'styled-components' import cx from 'classnames' import { FLEX_ROBOT_TYPE, - getPipetteNameSpecs, + getPipetteSpecsV2, PipetteName, } from '@opentrons/shared-data' import { InstrumentDiagram } from '@opentrons/components' @@ -32,11 +32,10 @@ export function PipetteDiagram(props: Props): JSX.Element { function PipetteGroup(props: Props): JSX.Element { const { leftPipette, rightPipette } = props const robotType = useSelector(getRobotType) - const leftSpecs = - leftPipette && getPipetteNameSpecs(leftPipette as PipetteName) + const leftSpecs = leftPipette && getPipetteSpecsV2(leftPipette as PipetteName) const has96Channel = leftPipette === 'p1000_96' const rightSpecs = - rightPipette && getPipetteNameSpecs(rightPipette as PipetteName) + rightPipette && getPipetteSpecsV2(rightPipette as PipetteName) return ( <> {leftPipette && leftSpecs ? ( diff --git a/protocol-designer/src/components/modals/FilePipettesModal/index.tsx b/protocol-designer/src/components/modals/FilePipettesModal/index.tsx index 48af481cdfb7..b08b6f5d05e3 100644 --- a/protocol-designer/src/components/modals/FilePipettesModal/index.tsx +++ b/protocol-designer/src/components/modals/FilePipettesModal/index.tsx @@ -22,11 +22,11 @@ import { HEATERSHAKER_MODULE_TYPE, ModuleType, ModuleModel, - getPipetteNameSpecs, PipetteName, MAGNETIC_BLOCK_V1, MAGNETIC_BLOCK_TYPE, OT2_ROBOT_TYPE, + getPipetteSpecsV2, } from '@opentrons/shared-data' import { StepChangesConfirmModal } from '../EditPipettesModal/StepChangesConfirmModal' import { PipetteFields } from './PipetteFields' @@ -455,8 +455,8 @@ export const FilePipettesModal = (props: Props): JSX.Element => { const showHeaterShakerPipetteCollisions = hasHeaterShakerSelected && [ - getPipetteNameSpecs(left.pipetteName as PipetteName), - getPipetteNameSpecs(right.pipetteName as PipetteName), + getPipetteSpecsV2(left.pipetteName as PipetteName), + getPipetteSpecsV2(right.pipetteName as PipetteName), ].some(pipetteSpecs => pipetteSpecs && pipetteSpecs.channels !== 1) const crashablePipetteSelected = getIsCrashablePipetteSelected( diff --git a/protocol-designer/src/components/modals/utils.ts b/protocol-designer/src/components/modals/utils.ts index 8d65fa7e823f..bc83d27bf1fe 100644 --- a/protocol-designer/src/components/modals/utils.ts +++ b/protocol-designer/src/components/modals/utils.ts @@ -1,7 +1,7 @@ import { getLabwareDefURI, getLabwareDisplayName, - getPipetteNameSpecs, + getPipetteSpecsV2, PipetteName, } from '@opentrons/shared-data' import { LabwareDefByDefURI } from '../../labware-defs' @@ -20,12 +20,12 @@ export function getTiprackOptions(props: TiprackOptionsProps): TiprackOption[] { const { allLabware, allowAllTipracks, selectedPipetteName } = props const selectedPipetteDefaultTipracks = selectedPipetteName != null - ? getPipetteNameSpecs(selectedPipetteName as PipetteName) - ?.defaultTipracks ?? [] + ? getPipetteSpecsV2(selectedPipetteName as PipetteName)?.liquids.default + .defaultTipracks ?? [] : [] const selectedPipetteDisplayCategory = selectedPipetteName != null - ? getPipetteNameSpecs(selectedPipetteName as PipetteName) + ? getPipetteSpecsV2(selectedPipetteName as PipetteName) ?.displayCategory ?? [] : [] diff --git a/protocol-designer/src/components/modules/EditModulesCard.tsx b/protocol-designer/src/components/modules/EditModulesCard.tsx index eb9ce4c7965f..40df5ef14a27 100644 --- a/protocol-designer/src/components/modules/EditModulesCard.tsx +++ b/protocol-designer/src/components/modules/EditModulesCard.tsx @@ -7,8 +7,8 @@ import { HEATERSHAKER_MODULE_TYPE, ModuleType, PipetteName, - getPipetteNameSpecs, FLEX_ROBOT_TYPE, + getPipetteSpecsV2, } from '@opentrons/shared-data' import { selectors as stepFormSelectors, @@ -85,8 +85,8 @@ export function EditModulesCard(props: Props): JSX.Element { const showHeaterShakerPipetteCollisions = isHeaterShakerOnDeck && [ - getPipetteNameSpecs(pipettesByMount.left.pipetteName as PipetteName), - getPipetteNameSpecs(pipettesByMount.right.pipetteName as PipetteName), + getPipetteSpecsV2(pipettesByMount.left.pipetteName as PipetteName), + getPipetteSpecsV2(pipettesByMount.right.pipetteName as PipetteName), ].some(pipetteSpecs => pipetteSpecs?.channels !== 1) const warningsEnabled = !moduleRestrictionsDisabled diff --git a/protocol-designer/src/file-data/__fixtures__/createFile/commonFields.ts b/protocol-designer/src/file-data/__fixtures__/createFile/commonFields.ts index 9b069bffabdc..046d07cff48d 100644 --- a/protocol-designer/src/file-data/__fixtures__/createFile/commonFields.ts +++ b/protocol-designer/src/file-data/__fixtures__/createFile/commonFields.ts @@ -1,11 +1,14 @@ // Named arguments to createFile selector. This data would be the result of several selectors. -import { fixtureP10Single } from '@opentrons/shared-data/pipette/fixtures/name' import { fixture_96_plate, fixture_tiprack_10_ul, fixture_trash, } from '@opentrons/shared-data/labware/fixtures/2' -import { OT2_ROBOT_TYPE, OT2_STANDARD_DECKID } from '@opentrons/shared-data' +import { + OT2_ROBOT_TYPE, + OT2_STANDARD_DECKID, + fixtureP10SingleV2Specs, +} from '@opentrons/shared-data' import type { LabwareDefinition2 } from '@opentrons/shared-data' import type { LabwareLiquidState, @@ -53,7 +56,7 @@ export const pipetteEntities: PipetteEntities = { pipetteId: { id: 'pipetteId', name: 'p10_single', - spec: fixtureP10Single, + spec: fixtureP10SingleV2Specs, tiprackDefURI: 'opentrons/opentrons_96_tiprack_10ul/1', tiprackLabwareDef: fixtureTiprack10ul, }, diff --git a/protocol-designer/src/file-data/__tests__/createFile.test.ts b/protocol-designer/src/file-data/__tests__/createFile.test.ts index 098177caf22c..1946d0416a38 100644 --- a/protocol-designer/src/file-data/__tests__/createFile.test.ts +++ b/protocol-designer/src/file-data/__tests__/createFile.test.ts @@ -2,6 +2,8 @@ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest' import Ajv from 'ajv' import { commandSchemaV8, + fixtureP10SingleV2Specs, + fixtureP300SingleV2Specs, labwareSchemaV2, protocolSchemaV8, } from '@opentrons/shared-data' @@ -11,10 +13,6 @@ import { fixture_tiprack_10_ul, fixture_tiprack_300_ul, } from '@opentrons/shared-data/labware/fixtures/2' -import { - fixtureP10Single, - fixtureP300Single, -} from '@opentrons/shared-data/pipette/fixtures/name' import { getLoadLiquidCommands } from '../../load-file/migration/utils/getLoadLiquidCommands' import { createFile, getLabwareDefinitionsInUse } from '../selectors' import { @@ -126,7 +124,7 @@ describe('getLabwareDefinitionsInUse util', () => { id: 'somePipetteId', // @ts-expect-error(sa, 2021-6-18): not a valid pipette name name: 'foo', - spec: fixtureP10Single, + spec: fixtureP10SingleV2Specs, tiprackLabwareDef: assignedTiprackOnDeckDef as LabwareDefinition2, tiprackDefURI: 'assignedTiprackOnDeckURI', }, @@ -134,7 +132,7 @@ describe('getLabwareDefinitionsInUse util', () => { id: 'otherPipetteId', // @ts-expect-error(sa, 2021-6-18): not a valid pipette name name: 'foo', - spec: fixtureP300Single, + spec: fixtureP300SingleV2Specs, tiprackLabwareDef: assignedTiprackNotOnDeckDef as LabwareDefinition2, tiprackDefURI: 'assignedTiprackNotOnDeckURI', }, diff --git a/protocol-designer/src/load-file/migration/1_1_0.ts b/protocol-designer/src/load-file/migration/1_1_0.ts index b02295baa87c..af041cee1d9d 100644 --- a/protocol-designer/src/load-file/migration/1_1_0.ts +++ b/protocol-designer/src/load-file/migration/1_1_0.ts @@ -3,15 +3,16 @@ import mapValues from 'lodash/mapValues' import omit from 'lodash/omit' import omitBy from 'lodash/omitBy' import flow from 'lodash/flow' -import { getPipetteNameSpecs } from '@opentrons/shared-data' -import { +import { PipetteName, getPipetteSpecsV2 } from '@opentrons/shared-data' +import { getLegacyLabwareDef } from '../../labware-defs' +import type { FileLabware, FilePipette, ProtocolFile, } from '@opentrons/shared-data/protocol/types/schemaV1' -import { getLegacyLabwareDef } from '../../labware-defs' -import { FormPatch } from '../../steplist/actions' -import { FormData } from '../../form-types' +import type { FormPatch } from '../../steplist/actions' +import type { FormData } from '../../form-types' + export interface PDMetadata { pipetteTiprackAssignments: Record dismissedWarnings: { @@ -68,12 +69,15 @@ function getPipetteCapacityLegacy( )}"` ) } - // @ts-expect-error unable to cast type string from manipulation above to type PipetteName - const specs = getPipetteNameSpecs(pipetteName) + + const specs = getPipetteSpecsV2(pipetteName as PipetteName) const tiprackDef = getLegacyLabwareDef(pipette.tiprackModel) if (specs && tiprackDef && tiprackDef.metadata.tipVolume) { - return Math.min(specs.maxVolume, tiprackDef.metadata.tipVolume) + return Math.min( + specs.liquids.default.maxVolume, + tiprackDef.metadata.tipVolume + ) } console.assert(specs, `Expected spec for pipette ${JSON.stringify(pipette)}`) diff --git a/protocol-designer/src/pipettes/pipetteData.ts b/protocol-designer/src/pipettes/pipetteData.ts index 71a8318726cd..665d7f674b75 100644 --- a/protocol-designer/src/pipettes/pipetteData.ts +++ b/protocol-designer/src/pipettes/pipetteData.ts @@ -1,6 +1,6 @@ import { DropdownOption } from '../../../components/lib/forms/DropdownField.d' import { - getPipetteNameSpecs, + getPipetteSpecsV2, getTiprackVolume, PipetteName, } from '@opentrons/shared-data' @@ -18,12 +18,12 @@ const supportedPipetteNames: PipetteName[] = [ // TODO: should a version of pipetteOptions be moved to shared-data, // and used for both PD and Run App? export const pipetteOptions: Options = supportedPipetteNames - .map((name: PipetteName) => { - const pipette = getPipetteNameSpecs(name) + .map(name => { + const pipette = getPipetteSpecsV2(name) return pipette ? { name: pipette.displayName, - value: pipette.name, + value: name as string, } : null }) @@ -38,7 +38,10 @@ export function getPipetteCapacity(pipetteEntity: PipetteEntity): number { const tiprackDef = pipetteEntity.tiprackLabwareDef if (spec && tiprackDef) { - return Math.min(spec.maxVolume, getTiprackVolume(tiprackDef)) + return Math.min( + spec.liquids.default.maxVolume, + getTiprackVolume(tiprackDef) + ) } console.assert( @@ -49,11 +52,25 @@ export function getPipetteCapacity(pipetteEntity: PipetteEntity): number { ) return NaN } + export function getMinPipetteVolume(pipetteEntity: PipetteEntity): number { const spec = pipetteEntity.spec - if (spec) { - return spec.minVolume + const minVolumes = + spec != null + ? Object.values(spec.liquids).map(liquid => liquid.minVolume) + : [] + let recommendedMinimumDisposalVol: number = 0 + if (minVolumes.length === 1) { + recommendedMinimumDisposalVol = minVolumes[0] + // to accommodate for lowVolume + } else { + const lowestVolume = Math.min(...minVolumes) + recommendedMinimumDisposalVol = lowestVolume + } + + if (spec != null) { + return recommendedMinimumDisposalVol } console.assert( diff --git a/protocol-designer/src/step-forms/selectors/index.ts b/protocol-designer/src/step-forms/selectors/index.ts index 61965c9434c8..26743741c117 100644 --- a/protocol-designer/src/step-forms/selectors/index.ts +++ b/protocol-designer/src/step-forms/selectors/index.ts @@ -4,7 +4,6 @@ import reduce from 'lodash/reduce' import isEmpty from 'lodash/isEmpty' import { createSelector, Selector } from 'reselect' import { - getPipetteNameSpecs, getLabwareDisplayName, getLabwareDefURI, MAGNETIC_MODULE_TYPE, @@ -13,6 +12,7 @@ import { HEATERSHAKER_MODULE_TYPE, PipetteName, MAGNETIC_BLOCK_TYPE, + getPipetteSpecsV2, } from '@opentrons/shared-data' import { AdditionalEquipmentEntities, @@ -346,7 +346,7 @@ export const getPermittedTipracks: Selector< ) function _getPipetteDisplayName(name: PipetteName): string { - const pipetteSpecs = getPipetteNameSpecs(name) + const pipetteSpecs = getPipetteSpecsV2(name) if (!pipetteSpecs) return 'Unknown Pipette' return pipetteSpecs.displayName } diff --git a/protocol-designer/src/step-forms/test/createPresavedStepForm.test.ts b/protocol-designer/src/step-forms/test/createPresavedStepForm.test.ts index e48be38b6d11..8eb39b8ebce9 100644 --- a/protocol-designer/src/step-forms/test/createPresavedStepForm.test.ts +++ b/protocol-designer/src/step-forms/test/createPresavedStepForm.test.ts @@ -6,8 +6,8 @@ import { TEMPERATURE_MODULE_V2, THERMOCYCLER_MODULE_TYPE, THERMOCYCLER_MODULE_V1, + fixtureP10SingleV2Specs, } from '@opentrons/shared-data' -import { fixtureP10Single } from '@opentrons/shared-data/pipette/fixtures/name' import { fixture_tiprack_10_ul } from '@opentrons/shared-data/labware/fixtures/2' import { getStateAndContextTempTCModules } from '@opentrons/step-generation' import { @@ -28,7 +28,7 @@ beforeEach(() => { const leftPipette = { name: 'p10_single', id: 'leftPipetteId', - spec: fixtureP10Single, + spec: fixtureP10SingleV2Specs, tiprackLabwareDef: fixture_tiprack_10_ul, } const labwareOnMagModule = { diff --git a/protocol-designer/src/step-forms/utils/index.ts b/protocol-designer/src/step-forms/utils/index.ts index 34a23727dc9f..a9edda431603 100644 --- a/protocol-designer/src/step-forms/utils/index.ts +++ b/protocol-designer/src/step-forms/utils/index.ts @@ -3,7 +3,7 @@ import values from 'lodash/values' import find from 'lodash/find' import mapValues from 'lodash/mapValues' import { - getPipetteNameSpecs, + getPipetteSpecsV2, GEN_ONE_MULTI_PIPETTES, THERMOCYCLER_MODULE_TYPE, } from '@opentrons/shared-data' @@ -89,7 +89,7 @@ export function denormalizePipetteEntities( pipetteInvariantProperties, (acc: PipetteEntities, pipette: NormalizedPipette): PipetteEntities => { const pipetteId = pipette.id - const spec = getPipetteNameSpecs(pipette.name) + const spec = getPipetteSpecsV2(pipette.name) if (!spec) { throw new Error( diff --git a/protocol-designer/src/steplist/formLevel/handleFormChange/dependentFieldsUpdateMoveLiquid.ts b/protocol-designer/src/steplist/formLevel/handleFormChange/dependentFieldsUpdateMoveLiquid.ts index e5acc637b53a..b434afb38466 100644 --- a/protocol-designer/src/steplist/formLevel/handleFormChange/dependentFieldsUpdateMoveLiquid.ts +++ b/protocol-designer/src/steplist/formLevel/handleFormChange/dependentFieldsUpdateMoveLiquid.ts @@ -1,11 +1,15 @@ import clamp from 'lodash/clamp' import pick from 'lodash/pick' import round from 'lodash/round' -import { getPipetteNameSpecs } from '@opentrons/shared-data' +import { getPipetteSpecsV2 } from '@opentrons/shared-data' import { SOURCE_WELL_BLOWOUT_DESTINATION, DEST_WELL_BLOWOUT_DESTINATION, } from '@opentrons/step-generation' +import { + getMinPipetteVolume, + getPipetteCapacity, +} from '../../../pipettes/pipetteData' import { getWellRatio } from '../../utils' import { getDefaultsForStepType } from '../getDefaultsForStepType' import { makeConditionalPatchUpdater } from './makeConditionalPatchUpdater' @@ -25,10 +29,6 @@ import type { } from '@opentrons/step-generation' import { FormData, StepFieldName } from '../../../form-types' import { FormPatch } from '../../actions/types' -import { - getMinPipetteVolume, - getPipetteCapacity, -} from '../../../pipettes/pipetteData' // TODO: Ian 2019-02-21 import this from a more central place - see #2926 const getDefaultFields = (...fields: StepFieldName[]): FormPatch => @@ -232,8 +232,8 @@ const updatePatchOnPipetteChange = ( let airGapVolume: string | null = null if (typeof newPipette === 'string' && newPipette in pipetteEntities) { - const pipetteSpec = pipetteEntities[newPipette].spec - airGapVolume = `${pipetteSpec.minVolume}` + const minVolume = getMinPipetteVolume(pipetteEntities[newPipette]) + airGapVolume = minVolume.toString() } return { @@ -366,14 +366,25 @@ const updatePatchDisposalVolumeFields = ( ) { // @ts-expect-error(sa, 2021-6-14): appliedPatch.pipette does not exist. Address in #3161 const pipetteEntity = pipetteEntities[appliedPatch.pipette] - const pipetteSpec = getPipetteNameSpecs(pipetteEntity.name) - const recommendedMinimumDisposalVol = - (pipetteSpec && pipetteSpec.minVolume) || 0 + const pipetteSpec = getPipetteSpecsV2(pipetteEntity.name) + const minVolumes = + pipetteSpec != null + ? Object.values(pipetteSpec.liquids).map(liquid => liquid.minVolume) + : [] + let recommendedMinimumDisposalVol: string = '0' + if (minVolumes.length === 1) { + recommendedMinimumDisposalVol = minVolumes[0].toString() + // to accommodate for lowVolume + } else { + const lowestVolume = Math.min(...minVolumes) + recommendedMinimumDisposalVol = lowestVolume.toString() + } + // reset to recommended vol. Expects `clampDisposalVolume` to reduce it if needed return { ...patch, disposalVolume_checkbox: true, - disposalVolume_volume: String(recommendedMinimumDisposalVol || 0), + disposalVolume_volume: recommendedMinimumDisposalVol, } } 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 86ce901e1323..45a2ca8582cc 100644 --- a/protocol-designer/src/steplist/formLevel/handleFormChange/test/moveLiquid.test.ts +++ b/protocol-designer/src/steplist/formLevel/handleFormChange/test/moveLiquid.test.ts @@ -1,8 +1,4 @@ import { describe, it, beforeEach, afterEach, expect, vi } from 'vitest' -import { - fixtureP10Single, - fixtureP300Single, -} from '@opentrons/shared-data/pipette/fixtures/name' import { fixture_tiprack_10_ul, fixture_tiprack_300_ul, @@ -15,7 +11,11 @@ import { dependentFieldsUpdateMoveLiquid, updatePatchBlowoutFields, } from '../dependentFieldsUpdateMoveLiquid' -import type { LabwareDefinition2 } from '@opentrons/shared-data' +import { + fixtureP10SingleV2Specs, + fixtureP300SingleV2Specs, + LabwareDefinition2, +} from '@opentrons/shared-data' import type { PipetteEntities, LabwareEntities, @@ -33,14 +33,14 @@ beforeEach(() => { pipetteEntities = { pipetteId: { name: 'p10_single', - spec: fixtureP10Single, + spec: fixtureP10SingleV2Specs, // @ts-expect-error(sa, 2021-6-15): tiprackModel does not exist on PipetteEntity tiprackModel: 'tiprack-10ul', tiprackLabwareDef: fixtureTiprack10ul, }, otherPipetteId: { name: 'p300_single_gen2', - spec: fixtureP300Single, + spec: fixtureP300SingleV2Specs, // @ts-expect-error(sa, 2021-6-15): tiprackModel does not exist on PipetteEntity tiprackModel: 'tiprack-300ul', tiprackLabwareDef: fixtureTiprack300ul, diff --git a/protocol-designer/src/steplist/formLevel/handleFormChange/test/utils.test.ts b/protocol-designer/src/steplist/formLevel/handleFormChange/test/utils.test.ts index 107534519d11..7217b6e46d56 100644 --- a/protocol-designer/src/steplist/formLevel/handleFormChange/test/utils.test.ts +++ b/protocol-designer/src/steplist/formLevel/handleFormChange/test/utils.test.ts @@ -1,12 +1,14 @@ import { describe, it, beforeEach, expect } from 'vitest' +import { + fixtureP300SingleV2Specs, + LabwareDefinition2, +} from '@opentrons/shared-data' import { volumeInCapacityForMulti, volumeInCapacityForMultiAspirate, volumeInCapacityForMultiDispense, } from '../utils' -import { fixtureP300Single } from '@opentrons/shared-data/pipette/fixtures/name' import { fixture_tiprack_300_ul } from '@opentrons/shared-data/labware/fixtures/2' -import type { LabwareDefinition2 } from '@opentrons/shared-data' import type { PipetteEntities } from '@opentrons/step-generation' import type { FormData } from '../../../../form-types' @@ -22,7 +24,7 @@ describe('utils', () => { } as any pipetteEntities = { p300_single: { - spec: fixtureP300Single, + spec: fixtureP300SingleV2Specs, tiprackLabwareDef: fixtureTiprack300ul, }, } as any diff --git a/protocol-designer/src/steplist/formLevel/stepFormToArgs/mixFormToArgs.ts b/protocol-designer/src/steplist/formLevel/stepFormToArgs/mixFormToArgs.ts index 35197e72d4af..af486618c7a1 100644 --- a/protocol-designer/src/steplist/formLevel/stepFormToArgs/mixFormToArgs.ts +++ b/protocol-designer/src/steplist/formLevel/stepFormToArgs/mixFormToArgs.ts @@ -10,11 +10,16 @@ import { getOrderedWells } from '../../utils' import { getMixDelayData } from './getDelayData' import { HydratedMixFormDataLegacy } from '../../../form-types' import { MixArgs } from '@opentrons/step-generation' +import { getMatchingTipLiquidSpecs } from '../../../utils' type MixStepArgs = MixArgs export const mixFormToArgs = ( hydratedFormData: HydratedMixFormDataLegacy ): MixStepArgs => { const { labware, pipette, dropTip_location, nozzles } = hydratedFormData + const matchingTipLiquidSpecs = getMatchingTipLiquidSpecs( + pipette, + hydratedFormData.volume + ) const unorderedWells = hydratedFormData.wells || [] const orderFirst = hydratedFormData.mix_wellOrder_first const orderSecond = hydratedFormData.mix_wellOrder_second @@ -33,10 +38,11 @@ export const mixFormToArgs = ( const times = hydratedFormData.times || 0 const aspirateFlowRateUlSec = hydratedFormData.aspirate_flowRate || - pipette.spec.defaultAspirateFlowRate.value + matchingTipLiquidSpecs?.defaultAspirateFlowRate.default const dispenseFlowRateUlSec = hydratedFormData.dispense_flowRate || - pipette.spec.defaultDispenseFlowRate.value + matchingTipLiquidSpecs?.defaultDispenseFlowRate.default + // NOTE: for mix, there is only one tip offset field, // and it applies to both aspirate and dispense const aspirateOffsetFromBottomMm = @@ -56,7 +62,8 @@ export const mixFormToArgs = ( // Blowout settings const blowoutFlowRateUlSec = hydratedFormData.dispense_flowRate ?? - pipette.spec.defaultBlowOutFlowRate.value + matchingTipLiquidSpecs?.defaultBlowOutFlowRate.default + const blowoutOffsetFromTopMm = blowoutLocation ? DEFAULT_MM_BLOWOUT_OFFSET_FROM_TOP : 0 @@ -86,9 +93,9 @@ export const mixFormToArgs = ( changeTip, blowoutLocation, pipette: pipette.id, - aspirateFlowRateUlSec, - dispenseFlowRateUlSec, - blowoutFlowRateUlSec, + aspirateFlowRateUlSec: aspirateFlowRateUlSec ?? 0, + dispenseFlowRateUlSec: dispenseFlowRateUlSec ?? 0, + blowoutFlowRateUlSec: blowoutFlowRateUlSec ?? 0, aspirateOffsetFromBottomMm, dispenseOffsetFromBottomMm, blowoutOffsetFromTopMm, diff --git a/protocol-designer/src/steplist/formLevel/stepFormToArgs/moveLiquidFormToArgs.ts b/protocol-designer/src/steplist/formLevel/stepFormToArgs/moveLiquidFormToArgs.ts index 211d805497d9..cfb8a10683e1 100644 --- a/protocol-designer/src/steplist/formLevel/stepFormToArgs/moveLiquidFormToArgs.ts +++ b/protocol-designer/src/steplist/formLevel/stepFormToArgs/moveLiquidFormToArgs.ts @@ -15,6 +15,7 @@ import type { TransferArgs, InnerMixArgs, } from '@opentrons/step-generation' +import { getMatchingTipLiquidSpecs } from '../../../utils' type MoveLiquidFields = HydratedMoveLiquidFormData['fields'] // NOTE(sa, 2020-08-11): leaving this as fn so it can be expanded later for dispense air gap @@ -66,7 +67,6 @@ export const moveLiquidFormToArgs = ( `moveLiquidFormToArgs called with stepType ${hydratedFormData.stepType}, expected "moveLiquid"` ) const fields = hydratedFormData.fields - const pipetteSpec = fields.pipette.spec const pipetteId = fields.pipette.id const { volume, @@ -171,21 +171,28 @@ export const moveLiquidFormToArgs = ( 'dispense_airGap_checkbox', 'dispense_airGap_volume' ) + const matchingTipLiquidSpecs = getMatchingTipLiquidSpecs( + fields.pipette, + fields.volume + ) const commonFields = { pipette: pipetteId, volume, sourceLabware: sourceLabware.id, destLabware: destLabware.id, aspirateFlowRateUlSec: - fields.aspirate_flowRate || pipetteSpec.defaultAspirateFlowRate.value, + fields.aspirate_flowRate || + matchingTipLiquidSpecs.defaultAspirateFlowRate.default, dispenseFlowRateUlSec: - fields.dispense_flowRate || pipetteSpec.defaultDispenseFlowRate.value, + fields.dispense_flowRate || + matchingTipLiquidSpecs.defaultDispenseFlowRate.default, aspirateOffsetFromBottomMm: fields.aspirate_mmFromBottom || DEFAULT_MM_FROM_BOTTOM_ASPIRATE, dispenseOffsetFromBottomMm: fields.dispense_mmFromBottom || DEFAULT_MM_FROM_BOTTOM_DISPENSE, blowoutFlowRateUlSec: - fields.dispense_flowRate || pipetteSpec.defaultBlowOutFlowRate.value, + fields.dispense_flowRate || + matchingTipLiquidSpecs.defaultBlowOutFlowRate.default, blowoutOffsetFromTopMm, changeTip: fields.changeTip, preWetTip: Boolean(fields.preWetTip), 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 783df03d9142..c9958a036000 100644 --- a/protocol-designer/src/steplist/formLevel/stepFormToArgs/test/mixFormToArgs.test.ts +++ b/protocol-designer/src/steplist/formLevel/stepFormToArgs/test/mixFormToArgs.test.ts @@ -1,6 +1,8 @@ import { vi, it, describe, expect, beforeEach, afterEach } from 'vitest' -import { getLabwareDefURI } from '@opentrons/shared-data' -import { fixtureP10Single } from '@opentrons/shared-data/pipette/fixtures/name' +import { + fixtureP10SingleV2Specs, + getLabwareDefURI, +} from '@opentrons/shared-data' import { fixture_96_plate } from '@opentrons/shared-data/labware/fixtures/2' import { mixFormToArgs } from '../mixFormToArgs' import { DEFAULT_MM_BLOWOUT_OFFSET_FROM_TOP } from '../../../../constants' @@ -34,11 +36,18 @@ beforeEach(() => { blowout_checkbox: false, blowout_location: null, mix_mmFromBottom: 0.5, - // @ts-expect-error(sa, 2021-6-15): not a valid PipetteEntity pipette: { id: 'pipetteId', - spec: fixtureP10Single, - }, + spec: fixtureP10SingleV2Specs, + tiprackLabwareDef: { + parameters: { + tipLength: 10, + }, + metadata: { + displayName: 'mock display name', + }, + } as any, + } as any, // @ts-expect-error(sa, 2021-6-15): volume should be a number volume: '12', wells: ['A1', 'A2'], 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 9c354cf4fe89..8ff3a23b44a6 100644 --- a/protocol-designer/src/steplist/formLevel/stepFormToArgs/test/moveLiquidFormToArgs.test.ts +++ b/protocol-designer/src/steplist/formLevel/stepFormToArgs/test/moveLiquidFormToArgs.test.ts @@ -1,6 +1,8 @@ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest' -import { getLabwareDefURI } from '@opentrons/shared-data' -import { fixtureP10Single } from '@opentrons/shared-data/pipette/fixtures/name' +import { + fixtureP10SingleV2Specs, + getLabwareDefURI, +} from '@opentrons/shared-data' import { fixture_12_trough, fixture_96_plate, @@ -42,11 +44,18 @@ describe('move liquid step form -> command creator args', () => { description: null, fields: { - // @ts-expect-error(sa, 2021-6-15): not a valid PipetteEntity pipette: { id: 'pipetteId', - spec: fixtureP10Single, - }, + spec: fixtureP10SingleV2Specs, + tiprackLabwareDef: { + parameters: { + tipLength: 10, + }, + metadata: { + displayName: 'mock display name', + }, + } as any, + } as any, volume: 10, path: 'single', changeTip: 'always', diff --git a/protocol-designer/src/steplist/formLevel/test/errors.test.ts b/protocol-designer/src/steplist/formLevel/test/errors.test.ts index 588fb4939395..5488d9d37a02 100644 --- a/protocol-designer/src/steplist/formLevel/test/errors.test.ts +++ b/protocol-designer/src/steplist/formLevel/test/errors.test.ts @@ -8,7 +8,11 @@ describe('volumeTooHigh', () => { fieldsWithPipette = { pipette: { spec: { - maxVolume: 10, + liquids: { + default: { + maxVolume: 10, + }, + }, }, tiprackLabwareDef: { ...fixture_tiprack_10_ul }, // max tip volume is 10 ul }, @@ -35,7 +39,7 @@ describe('volumeTooHigh', () => { } // @ts-expect-error(sa, 2021-6-15): volumeTooHigh might return null, need to null check before property access expect(volumeTooHigh(fields).title).toBe( - `Volume is greater than maximum pipette/tip volume (${fields.pipette.spec.maxVolume} ul)` + `Volume is greater than maximum pipette/tip volume (${fields.pipette.spec.liquids.default.maxVolume} ul)` ) // @ts-expect-error(sa, 2021-6-15): volumeTooHigh might return null, need to null check before property access expect(volumeTooHigh(fields).dependentFields).toEqual(['pipette', 'volume']) diff --git a/protocol-designer/src/ui/steps/actions/actions.ts b/protocol-designer/src/ui/steps/actions/actions.ts index fde93a2db798..ea19fdfb5031 100644 --- a/protocol-designer/src/ui/steps/actions/actions.ts +++ b/protocol-designer/src/ui/steps/actions/actions.ts @@ -151,7 +151,7 @@ export const selectAllSteps = (): ThunkAction< type: 'SELECT_MULTIPLE_STEPS', payload: { stepIds: allStepIds, - // @ts-expect-error(sa, 2021-6-15): find could return undefined, need to null check PipetteNameSpecs + // @ts-expect-error(sa, 2021-6-15): find could return undefined, need to null check PipetteSpecsV2 lastSelected: last(allStepIds), }, } diff --git a/protocol-designer/src/utils/index.ts b/protocol-designer/src/utils/index.ts index cd00de55ede0..d94276ed3a4b 100644 --- a/protocol-designer/src/utils/index.ts +++ b/protocol-designer/src/utils/index.ts @@ -11,12 +11,15 @@ import { CutoutFixtureId, RobotType, INTERACTIVE_WELL_DATA_ATTRIBUTE, + SupportedTip, + LOW_VOLUME_PIPETTES, } from '@opentrons/shared-data' import { BoundingRect, GenericRect } from '../collision-types' import type { AdditionalEquipmentEntity, LabwareEntities, PipetteEntities, + PipetteEntity, } from '@opentrons/step-generation' import type { WellGroup } from '@opentrons/components' @@ -194,3 +197,38 @@ export const getCutoutIdByAddressableArea = ( } return cutoutId } + +export function getMatchingTipLiquidSpecs( + pipetteEntity: PipetteEntity, + volume: number +): SupportedTip { + const tipLength = pipetteEntity.tiprackLabwareDef.parameters.tipLength ?? 0 + + if (tipLength === 0) { + console.error( + `expected to find a tiplength with tiprack ${pipetteEntity.tiprackLabwareDef.metadata.displayName} but could not` + ) + } + + const isLowVolumePipette = LOW_VOLUME_PIPETTES.includes(pipetteEntity.name) + const isUsingLowVolume = volume < 5 + const liquidType = + isLowVolumePipette && isUsingLowVolume ? 'lowVolumeDefault' : 'default' + const liquidSupportedTips = Object.values( + pipetteEntity.spec.liquids[liquidType].supportedTips + ) + + // find the supported tip liquid specs that either exactly match + // tipLength or are closest, this accounts for custom tipracks + const matchingTipLiquidSpecs = liquidSupportedTips.sort((tipA, tipB) => { + const differenceA = Math.abs(tipA.defaultTipLength - tipLength) + const differenceB = Math.abs(tipB.defaultTipLength - tipLength) + return differenceA - differenceB + })[0] + console.assert( + matchingTipLiquidSpecs, + `expected to find the tip liquid specs but could not with pipette tiprack displayname ${pipetteEntity.tiprackLabwareDef.metadata.displayName}` + ) + + return matchingTipLiquidSpecs +} diff --git a/shared-data/js/helpers/__tests__/wellSets.test.ts b/shared-data/js/helpers/__tests__/wellSets.test.ts index 7fa5a7293350..ef842872f2fc 100644 --- a/shared-data/js/helpers/__tests__/wellSets.test.ts +++ b/shared-data/js/helpers/__tests__/wellSets.test.ts @@ -1,19 +1,20 @@ import { describe, it, expect, beforeEach } from 'vitest' -import pipetteNameSpecsFixtures from '../../../pipette/fixtures/name/pipetteNameSpecFixtures.json' import fixture_12_trough from '../../../labware/fixtures/2/fixture_12_trough.json' import fixture_96_plate from '../../../labware/fixtures/2/fixture_96_plate.json' import fixture_384_plate from '../../../labware/fixtures/2/fixture_384_plate.json' import fixture_overlappy_wellplate from '../../../labware/fixtures/2/fixture_overlappy_wellplate.json' +import { + fixtureP100096V2Specs, + fixtureP10MultiV2Specs, + fixtureP10SingleV2Specs, +} from '../../pipettes' import { makeWellSetHelpers } from '../wellSets' import { findWellAt } from '../getWellNamePerMultiTip' import { get96Channel384WellPlateWells, orderWells } from '..' -import type { LabwareDefinition2, PipetteNameSpecs } from '../../types' +import type { LabwareDefinition2 } from '../../types' import type { WellSetHelpers } from '../wellSets' -const fixtureP10Single = pipetteNameSpecsFixtures.p10_single as PipetteNameSpecs -const fixtureP10Multi = pipetteNameSpecsFixtures.p10_multi as PipetteNameSpecs -const fixtureP100096 = (pipetteNameSpecsFixtures.p1000_96 as any) as PipetteNameSpecs const fixture12Trough = fixture_12_trough as LabwareDefinition2 const fixture96Plate = fixture_96_plate as LabwareDefinition2 const fixture384Plate = fixture_384_plate as LabwareDefinition2 @@ -199,8 +200,8 @@ describe('canPipetteUseLabware', () => { it('returns false when wells are too close together for multi channel pipettes', () => { const labwareDef = fixtureOverlappyWellplate - const pipette = fixtureP10Multi - const pipette96 = fixtureP100096 + const pipette = fixtureP10MultiV2Specs + const pipette96 = fixtureP100096V2Specs expect(canPipetteUseLabware(pipette, labwareDef)).toBe(false) expect(canPipetteUseLabware(pipette96, labwareDef)).toBe(false) @@ -208,7 +209,7 @@ describe('canPipetteUseLabware', () => { it('returns true when pipette is single channel', () => { const labwareDef = fixtureOverlappyWellplate - const pipette = fixtureP10Single + const pipette = fixtureP10SingleV2Specs expect(canPipetteUseLabware(pipette, labwareDef)).toBe(true) }) diff --git a/shared-data/js/helpers/wellSets.ts b/shared-data/js/helpers/wellSets.ts index d841cd413668..dc369ba0f977 100644 --- a/shared-data/js/helpers/wellSets.ts +++ b/shared-data/js/helpers/wellSets.ts @@ -15,7 +15,7 @@ import uniq from 'lodash/uniq' import { getWellNamePerMultiTip } from './getWellNamePerMultiTip' import { get96Channel384WellPlateWells, getLabwareDefURI, orderWells } from '.' -import type { LabwareDefinition2, PipetteNameSpecs } from '../types' +import type { LabwareDefinition2, PipetteV2Specs } from '../types' type WellSetByPrimaryWell = string[][] @@ -51,7 +51,7 @@ export interface WellSetHelpers { ) => string[] | null | undefined canPipetteUseLabware: ( - pipetteSpec: PipetteNameSpecs, + pipetteSpec: PipetteV2Specs, labwareDef?: LabwareDefinition2, trashName?: string ) => boolean @@ -123,7 +123,7 @@ export const makeWellSetHelpers = (): WellSetHelpers => { } const canPipetteUseLabware = ( - pipetteSpec: PipetteNameSpecs, + pipetteSpec: PipetteV2Specs, labwareDef?: LabwareDefinition2, trashName?: string ): boolean => { diff --git a/shared-data/js/pipettes.ts b/shared-data/js/pipettes.ts index 5a9fc1a67c93..d918a2e6bc82 100644 --- a/shared-data/js/pipettes.ts +++ b/shared-data/js/pipettes.ts @@ -118,6 +118,7 @@ export const getIncompatiblePipetteNames = ( } export * from '../pipette/fixtures/name' +export * from '../pipette/fixtures/index' const getChannelsFromString = ( pipChannelString: PipChannelString @@ -165,6 +166,10 @@ model, and version in order to return the correct pipette schema v2 json files. export const getPipetteSpecsV2 = ( name: PipetteName | PipetteModel ): PipetteV2Specs | null => { + if (name == null) { + return null + } + const nameSplit = name.split('_') const pipetteModel = nameSplit[0] // ex: p300 const channels = getChannelsFromString(nameSplit[1] as PipChannelString) // ex: single -> single_channel diff --git a/shared-data/js/types.ts b/shared-data/js/types.ts index dd0edd865304..169d83814ff9 100644 --- a/shared-data/js/types.ts +++ b/shared-data/js/types.ts @@ -400,11 +400,11 @@ export interface PipetteV2GeneralSpecs { displayCategory: PipetteDisplayCategory pickUpTipConfigurations: { pressFit: { - speedByTipCount: Record + speedByTipCount: Record presses: number increment: number - distanceByTipCount: Record - currentByTipCount: Record + distanceByTipCount: Record + currentByTipCount: Record } } dropTipConfigurations: { @@ -435,7 +435,7 @@ export interface PipetteV2GeneralSpecs { partialTipSupported: boolean availableConfigurations: number[] | null } - channels: number + channels: PipetteChannels shaftDiameter: number shaftULperMM: number backCompatNames: string[] @@ -463,36 +463,33 @@ export interface PipetteV2GeometrySpecs { nozzleMap: Record } -type TipData = [number, number, number] -interface SupportedTips { - [tipType: string]: { - aspirate: { - default: { - 1: TipData - } - } - defaultAspirateFlowRate: { - default: number - valuesByApiLevel: Record - } - defaultBlowOutFlowRate: { - default: number - valuesByApiLevel: Record - } - defaultDispenseFlowRate: { - default: number - valuesByApiLevel: Record - } - defaultFlowAcceleration: number - defaultPushOutVolume: number - defaultReturnTipHeight: number - defaultTipLength: number - dispense: { - default: { - 1: TipData - } - } +export interface SupportedTip { + aspirate: { + default: Record } + defaultAspirateFlowRate: { + default: number + valuesByApiLevel: Record + } + defaultBlowOutFlowRate: { + default: number + valuesByApiLevel: Record + } + defaultDispenseFlowRate: { + default: number + valuesByApiLevel: Record + } + defaultPushOutVolume: number + defaultTipLength: number + dispense: { + default: Record + } + defaultReturnTipHeight?: number + defaultFlowAcceleration?: number +} + +export interface SupportedTips { + [tipType: string]: SupportedTip } export interface PipetteV2LiquidSpecs { diff --git a/shared-data/pipette/fixtures/index.ts b/shared-data/pipette/fixtures/index.ts new file mode 100644 index 000000000000..1faa68a04c26 --- /dev/null +++ b/shared-data/pipette/fixtures/index.ts @@ -0,0 +1,58 @@ +import fixtureP10SingleGeneral from '../../pipette/definitions/2/general/single_channel/p10/1_0.json' +import fixtureP10SingleGeometry from '../../pipette/definitions/2/geometry/single_channel/p10/1_0.json' +import fixturep10SingleLiquids from '../../pipette/definitions/2/liquid/single_channel/p10/default/1_0.json' +import fixtureP10MultiGeneral from '../../pipette/definitions/2/general/eight_channel/p10/1_0.json' +import fixtureP10MultiGeometry from '../../pipette/definitions/2/geometry/eight_channel/p10/1_0.json' +import fixtureP10MultiLiquids from '../../pipette/definitions/2/liquid/eight_channel/p10/default/1_0.json' +import fixtureP300SingleGeneral from '../../pipette/definitions/2/general/single_channel/p300/1_0.json' +import fixtureP300SingleGeometry from '../../pipette/definitions/2/geometry/single_channel/p300/1_0.json' +import fixtureP300SingleLiquids from '../../pipette/definitions/2/liquid/single_channel/p300/default/1_0.json' +import fixtureP300MultiGeneral from '../../pipette/definitions/2/general/eight_channel/p300/1_0.json' +import fixtureP300MultiGeometry from '../../pipette/definitions/2/geometry/eight_channel/p300/1_0.json' +import fixtureP300MultiLiquids from '../../pipette/definitions/2/liquid/eight_channel/p300/default/1_0.json' +import fixtureP100096General from '../../pipette/definitions/2/general/ninety_six_channel/p1000/1_0.json' +import fixtureP100096Geometry from '../../pipette/definitions/2/geometry/ninety_six_channel/p1000/1_0.json' +import fixtureP100096Liquids from '../../pipette/definitions/2/liquid/ninety_six_channel/p1000/default/1_0.json' +import fixtureP1000SingleGeneral from '../../pipette/definitions/2/general/single_channel/p1000/1_0.json' +import fixtureP1000SingleGeometry from '../../pipette/definitions/2/geometry/single_channel/p1000/1_0.json' +import fixtureP1000SingleLiquids from '../../pipette/definitions/2/liquid/single_channel/p1000/default/1_0.json' + +import type { PipetteV2Specs } from '../../js' + +// need to type as any first because channels and displayCategory types are +// incompatible. +export const fixtureP10SingleV2Specs: PipetteV2Specs = { + ...fixtureP10SingleGeneral, + ...fixtureP10SingleGeometry, + liquids: { default: { ...fixturep10SingleLiquids } }, +} as any + +export const fixtureP10MultiV2Specs: PipetteV2Specs = { + ...fixtureP10MultiGeneral, + ...fixtureP10MultiGeometry, + liquids: { default: { ...fixtureP10MultiLiquids } }, +} as any + +export const fixtureP300SingleV2Specs: PipetteV2Specs = { + ...fixtureP300SingleGeneral, + ...fixtureP300SingleGeometry, + liquids: { default: { ...fixtureP300SingleLiquids } }, +} as any + +export const fixtureP300MultiV2Specs: PipetteV2Specs = { + ...fixtureP300MultiGeneral, + ...fixtureP300MultiGeometry, + liquids: { default: { ...fixtureP300MultiLiquids } }, +} as any + +export const fixtureP100096V2Specs: PipetteV2Specs = { + ...fixtureP100096General, + ...fixtureP100096Geometry, + liquids: { default: { ...fixtureP100096Liquids } }, +} as any + +export const fixtureP1000SingleV2Specs: PipetteV2Specs = { + ...fixtureP1000SingleGeneral, + ...fixtureP1000SingleGeometry, + liquids: { default: { ...fixtureP1000SingleLiquids } }, +} as any diff --git a/step-generation/src/__tests__/__snapshots__/fixtureGeneration.test.ts.snap b/step-generation/src/__tests__/__snapshots__/fixtureGeneration.test.ts.snap index c13738fdfff8..cb5befed7fee 100644 --- a/step-generation/src/__tests__/__snapshots__/fixtureGeneration.test.ts.snap +++ b/step-generation/src/__tests__/__snapshots__/fixtureGeneration.test.ts.snap @@ -9093,48 +9093,1058 @@ exports[`snapshot tests > makeContext 1`] = ` "id": "p100096Id", "name": "p1000_96", "spec": { - "channels": 96, - "defaultAspirateFlowRate": { - "max": 812, - "min": 3, - "value": 7.85, - }, - "defaultBlowOutFlowRate": { - "max": 812, - "min": 3, - "value": 80, - }, - "defaultDispenseFlowRate": { - "max": 812, - "min": 3, - "value": 7.85, + "$otSharedSchema": "#/pipette/schemas/2/pipetteGeometrySchema.json", + "availableSensors": { + "capacitive": { + "count": 2, + }, + "environment": { + "count": 1, + }, + "pressure": { + "count": 2, + }, + "sensors": [ + "pressure", + "capacitive", + "environment", + ], }, + "backCompatNames": [], + "backlashDistance": 0.3, + "channels": 96, + "displayCategory": "FLEX", "displayName": "Flex 96-Channel 1000 μL", - "maxVolume": 1000, - "minVolume": 5, - }, - "tiprackDefURI": "fixture/fixture_flex_96_tiprack_1000ul/1", - "tiprackLabwareDef": { - "brand": { - "brand": "Fixture", - "brandId": [], + "dropTipConfigurations": { + "camAction": { + "current": 1.5, + "distance": 26.5, + "prep_move_distance": 16, + "prep_move_speed": 10.5, + "speed": 5.5, + }, }, - "cornerOffsetFromSlot": { - "x": 0, - "y": 0, - "z": 0, + "endTipActionRetractDistanceMM": 2, + "liquids": { + "default": { + "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", + "defaultTipOverlapDictionary": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_1000ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_200ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, + }, + "defaultTipracks": [ + "opentrons/opentrons_flex_96_tiprack_1000ul/1", + "opentrons/opentrons_flex_96_tiprack_200ul/1", + "opentrons/opentrons_flex_96_tiprack_50ul/1", + ], + "maxVolume": 1000, + "minVolume": 5, + "supportedTips": { + "t1000": { + "aspirate": { + "default": { + "1": [ + [ + 3.76, + 2.041301, + 4.284751, + ], + [ + 5.684286, + 0.49624, + 10.09418, + ], + [ + 8.445714, + 0.187358, + 11.849952, + ], + [ + 12.981429, + 0.073135, + 12.814653, + ], + [ + 17.667143, + 0.060853, + 12.974083, + ], + [ + 46.515714, + 0.025888, + 13.591828, + ], + [ + 95.032857, + 0.006561, + 14.490827, + ], + [ + 114.488571, + 0.00306, + 14.823556, + ], + [ + 192.228571, + 0.001447, + 15.00822, + ], + [ + 309.921429, + 0.000995, + 15.095087, + ], + [ + 436.984286, + 0.000322, + 15.303634, + ], + [ + 632.861429, + 0.000208, + 15.353582, + ], + [ + 828.952857, + 0.00013, + 15.402544, + ], + [ + 976.118571, + 0.000095, + 15.431673, + ], + [ + 1005.275714, + -0.000067, + 15.589843, + ], + [ + 1024.768571, + -0.000021, + 15.543681, + ], + [ + 1049.145714, + -0.000013, + 15.535884, + ], + ], + }, + }, + "defaultAspirateFlowRate": { + "default": 160, + "valuesByApiLevel": { + "2.14": 160, + }, + }, + "defaultBlowOutFlowRate": { + "default": 80, + "valuesByApiLevel": { + "2.14": 80, + }, + }, + "defaultDispenseFlowRate": { + "default": 160, + "valuesByApiLevel": { + "2.14": 160, + }, + }, + "defaultFlowAcceleration": 16000, + "defaultPushOutVolume": 20, + "defaultReturnTipHeight": 0.2, + "defaultTipLength": 95.6, + "dispense": { + "default": { + "1": [ + [ + 3.76, + 2.041301, + 4.284751, + ], + [ + 5.684286, + 0.49624, + 10.09418, + ], + [ + 8.445714, + 0.187358, + 11.849952, + ], + [ + 12.981429, + 0.073135, + 12.814653, + ], + [ + 17.667143, + 0.060853, + 12.974083, + ], + [ + 46.515714, + 0.025888, + 13.591828, + ], + [ + 95.032857, + 0.006561, + 14.490827, + ], + [ + 114.488571, + 0.00306, + 14.823556, + ], + [ + 192.228571, + 0.001447, + 15.00822, + ], + [ + 309.921429, + 0.000995, + 15.095087, + ], + [ + 436.984286, + 0.000322, + 15.303634, + ], + [ + 632.861429, + 0.000208, + 15.353582, + ], + [ + 828.952857, + 0.00013, + 15.402544, + ], + [ + 976.118571, + 0.000095, + 15.431673, + ], + [ + 1005.275714, + -0.000067, + 15.589843, + ], + [ + 1024.768571, + -0.000021, + 15.543681, + ], + [ + 1049.145714, + -0.000013, + 15.535884, + ], + ], + }, + }, + }, + "t200": { + "aspirate": { + "default": { + "1": [ + [ + 1.39875, + 4.681865, + 0.866627, + ], + [ + 2.5225, + 2.326382, + 4.161359, + ], + [ + 3.625, + 1.361424, + 6.595466, + ], + [ + 4.69125, + 0.848354, + 8.455342, + ], + [ + 5.705, + 0.519685, + 9.997214, + ], + [ + 6.70625, + 0.36981, + 10.852249, + ], + [ + 7.69375, + 0.267029, + 11.541523, + ], + [ + 8.67875, + 0.210129, + 11.979299, + ], + [ + 47.05, + 0.030309, + 13.539909, + ], + [ + 95.24375, + 0.003774, + 14.78837, + ], + [ + 211.0225, + 0.000928, + 15.059476, + ], + ], + }, + }, + "defaultAspirateFlowRate": { + "default": 80, + "valuesByApiLevel": { + "2.14": 80, + }, + }, + "defaultBlowOutFlowRate": { + "default": 80, + "valuesByApiLevel": { + "2.14": 80, + }, + }, + "defaultDispenseFlowRate": { + "default": 80, + "valuesByApiLevel": { + "2.14": 80, + }, + }, + "defaultFlowAcceleration": 16000, + "defaultPushOutVolume": 5, + "defaultReturnTipHeight": 0.2, + "defaultTipLength": 58.35, + "dispense": { + "default": { + "1": [ + [ + 1.39875, + 4.681865, + 0.866627, + ], + [ + 2.5225, + 2.326382, + 4.161359, + ], + [ + 3.625, + 1.361424, + 6.595466, + ], + [ + 4.69125, + 0.848354, + 8.455342, + ], + [ + 5.705, + 0.519685, + 9.997214, + ], + [ + 6.70625, + 0.36981, + 10.852249, + ], + [ + 7.69375, + 0.267029, + 11.541523, + ], + [ + 8.67875, + 0.210129, + 11.979299, + ], + [ + 47.05, + 0.030309, + 13.539909, + ], + [ + 95.24375, + 0.003774, + 14.78837, + ], + [ + 211.0225, + 0.000928, + 15.059476, + ], + ], + }, + }, + }, + "t50": { + "aspirate": { + "default": { + "1": [ + [ + 1.933333, + 2.844459, + 4.750159, + ], + [ + 2.833333, + 1.12901, + 8.066694, + ], + [ + 3.603333, + 0.254744, + 10.543779, + ], + [ + 4.836667, + 1.101839, + 7.491414, + ], + [ + 5.755, + 0.277649, + 11.47775, + ], + [ + 6.643333, + 0.14813, + 12.223126, + ], + [ + 7.548333, + 0.145635, + 12.239705, + ], + [ + 8.475, + 0.15097, + 12.199433, + ], + [ + 13.02, + 0.071736, + 12.870946, + ], + [ + 22.318333, + 0.042305, + 13.254131, + ], + [ + 36.463333, + 0.021195, + 13.725284, + ], + [ + 54.82, + 0.001805, + 14.43229, + ], + ], + }, + }, + "defaultAspirateFlowRate": { + "default": 6, + "valuesByApiLevel": { + "2.14": 6, + }, + }, + "defaultBlowOutFlowRate": { + "default": 80, + "valuesByApiLevel": { + "2.14": 80, + }, + }, + "defaultDispenseFlowRate": { + "default": 6, + "valuesByApiLevel": { + "2.14": 6, + }, + }, + "defaultFlowAcceleration": 16000, + "defaultPushOutVolume": 7, + "defaultReturnTipHeight": 0.2, + "defaultTipLength": 57.9, + "dispense": { + "default": { + "1": [ + [ + 1.933333, + 2.844459, + 4.750159, + ], + [ + 2.833333, + 1.12901, + 8.066694, + ], + [ + 3.603333, + 0.254744, + 10.543779, + ], + [ + 4.836667, + 1.101839, + 7.491414, + ], + [ + 5.755, + 0.277649, + 11.47775, + ], + [ + 6.643333, + 0.14813, + 12.223126, + ], + [ + 7.548333, + 0.145635, + 12.239705, + ], + [ + 8.475, + 0.15097, + 12.199433, + ], + [ + 13.02, + 0.071736, + 12.870946, + ], + [ + 22.318333, + 0.042305, + 13.254131, + ], + [ + 36.463333, + 0.021195, + 13.725284, + ], + [ + 54.82, + 0.001805, + 14.43229, + ], + ], + }, + }, + }, + }, + }, }, - "dimensions": { - "xDimension": 127.75, - "yDimension": 85.75, - "zDimension": 99, + "model": "p1000", + "nozzleMap": { + "A1": [ + -36, + -25.5, + -259.15, + ], + "A10": [ + 45, + -25.5, + -259.15, + ], + "A11": [ + 54, + -25.5, + -259.15, + ], + "A12": [ + 63, + -25.5, + -259.15, + ], + "A2": [ + -27, + -25.5, + -259.15, + ], + "A3": [ + -18, + -25.5, + -259.15, + ], + "A4": [ + -9, + -25.5, + -259.15, + ], + "A5": [ + 0, + -25.5, + -259.15, + ], + "A6": [ + 9, + -25.5, + -259.15, + ], + "A7": [ + 18, + -25.5, + -259.15, + ], + "A8": [ + 27, + -25.5, + -259.15, + ], + "A9": [ + 36, + -25.5, + -259.15, + ], + "B1": [ + -36, + -34.5, + -259.15, + ], + "B10": [ + 45, + -34.5, + -259.15, + ], + "B11": [ + 54, + -34.5, + -259.15, + ], + "B12": [ + 63, + -34.5, + -259.15, + ], + "B2": [ + -27, + -34.5, + -259.15, + ], + "B3": [ + -18, + -34.5, + -259.15, + ], + "B4": [ + -9, + -34.5, + -259.15, + ], + "B5": [ + 0, + -34.5, + -259.15, + ], + "B6": [ + 9, + -34.5, + -259.15, + ], + "B7": [ + 18, + -34.5, + -259.15, + ], + "B8": [ + 27, + -34.5, + -259.15, + ], + "B9": [ + 36, + -34.5, + -259.15, + ], + "C1": [ + -36, + -43.5, + -259.15, + ], + "C10": [ + 45, + -43.5, + -259.15, + ], + "C11": [ + 54, + -43.5, + -259.15, + ], + "C12": [ + 63, + -43.5, + -259.15, + ], + "C2": [ + -27, + -43.5, + -259.15, + ], + "C3": [ + -18, + -43.5, + -259.15, + ], + "C4": [ + -9, + -43.5, + -259.15, + ], + "C5": [ + 0, + -43.5, + -259.15, + ], + "C6": [ + 9, + -43.5, + -259.15, + ], + "C7": [ + 18, + -43.5, + -259.15, + ], + "C8": [ + 27, + -43.5, + -259.15, + ], + "C9": [ + 36, + -43.5, + -259.15, + ], + "D1": [ + -36, + -52.5, + -259.15, + ], + "D10": [ + 45, + -52.5, + -259.15, + ], + "D11": [ + 54, + -52.5, + -259.15, + ], + "D12": [ + 63, + -52.5, + -259.15, + ], + "D2": [ + -27, + -52.5, + -259.15, + ], + "D3": [ + -18, + -52.5, + -259.15, + ], + "D4": [ + -9, + -52.5, + -259.15, + ], + "D5": [ + 0, + -52.5, + -259.15, + ], + "D6": [ + 9, + -52.5, + -259.15, + ], + "D7": [ + 18, + -52.5, + -259.15, + ], + "D8": [ + 27, + -52.5, + -259.15, + ], + "D9": [ + 36, + -52.5, + -259.15, + ], + "E1": [ + -36, + -61.5, + -259.15, + ], + "E10": [ + 45, + -61.5, + -259.15, + ], + "E11": [ + 54, + -61.5, + -259.15, + ], + "E12": [ + 63, + -61.5, + -259.15, + ], + "E2": [ + -27, + -61.5, + -259.15, + ], + "E3": [ + -18, + -61.5, + -259.15, + ], + "E4": [ + -9, + -61.5, + -259.15, + ], + "E5": [ + 0, + -61.5, + -259.15, + ], + "E6": [ + 9, + -61.5, + -259.15, + ], + "E7": [ + 18, + -61.5, + -259.15, + ], + "E8": [ + 27, + -61.5, + -259.15, + ], + "E9": [ + 36, + -61.5, + -259.15, + ], + "F1": [ + -36, + -70.5, + -259.15, + ], + "F10": [ + 45, + -70.5, + -259.15, + ], + "F11": [ + 54, + -70.5, + -259.15, + ], + "F12": [ + 63, + -70.5, + -259.15, + ], + "F2": [ + -27, + -70.5, + -259.15, + ], + "F3": [ + -18, + -70.5, + -259.15, + ], + "F4": [ + -9, + -70.5, + -259.15, + ], + "F5": [ + 0, + -70.5, + -259.15, + ], + "F6": [ + 9, + -70.5, + -259.15, + ], + "F7": [ + 18, + -70.5, + -259.15, + ], + "F8": [ + 27, + -70.5, + -259.15, + ], + "F9": [ + 36, + -70.5, + -259.15, + ], + "G1": [ + -36, + -79.5, + -259.15, + ], + "G10": [ + 45, + -79.5, + -259.15, + ], + "G11": [ + 54, + -79.5, + -259.15, + ], + "G12": [ + 63, + -79.5, + -259.15, + ], + "G2": [ + -27, + -79.5, + -259.15, + ], + "G3": [ + -18, + -79.5, + -259.15, + ], + "G4": [ + -9, + -79.5, + -259.15, + ], + "G5": [ + 0, + -79.5, + -259.15, + ], + "G6": [ + 9, + -79.5, + -259.15, + ], + "G7": [ + 18, + -79.5, + -259.15, + ], + "G8": [ + 27, + -79.5, + -259.15, + ], + "G9": [ + 36, + -79.5, + -259.15, + ], + "H1": [ + -36, + -88.5, + -259.15, + ], + "H10": [ + 45, + -88.5, + -259.15, + ], + "H11": [ + 54, + -88.5, + -259.15, + ], + "H12": [ + 63, + -88.5, + -259.15, + ], + "H2": [ + -27, + -88.5, + -259.15, + ], + "H3": [ + -18, + -88.5, + -259.15, + ], + "H4": [ + -9, + -88.5, + -259.15, + ], + "H5": [ + 0, + -88.5, + -259.15, + ], + "H6": [ + 9, + -88.5, + -259.15, + ], + "H7": [ + 18, + -88.5, + -259.15, + ], + "H8": [ + 27, + -88.5, + -259.15, + ], + "H9": [ + 36, + -88.5, + -259.15, + ], }, - "gripForce": 16, - "gripHeightFromLabwareBottom": 23.9, - "groups": [ + "nozzleOffset": [ + -36, + -25.5, + -259.15, + ], + "orderedColumns": [ { - "metadata": {}, - "wells": [ + "key": "1", + "orderedNozzles": [ "A1", "B1", "C1", @@ -9143,6 +10153,11 @@ exports[`snapshot tests > makeContext 1`] = ` "F1", "G1", "H1", + ], + }, + { + "key": "2", + "orderedNozzles": [ "A2", "B2", "C2", @@ -9151,6 +10166,11 @@ exports[`snapshot tests > makeContext 1`] = ` "F2", "G2", "H2", + ], + }, + { + "key": "3", + "orderedNozzles": [ "A3", "B3", "C3", @@ -9159,6 +10179,11 @@ exports[`snapshot tests > makeContext 1`] = ` "F3", "G3", "H3", + ], + }, + { + "key": "4", + "orderedNozzles": [ "A4", "B4", "C4", @@ -9167,6 +10192,11 @@ exports[`snapshot tests > makeContext 1`] = ` "F4", "G4", "H4", + ], + }, + { + "key": "5", + "orderedNozzles": [ "A5", "B5", "C5", @@ -9175,6 +10205,11 @@ exports[`snapshot tests > makeContext 1`] = ` "F5", "G5", "H5", + ], + }, + { + "key": "6", + "orderedNozzles": [ "A6", "B6", "C6", @@ -9183,6 +10218,11 @@ exports[`snapshot tests > makeContext 1`] = ` "F6", "G6", "H6", + ], + }, + { + "key": "7", + "orderedNozzles": [ "A7", "B7", "C7", @@ -9191,6 +10231,11 @@ exports[`snapshot tests > makeContext 1`] = ` "F7", "G7", "H7", + ], + }, + { + "key": "8", + "orderedNozzles": [ "A8", "B8", "C8", @@ -9199,6 +10244,11 @@ exports[`snapshot tests > makeContext 1`] = ` "F8", "G8", "H8", + ], + }, + { + "key": "9", + "orderedNozzles": [ "A9", "B9", "C9", @@ -9207,6 +10257,11 @@ exports[`snapshot tests > makeContext 1`] = ` "F9", "G9", "H9", + ], + }, + { + "key": "10", + "orderedNozzles": [ "A10", "B10", "C10", @@ -9215,6 +10270,11 @@ exports[`snapshot tests > makeContext 1`] = ` "F10", "G10", "H10", + ], + }, + { + "key": "11", + "orderedNozzles": [ "A11", "B11", "C11", @@ -9223,6 +10283,11 @@ exports[`snapshot tests > makeContext 1`] = ` "F11", "G11", "H11", + ], + }, + { + "key": "12", + "orderedNozzles": [ "A12", "B12", "C12", @@ -9234,71 +10299,431 @@ exports[`snapshot tests > makeContext 1`] = ` ], }, ], - "metadata": { - "displayCategory": "tipRack", - "displayName": "Fixture Flex Tiprack 1000 uL", - "displayVolumeUnits": "µL", - "tags": [], + "orderedRows": [ + { + "key": "A", + "orderedNozzles": [ + "A1", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "A10", + "A11", + "A12", + ], + }, + { + "key": "B", + "orderedNozzles": [ + "B1", + "B2", + "B3", + "B4", + "B5", + "B6", + "B7", + "B8", + "B9", + "B10", + "B11", + "B12", + ], + }, + { + "key": "C", + "orderedNozzles": [ + "C1", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "C9", + "C10", + "C11", + "C12", + ], + }, + { + "key": "D", + "orderedNozzles": [ + "D1", + "D2", + "D3", + "D4", + "D5", + "D6", + "D7", + "D8", + "D9", + "D10", + "D11", + "D12", + ], + }, + { + "key": "E", + "orderedNozzles": [ + "E1", + "E2", + "E3", + "E4", + "E5", + "E6", + "E7", + "E8", + "E9", + "E10", + "E11", + "E12", + ], + }, + { + "key": "F", + "orderedNozzles": [ + "F1", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "F10", + "F11", + "F12", + ], + }, + { + "key": "G", + "orderedNozzles": [ + "G1", + "G2", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "G10", + "G11", + "G12", + ], + }, + { + "key": "H", + "orderedNozzles": [ + "H1", + "H2", + "H3", + "H4", + "H5", + "H6", + "H7", + "H8", + "H9", + "H10", + "H11", + "H12", + ], + }, + ], + "partialTipConfigurations": { + "availableConfigurations": [ + 1, + 8, + 12, + 96, + ], + "partialTipSupported": true, }, - "namespace": "fixture", - "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", + "pathTo3D": "pipette/definitions/2/geometry/ninety_six_channel/p1000/placeholder.gltf", + "pickUpTipConfigurations": { + "camAction": { + "connectTiprackDistanceMM": 7, + "currentByTipCount": { + "96": 1.5, + }, + "distance": 10, + "prep_move_distance": 9, + "prep_move_speed": 10, + "speed": 5.5, + }, + "pressFit": { + "currentByTipCount": { + "1": 0.2, + "12": 0.19, + "16": 0.25, + "2": 0.25, + "24": 0.38, + "3": 0.3, + "4": 0.35, + "48": 0.75, + "5": 0.4, + "6": 0.45, + "7": 0.5, + "8": 0.55, + }, + "distanceByTipCount": { + "1": 13, + "12": 13, + "16": 13, + "2": 13, + "24": 13, + "3": 13, + "4": 13, + "48": 13, + "5": 13, + "6": 13, + "7": 13, + "8": 13, + }, + "increment": 0, + "presses": 1, + "speedByTipCount": { + "1": 10, + "12": 10, + "16": 10, + "2": 10, + "24": 10, + "3": 10, + "4": 10, + "48": 10, + "5": 10, + "6": 10, + "7": 10, + "8": 10, + }, + }, + }, + "pipetteBoundingBoxOffsets": { + "backLeftCorner": [ + -67, + -3.5, + -259.15, ], - [ - "A5", - "B5", - "C5", - "D5", - "E5", - "F5", - "G5", - "H5", + "frontRightCorner": [ + 94, + -113, + -259.15, ], - [ - "A6", - "B6", - "C6", - "D6", - "E6", - "F6", + }, + "plungerHomingConfigurations": { + "current": 2, + "speed": 5, + }, + "plungerMotorConfigurations": { + "idle": 0.3, + "run": 2, + }, + "plungerPositionsConfigurations": { + "default": { + "blowout": 71, + "bottom": 66, + "drop": 80, + "top": 0, + }, + }, + "quirks": [], + "shaftDiameter": 9, + "shaftULperMM": 63.617, + "tipPresenceCheckDistanceMM": 8, + }, + "tiprackDefURI": "fixture/fixture_flex_96_tiprack_1000ul/1", + "tiprackLabwareDef": { + "brand": { + "brand": "Fixture", + "brandId": [], + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0, + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.75, + "zDimension": 99, + }, + "gripForce": 16, + "gripHeightFromLabwareBottom": 23.9, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1", + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2", + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3", + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4", + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5", + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6", + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7", + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8", + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9", + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10", + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11", + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12", + ], + }, + ], + "metadata": { + "displayCategory": "tipRack", + "displayName": "Fixture Flex Tiprack 1000 uL", + "displayVolumeUnits": "µL", + "tags": [], + }, + "namespace": "fixture", + "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", ], @@ -10253,45 +11678,187 @@ exports[`snapshot tests > makeContext 1`] = ` "id": "p10MultiId", "name": "p10_multi", "spec": { - "channels": 8, - "defaultAspirateFlowRate": { - "max": 50, - "min": 0.001, - "value": 5, - }, - "defaultBlowOutFlowRate": { - "max": 1000, - "min": 5, - "value": 1000, + "$otSharedSchema": "#/pipette/schemas/2/pipetteGeometrySchema.json", + "availableSensors": { + "sensors": [], }, - "defaultDispenseFlowRate": { - "max": 50, - "min": 0.001, - "value": 10, - }, - "displayName": "P10 8-Channel", - "maxVolume": 10, - "minVolume": 1, - }, - "tiprackDefURI": "fixture/fixture_tiprack_10_ul/1", - "tiprackLabwareDef": { - "brand": { - "brand": "Opentrons", + "backCompatNames": [], + "backlashDistance": 0, + "channels": 8, + "displayCategory": "GEN1", + "displayName": "P10 8-Channel GEN1", + "dropTipConfigurations": { + "plungerEject": { + "current": 0.5, + "speed": 5, + }, }, - "cornerOffsetFromSlot": { - "x": 0, - "y": 0, - "z": 0, + "liquids": { + "default": { + "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", + "defaultTipOverlapDictionary": { + "default": 3.29, + "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 1, + "opentrons/geb_96_tiprack_10ul/1": 6.2, + "opentrons/opentrons_96_filtertiprack_10ul/1": 3.29, + "opentrons/opentrons_96_tiprack_10ul/1": 3.29, + }, + "defaultTipracks": [ + "opentrons/opentrons_96_tiprack_10ul/1", + "opentrons/opentrons_96_filtertiprack_10ul/1", + "opentrons/geb_96_tiprack_10ul/1", + ], + "maxVolume": 10, + "minVolume": 1, + "supportedTips": { + "t10": { + "aspirate": { + "default": { + "1": [ + [ + 1.893415617, + -1.1069, + 3.042593193, + ], + [ + 2.497849452, + -0.1888, + 1.30410391, + ], + [ + 5.649462387, + -0.0081, + 0.8528667891, + ], + [ + 12.74444519, + -0.0018, + 0.8170558891, + ], + ], + "2": [ + [ + 1.438649211, + 0.01931415115, + 0.691538317, + ], + [ + 1.836824579, + 0.03868955123, + 0.6636639129, + ], + [ + 2.960052684, + 0.00470371018, + 0.7260899411, + ], + [ + 4.487508789, + 0.005175245625, + 0.7246941713, + ], + [ + 10.59661421, + 0.001470408978, + 0.7413196584, + ], + ], + }, + }, + "defaultAspirateFlowRate": { + "default": 5, + "valuesByApiLevel": { + "2.0": 5, + }, + }, + "defaultBlowOutFlowRate": { + "default": 1000, + "valuesByApiLevel": { + "2.0": 1000, + }, + }, + "defaultDispenseFlowRate": { + "default": 10, + "valuesByApiLevel": { + "2.0": 10, + }, + }, + "defaultPushOutVolume": 0, + "defaultTipLength": 33, + "dispense": { + "default": { + "1": [ + [ + 12.74444519, + 0, + 0.8058688085, + ], + ], + "2": [ + [ + 12.74444519, + 0, + 0.8058688085, + ], + ], + }, + }, + }, + }, + }, }, - "dimensions": { - "xDimension": 127.75, - "yDimension": 85.5, - "zDimension": 52.25, + "model": "p10", + "nozzleMap": { + "A1": [ + 0, + 31.5, + 0.8, + ], + "B1": [ + 0, + 22.5, + 0.8, + ], + "C1": [ + 0, + 13.5, + 0.8, + ], + "D1": [ + 0, + 4.5, + 0.8, + ], + "E1": [ + 0, + -4.5, + 0.8, + ], + "F1": [ + 0, + -13.5, + 0.8, + ], + "G1": [ + 0, + -22.5, + 0.8, + ], + "H1": [ + 0, + -31.5, + 0.8, + ], }, - "groups": [ + "nozzleOffset": [ + 0, + 31.5, + 0.8, + ], + "orderedColumns": [ { - "metadata": {}, - "wells": [ + "key": "1", + "orderedNozzles": [ "A1", "B1", "C1", @@ -10300,43 +11867,207 @@ exports[`snapshot tests > makeContext 1`] = ` "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", + ], + }, + ], + "orderedRows": [ + { + "key": "A", + "orderedNozzles": [ + "A1", + ], + }, + { + "key": "B", + "orderedNozzles": [ + "B1", + ], + }, + { + "key": "C", + "orderedNozzles": [ + "C1", + ], + }, + { + "key": "D", + "orderedNozzles": [ + "D1", + ], + }, + { + "key": "E", + "orderedNozzles": [ + "E1", + ], + }, + { + "key": "F", + "orderedNozzles": [ + "F1", + ], + }, + { + "key": "G", + "orderedNozzles": [ + "G1", + ], + }, + { + "key": "H", + "orderedNozzles": [ + "H1", + ], + }, + ], + "partialTipConfigurations": { + "availableConfigurations": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + ], + "partialTipSupported": true, + }, + "pathTo3D": "pipette/definitions/2/geometry/eight_channel/p10/placeholder.gltf", + "pickUpTipConfigurations": { + "pressFit": { + "currentByTipCount": { + "1": 0.1, + "2": 0.1, + "3": 0.15, + "4": 0.2, + "5": 0.25, + "6": 0.3, + "7": 0.35, + "8": 0.4, + }, + "distanceByTipCount": { + "1": 10, + "2": 10, + "3": 10, + "4": 10, + "5": 10, + "6": 10, + "7": 10, + "8": 10, + }, + "increment": 1, + "presses": 3, + "speedByTipCount": { + "1": 30, + "2": 30, + "3": 30, + "4": 30, + "5": 30, + "6": 30, + "7": 30, + "8": 30, + }, + }, + }, + "pipetteBoundingBoxOffsets": { + "backLeftCorner": [ + -16, + 44.49, + 0.8, + ], + "frontRightCorner": [ + 16, + -44.49, + 0.8, + ], + }, + "plungerHomingConfigurations": { + "current": 0.5, + "speed": 30, + }, + "plungerMotorConfigurations": { + "idle": 0.05, + "run": 0.5, + }, + "plungerPositionsConfigurations": { + "default": { + "blowout": -1, + "bottom": 2, + "drop": -4, + "top": 19.5, + }, + }, + "quirks": [ + "dropTipShake", + ], + "shaftDiameter": 1, + "shaftULperMM": 0.785, + }, + "tiprackDefURI": "fixture/fixture_tiprack_10_ul/1", + "tiprackLabwareDef": { + "brand": { + "brand": "Opentrons", + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0, + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.5, + "zDimension": 52.25, + }, + "groups": [ + { + "metadata": {}, + "wells": [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1", + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2", + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3", + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4", + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5", + "A6", + "B6", + "C6", + "D6", + "E6", "F6", "G6", "H6", @@ -11407,25 +13138,222 @@ exports[`snapshot tests > makeContext 1`] = ` "id": "p10SingleId", "name": "p10_single", "spec": { + "$otSharedSchema": "#/pipette/schemas/2/pipetteGeometrySchema.json", + "availableSensors": { + "sensors": [], + }, + "backCompatNames": [], + "backlashDistance": 0, "channels": 1, - "defaultAspirateFlowRate": { - "max": 50, - "min": 0.001, - "value": 5, + "displayCategory": "GEN1", + "displayName": "P10 Single-Channel GEN1", + "dropTipConfigurations": { + "plungerEject": { + "current": 0.5, + "speed": 5, + }, + }, + "liquids": { + "default": { + "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", + "defaultTipOverlapDictionary": { + "default": 3.29, + "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 1, + "opentrons/geb_96_tiprack_10ul/1": 6.2, + "opentrons/opentrons_96_filtertiprack_10ul/1": 3.29, + "opentrons/opentrons_96_tiprack_10ul/1": 3.29, + }, + "defaultTipracks": [ + "opentrons/opentrons_96_tiprack_10ul/1", + "opentrons/opentrons_96_filtertiprack_10ul/1", + "opentrons/geb_96_tiprack_10ul/1", + ], + "maxVolume": 10, + "minVolume": 1, + "supportedTips": { + "t10": { + "aspirate": { + "default": { + "1": [ + [ + 1.8263, + -0.0958, + 1.088, + ], + [ + 2.5222, + -0.104, + 1.1031, + ], + [ + 3.2354, + -0.0447, + 0.9536, + ], + [ + 3.9984, + -0.012, + 0.8477, + ], + [ + 12.5135, + -0.0021, + 0.8079, + ], + ], + "2": [ + [ + 1.438649211, + 0.01931415115, + 0.691538317, + ], + [ + 1.836824579, + 0.03868955123, + 0.6636639129, + ], + [ + 2.960052684, + 0.00470371018, + 0.7260899411, + ], + [ + 4.487508789, + 0.005175245625, + 0.7246941713, + ], + [ + 10.59661421, + 0.001470408978, + 0.7413196584, + ], + ], + }, + }, + "defaultAspirateFlowRate": { + "default": 5, + "valuesByApiLevel": { + "2.0": 5, + }, + }, + "defaultBlowOutFlowRate": { + "default": 1000, + "valuesByApiLevel": { + "2.0": 1000, + }, + }, + "defaultDispenseFlowRate": { + "default": 10, + "valuesByApiLevel": { + "2.0": 10, + }, + }, + "defaultPushOutVolume": 0, + "defaultTipLength": 33, + "dispense": { + "default": { + "1": [ + [ + 12.5135, + 0, + 0.7945, + ], + ], + "2": [ + [ + 12.5135, + 0, + 0.7945, + ], + ], + }, + }, + }, + }, + }, + }, + "model": "p10", + "nozzleMap": { + "A1": [ + 0, + 0, + 12, + ], + }, + "nozzleOffset": [ + 0, + 0, + 12, + ], + "orderedColumns": [ + { + "key": "1", + "orderedNozzles": [ + "A1", + ], + }, + ], + "orderedRows": [ + { + "key": "A", + "orderedNozzles": [ + "A1", + ], + }, + ], + "partialTipConfigurations": { + "availableConfigurations": null, + "partialTipSupported": false, + }, + "pathTo3D": "pipette/definitions/2/geometry/single_channel/p10/placeholder.gltf", + "pickUpTipConfigurations": { + "pressFit": { + "currentByTipCount": { + "1": 0.1, + }, + "distanceByTipCount": { + "1": 10, + }, + "increment": 1, + "presses": 3, + "speedByTipCount": { + "1": 30, + }, + }, + }, + "pipetteBoundingBoxOffsets": { + "backLeftCorner": [ + 0, + 0, + 12, + ], + "frontRightCorner": [ + 0, + 0, + 12, + ], }, - "defaultBlowOutFlowRate": { - "max": 1000, - "min": 5, - "value": 1000, + "plungerHomingConfigurations": { + "current": 0.3, + "speed": 30, }, - "defaultDispenseFlowRate": { - "max": 50, - "min": 0.001, - "value": 10, + "plungerMotorConfigurations": { + "idle": 0.05, + "run": 0.3, }, - "displayName": "P10 Single-Channel", - "maxVolume": 10, - "minVolume": 1, + "plungerPositionsConfigurations": { + "default": { + "blowout": -1, + "bottom": 2, + "drop": -4.5, + "top": 19.5, + }, + }, + "quirks": [ + "dropTipShake", + ], + "shaftDiameter": 1, + "shaftULperMM": 0.785, }, "tiprackDefURI": "fixture/fixture_tiprack_10_ul/1", "tiprackLabwareDef": { @@ -12561,25 +14489,334 @@ exports[`snapshot tests > makeContext 1`] = ` "id": "p300MultiId", "name": "p300_multi", "spec": { + "$otSharedSchema": "#/pipette/schemas/2/pipetteGeometrySchema.json", + "availableSensors": { + "sensors": [], + }, + "backCompatNames": [], + "backlashDistance": 0, "channels": 8, - "defaultAspirateFlowRate": { - "max": 600, - "min": 0.001, - "value": 150, + "displayCategory": "GEN1", + "displayName": "P300 8-Channel GEN1", + "dropTipConfigurations": { + "plungerEject": { + "current": 0.5, + "speed": 5, + }, + }, + "liquids": { + "default": { + "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", + "defaultTipOverlapDictionary": { + "default": 7.47, + "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47, + "opentrons/opentrons_96_tiprack_300ul/1": 7.47, + "opentrons/tipone_96_tiprack_200ul/1": 6.1, + }, + "defaultTipracks": [ + "opentrons/opentrons_96_tiprack_300ul/1", + "opentrons/opentrons_96_filtertiprack_200ul/1", + ], + "maxVolume": 300, + "minVolume": 30, + "supportedTips": { + "t200": { + "aspirate": { + "default": { + "1": [ + [ + 57.25698968, + 0.017, + 18.132, + ], + [ + 309.2612689, + 0.001, + 19.03, + ], + ], + }, + }, + "defaultAspirateFlowRate": { + "default": 150, + "valuesByApiLevel": { + "2.0": 150, + }, + }, + "defaultBlowOutFlowRate": { + "default": 1000, + "valuesByApiLevel": { + "2.0": 1000, + }, + }, + "defaultDispenseFlowRate": { + "default": 300, + "valuesByApiLevel": { + "2.0": 300, + }, + }, + "defaultPushOutVolume": 0, + "defaultTipLength": 51.7, + "dispense": { + "default": { + "1": [ + [ + 309.2612689, + 0, + 19.29389273, + ], + ], + }, + }, + }, + "t300": { + "aspirate": { + "default": { + "1": [ + [ + 57.25698968, + 0.017, + 18.132, + ], + [ + 309.2612689, + 0.001, + 19.03, + ], + ], + }, + }, + "defaultAspirateFlowRate": { + "default": 150, + "valuesByApiLevel": { + "2.0": 150, + }, + }, + "defaultBlowOutFlowRate": { + "default": 1000, + "valuesByApiLevel": { + "2.0": 1000, + }, + }, + "defaultDispenseFlowRate": { + "default": 300, + "valuesByApiLevel": { + "2.0": 300, + }, + }, + "defaultPushOutVolume": 0, + "defaultTipLength": 51.7, + "dispense": { + "default": { + "1": [ + [ + 309.2612689, + 0, + 19.29389273, + ], + ], + }, + }, + }, + }, + }, + }, + "model": "p300", + "nozzleMap": { + "A1": [ + 0, + 31.5, + 0.8, + ], + "B1": [ + 0, + 22.5, + 0.8, + ], + "C1": [ + 0, + 13.5, + 0.8, + ], + "D1": [ + 0, + 4.5, + 0.8, + ], + "E1": [ + 0, + -4.5, + 0.8, + ], + "F1": [ + 0, + -13.5, + 0.8, + ], + "G1": [ + 0, + -22.5, + 0.8, + ], + "H1": [ + 0, + -31.5, + 0.8, + ], + }, + "nozzleOffset": [ + 0, + 31.5, + 0.8, + ], + "orderedColumns": [ + { + "key": "1", + "orderedNozzles": [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1", + ], + }, + ], + "orderedRows": [ + { + "key": "A", + "orderedNozzles": [ + "A1", + ], + }, + { + "key": "B", + "orderedNozzles": [ + "B1", + ], + }, + { + "key": "C", + "orderedNozzles": [ + "C1", + ], + }, + { + "key": "D", + "orderedNozzles": [ + "D1", + ], + }, + { + "key": "E", + "orderedNozzles": [ + "E1", + ], + }, + { + "key": "F", + "orderedNozzles": [ + "F1", + ], + }, + { + "key": "G", + "orderedNozzles": [ + "G1", + ], + }, + { + "key": "H", + "orderedNozzles": [ + "H1", + ], + }, + ], + "partialTipConfigurations": { + "availableConfigurations": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + ], + "partialTipSupported": true, + }, + "pathTo3D": "pipette/definitions/2/geometry/eight_channel/p300/placeholder.gltf", + "pickUpTipConfigurations": { + "pressFit": { + "currentByTipCount": { + "1": 0.1, + "2": 0.15, + "3": 0.23, + "4": 0.3, + "5": 0.38, + "6": 0.45, + "7": 0.53, + "8": 0.6, + }, + "distanceByTipCount": { + "1": 10, + "2": 10, + "3": 10, + "4": 10, + "5": 10, + "6": 10, + "7": 10, + "8": 10, + }, + "increment": 1, + "presses": 3, + "speedByTipCount": { + "1": 30, + "2": 30, + "3": 30, + "4": 30, + "5": 30, + "6": 30, + "7": 30, + "8": 30, + }, + }, }, - "defaultBlowOutFlowRate": { - "max": 275, - "min": 1, - "value": 94, + "pipetteBoundingBoxOffsets": { + "backLeftCorner": [ + -16, + 44.49, + 0.8, + ], + "frontRightCorner": [ + 16, + -44.49, + 0.8, + ], + }, + "plungerHomingConfigurations": { + "current": 0.5, + "speed": 30, + }, + "plungerMotorConfigurations": { + "idle": 0.05, + "run": 0.5, }, - "defaultDispenseFlowRate": { - "max": 600, - "min": 0.001, - "value": 300, + "plungerPositionsConfigurations": { + "default": { + "blowout": 3, + "bottom": 3.5, + "drop": -2, + "top": 19.5, + }, }, - "displayName": "P300 8-Channel", - "maxVolume": 300, - "minVolume": 30, + "quirks": [ + "dropTipShake", + ], + "shaftDiameter": 5, + "shaftULperMM": 19.635, }, "tiprackDefURI": "fixture/fixture_tiprack_300_ul/1", "tiprackLabwareDef": { @@ -13709,25 +15946,328 @@ exports[`snapshot tests > makeContext 1`] = ` "id": "p300SingleId", "name": "p300_single", "spec": { + "$otSharedSchema": "#/pipette/schemas/2/pipetteGeometrySchema.json", + "availableSensors": { + "sensors": [], + }, + "backCompatNames": [], + "backlashDistance": 0, "channels": 1, - "defaultAspirateFlowRate": { - "max": 600, - "min": 0.001, - "value": 150, + "displayCategory": "GEN1", + "displayName": "P300 Single-Channel GEN1", + "dropTipConfigurations": { + "plungerEject": { + "current": 0.5, + "speed": 5, + }, + }, + "liquids": { + "default": { + "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", + "defaultTipOverlapDictionary": { + "default": 7.47, + "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47, + "opentrons/opentrons_96_tiprack_300ul/1": 7.47, + "opentrons/tipone_96_tiprack_200ul/1": 6.1, + }, + "defaultTipracks": [ + "opentrons/opentrons_96_tiprack_300ul/1", + "opentrons/opentrons_96_filtertiprack_200ul/1", + ], + "maxVolume": 300, + "minVolume": 30, + "supportedTips": { + "t200": { + "aspirate": { + "default": { + "1": [ + [ + 36.19844973, + 0.043, + 16.548, + ], + [ + 54.98518519, + 0.012, + 17.658, + ], + [ + 73.90077516, + 0.008, + 17.902, + ], + [ + 111.8437953, + 0.004, + 18.153, + ], + [ + 302.3895337, + 0.001, + 18.23, + ], + ], + "2": [ + [ + 53.958, + 0.0252, + 16.6268, + ], + [ + 73.0217, + 0.0141, + 17.2234, + ], + [ + 82.6834, + 0.0123, + 17.3586, + ], + [ + 120.7877, + 0.0055, + 17.9214, + ], + [ + 197.3909, + 0.0028, + 18.2415, + ], + [ + 300, + 0.0014, + 18.5235, + ], + ], + }, + }, + "defaultAspirateFlowRate": { + "default": 150, + "valuesByApiLevel": { + "2.0": 150, + }, + }, + "defaultBlowOutFlowRate": { + "default": 1000, + "valuesByApiLevel": { + "2.0": 1000, + }, + }, + "defaultDispenseFlowRate": { + "default": 300, + "valuesByApiLevel": { + "2.0": 300, + }, + }, + "defaultPushOutVolume": 0, + "defaultTipLength": 51.7, + "dispense": { + "default": { + "1": [ + [ + 302.3895337, + 0, + 18.83156277, + ], + ], + "2": [ + [ + 302.3895337, + 0, + 18.83156277, + ], + ], + }, + }, + }, + "t300": { + "aspirate": { + "default": { + "1": [ + [ + 36.19844973, + 0.043, + 16.548, + ], + [ + 54.98518519, + 0.012, + 17.658, + ], + [ + 73.90077516, + 0.008, + 17.902, + ], + [ + 111.8437953, + 0.004, + 18.153, + ], + [ + 302.3895337, + 0.001, + 18.23, + ], + ], + "2": [ + [ + 53.958, + 0.0252, + 16.6268, + ], + [ + 73.0217, + 0.0141, + 17.2234, + ], + [ + 82.6834, + 0.0123, + 17.3586, + ], + [ + 120.7877, + 0.0055, + 17.9214, + ], + [ + 197.3909, + 0.0028, + 18.2415, + ], + [ + 300, + 0.0014, + 18.5235, + ], + ], + }, + }, + "defaultAspirateFlowRate": { + "default": 150, + "valuesByApiLevel": { + "2.0": 150, + }, + }, + "defaultBlowOutFlowRate": { + "default": 1000, + "valuesByApiLevel": { + "2.0": 1000, + }, + }, + "defaultDispenseFlowRate": { + "default": 300, + "valuesByApiLevel": { + "2.0": 300, + }, + }, + "defaultPushOutVolume": 0, + "defaultTipLength": 51.7, + "dispense": { + "default": { + "1": [ + [ + 302.3895337, + 0, + 18.83156277, + ], + ], + "2": [ + [ + 302.3895337, + 0, + 18.83156277, + ], + ], + }, + }, + }, + }, + }, + }, + "model": "p300", + "nozzleMap": { + "A1": [ + 0, + 0, + 25, + ], + }, + "nozzleOffset": [ + 0, + 0, + 25, + ], + "orderedColumns": [ + { + "key": "1", + "orderedNozzles": [ + "A1", + ], + }, + ], + "orderedRows": [ + { + "key": "A", + "orderedNozzles": [ + "A1", + ], + }, + ], + "partialTipConfigurations": { + "availableConfigurations": null, + "partialTipSupported": false, + }, + "pathTo3D": "pipette/definitions/2/geometry/single_channel/p300/placeholder.gltf", + "pickUpTipConfigurations": { + "pressFit": { + "currentByTipCount": { + "1": 0.1, + }, + "distanceByTipCount": { + "1": 10, + }, + "increment": 1, + "presses": 3, + "speedByTipCount": { + "1": 30, + }, + }, }, - "defaultBlowOutFlowRate": { - "max": 1000, - "min": 5, - "value": 1000, + "pipetteBoundingBoxOffsets": { + "backLeftCorner": [ + 0, + 0, + 25, + ], + "frontRightCorner": [ + 0, + 0, + 25, + ], + }, + "plungerHomingConfigurations": { + "current": 0.3, + "speed": 30, + }, + "plungerMotorConfigurations": { + "idle": 0.05, + "run": 0.3, }, - "defaultDispenseFlowRate": { - "max": 600, - "min": 0.001, - "value": 300, + "plungerPositionsConfigurations": { + "default": { + "blowout": 0, + "bottom": 1.5, + "drop": -4, + "top": 19.5, + }, }, - "displayName": "P300 Single-Channel", - "maxVolume": 300, - "minVolume": 30, + "quirks": [ + "dropTipShake", + ], + "shaftDiameter": 5, + "shaftULperMM": 19.635, }, "tiprackDefURI": "fixture/fixture_tiprack_300_ul/1", "tiprackLabwareDef": { @@ -15458,16206 +17998,277 @@ exports[`snapshot tests > makeState 1`] = ` "G2": {}, "G3": {}, "G4": {}, - "G5": {}, - "G6": {}, - "G7": {}, - "G8": {}, - "G9": {}, - "H1": {}, - "H10": {}, - "H11": {}, - "H12": {}, - "H2": {}, - "H3": {}, - "H4": {}, - "H5": {}, - "H6": {}, - "H7": {}, - "H8": {}, - "H9": {}, - }, - "tiprack5AdapterId": {}, - "tiprack5Id": { - "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": {}, - }, - "troughId": { - "A1": {}, - "A10": {}, - "A11": {}, - "A12": {}, - "A2": {}, - "A3": {}, - "A4": {}, - "A5": {}, - "A6": {}, - "A7": {}, - "A8": {}, - "A9": {}, - }, - }, - "pipettes": { - "p100096Id": { - "0": {}, - "1": {}, - "10": {}, - "11": {}, - "12": {}, - "13": {}, - "14": {}, - "15": {}, - "16": {}, - "17": {}, - "18": {}, - "19": {}, - "2": {}, - "20": {}, - "21": {}, - "22": {}, - "23": {}, - "24": {}, - "25": {}, - "26": {}, - "27": {}, - "28": {}, - "29": {}, - "3": {}, - "30": {}, - "31": {}, - "32": {}, - "33": {}, - "34": {}, - "35": {}, - "36": {}, - "37": {}, - "38": {}, - "39": {}, - "4": {}, - "40": {}, - "41": {}, - "42": {}, - "43": {}, - "44": {}, - "45": {}, - "46": {}, - "47": {}, - "48": {}, - "49": {}, - "5": {}, - "50": {}, - "51": {}, - "52": {}, - "53": {}, - "54": {}, - "55": {}, - "56": {}, - "57": {}, - "58": {}, - "59": {}, - "6": {}, - "60": {}, - "61": {}, - "62": {}, - "63": {}, - "64": {}, - "65": {}, - "66": {}, - "67": {}, - "68": {}, - "69": {}, - "7": {}, - "70": {}, - "71": {}, - "72": {}, - "73": {}, - "74": {}, - "75": {}, - "76": {}, - "77": {}, - "78": {}, - "79": {}, - "8": {}, - "80": {}, - "81": {}, - "82": {}, - "83": {}, - "84": {}, - "85": {}, - "86": {}, - "87": {}, - "88": {}, - "89": {}, - "9": {}, - "90": {}, - "91": {}, - "92": {}, - "93": {}, - "94": {}, - "95": {}, - }, - "p10MultiId": { - "0": {}, - "1": {}, - "2": {}, - "3": {}, - "4": {}, - "5": {}, - "6": {}, - "7": {}, - }, - "p10SingleId": { - "0": {}, - }, - "p300MultiId": { - "0": {}, - "1": {}, - "2": {}, - "3": {}, - "4": {}, - "5": {}, - "6": {}, - "7": {}, - }, - "p300SingleId": { - "0": {}, - }, - }, - }, - "modules": {}, - "pipettes": { - "p300SingleId": { - "mount": "left", - }, - }, - "tipState": { - "pipettes": { - "p300SingleId": false, - }, - "tipracks": { - "tiprack1Id": { - "A1": true, - "A10": true, - "A11": true, - "A12": true, - "A2": true, - "A3": true, - "A4": true, - "A5": true, - "A6": true, - "A7": true, - "A8": true, - "A9": true, - "B1": true, - "B10": true, - "B11": true, - "B12": true, - "B2": true, - "B3": true, - "B4": true, - "B5": true, - "B6": true, - "B7": true, - "B8": true, - "B9": true, - "C1": true, - "C10": true, - "C11": true, - "C12": true, - "C2": true, - "C3": true, - "C4": true, - "C5": true, - "C6": true, - "C7": true, - "C8": true, - "C9": true, - "D1": true, - "D10": true, - "D11": true, - "D12": true, - "D2": true, - "D3": true, - "D4": true, - "D5": true, - "D6": true, - "D7": true, - "D8": true, - "D9": true, - "E1": true, - "E10": true, - "E11": true, - "E12": true, - "E2": true, - "E3": true, - "E4": true, - "E5": true, - "E6": true, - "E7": true, - "E8": true, - "E9": true, - "F1": true, - "F10": true, - "F11": true, - "F12": true, - "F2": true, - "F3": true, - "F4": true, - "F5": true, - "F6": true, - "F7": true, - "F8": true, - "F9": true, - "G1": true, - "G10": true, - "G11": true, - "G12": true, - "G2": true, - "G3": true, - "G4": true, - "G5": true, - "G6": true, - "G7": true, - "G8": true, - "G9": true, - "H1": true, - "H10": true, - "H11": true, - "H12": true, - "H2": true, - "H3": true, - "H4": true, - "H5": true, - "H6": true, - "H7": true, - "H8": true, - "H9": true, - }, - "tiprack2Id": { - "A1": false, - "A10": false, - "A11": false, - "A12": false, - "A2": false, - "A3": false, - "A4": false, - "A5": false, - "A6": false, - "A7": false, - "A8": false, - "A9": false, - "B1": false, - "B10": false, - "B11": false, - "B12": false, - "B2": false, - "B3": false, - "B4": false, - "B5": false, - "B6": false, - "B7": false, - "B8": false, - "B9": false, - "C1": false, - "C10": false, - "C11": false, - "C12": false, - "C2": false, - "C3": false, - "C4": false, - "C5": false, - "C6": false, - "C7": false, - "C8": false, - "C9": false, - "D1": false, - "D10": false, - "D11": false, - "D12": false, - "D2": false, - "D3": false, - "D4": false, - "D5": false, - "D6": false, - "D7": false, - "D8": false, - "D9": false, - "E1": false, - "E10": false, - "E11": false, - "E12": false, - "E2": false, - "E3": false, - "E4": false, - "E5": false, - "E6": false, - "E7": false, - "E8": false, - "E9": false, - "F1": false, - "F10": false, - "F11": false, - "F12": false, - "F2": false, - "F3": false, - "F4": false, - "F5": false, - "F6": false, - "F7": false, - "F8": false, - "F9": false, - "G1": false, - "G10": false, - "G11": false, - "G12": false, - "G2": false, - "G3": false, - "G4": false, - "G5": false, - "G6": false, - "G7": false, - "G8": false, - "G9": false, - "H1": false, - "H10": false, - "H11": false, - "H12": false, - "H2": false, - "H3": false, - "H4": false, - "H5": false, - "H6": false, - "H7": false, - "H8": false, - "H9": false, - }, - }, - }, -} -`; - -exports[`snapshot tests createEmptyLiquidState 1`] = ` -Object { - "additionalEquipment": Object { - "fixedTrash": Object {}, - }, - "labware": Object { - "destPlateId": Object { - "A1": Object {}, - "A10": Object {}, - "A11": Object {}, - "A12": Object {}, - "A2": Object {}, - "A3": Object {}, - "A4": Object {}, - "A5": Object {}, - "A6": Object {}, - "A7": Object {}, - "A8": Object {}, - "A9": Object {}, - "B1": Object {}, - "B10": Object {}, - "B11": Object {}, - "B12": Object {}, - "B2": Object {}, - "B3": Object {}, - "B4": Object {}, - "B5": Object {}, - "B6": Object {}, - "B7": Object {}, - "B8": Object {}, - "B9": Object {}, - "C1": Object {}, - "C10": Object {}, - "C11": Object {}, - "C12": Object {}, - "C2": Object {}, - "C3": Object {}, - "C4": Object {}, - "C5": Object {}, - "C6": Object {}, - "C7": Object {}, - "C8": Object {}, - "C9": Object {}, - "D1": Object {}, - "D10": Object {}, - "D11": Object {}, - "D12": Object {}, - "D2": Object {}, - "D3": Object {}, - "D4": Object {}, - "D5": Object {}, - "D6": Object {}, - "D7": Object {}, - "D8": Object {}, - "D9": Object {}, - "E1": Object {}, - "E10": Object {}, - "E11": Object {}, - "E12": Object {}, - "E2": Object {}, - "E3": Object {}, - "E4": Object {}, - "E5": Object {}, - "E6": Object {}, - "E7": Object {}, - "E8": Object {}, - "E9": Object {}, - "F1": Object {}, - "F10": Object {}, - "F11": Object {}, - "F12": Object {}, - "F2": Object {}, - "F3": Object {}, - "F4": Object {}, - "F5": Object {}, - "F6": Object {}, - "F7": Object {}, - "F8": Object {}, - "F9": Object {}, - "G1": Object {}, - "G10": Object {}, - "G11": Object {}, - "G12": Object {}, - "G2": Object {}, - "G3": Object {}, - "G4": Object {}, - "G5": Object {}, - "G6": Object {}, - "G7": Object {}, - "G8": Object {}, - "G9": Object {}, - "H1": Object {}, - "H10": Object {}, - "H11": Object {}, - "H12": Object {}, - "H2": Object {}, - "H3": Object {}, - "H4": Object {}, - "H5": Object {}, - "H6": Object {}, - "H7": Object {}, - "H8": Object {}, - "H9": Object {}, - }, - "sourcePlateId": Object { - "A1": Object {}, - "A10": Object {}, - "A11": Object {}, - "A12": Object {}, - "A2": Object {}, - "A3": Object {}, - "A4": Object {}, - "A5": Object {}, - "A6": Object {}, - "A7": Object {}, - "A8": Object {}, - "A9": Object {}, - "B1": Object {}, - "B10": Object {}, - "B11": Object {}, - "B12": Object {}, - "B2": Object {}, - "B3": Object {}, - "B4": Object {}, - "B5": Object {}, - "B6": Object {}, - "B7": Object {}, - "B8": Object {}, - "B9": Object {}, - "C1": Object {}, - "C10": Object {}, - "C11": Object {}, - "C12": Object {}, - "C2": Object {}, - "C3": Object {}, - "C4": Object {}, - "C5": Object {}, - "C6": Object {}, - "C7": Object {}, - "C8": Object {}, - "C9": Object {}, - "D1": Object {}, - "D10": Object {}, - "D11": Object {}, - "D12": Object {}, - "D2": Object {}, - "D3": Object {}, - "D4": Object {}, - "D5": Object {}, - "D6": Object {}, - "D7": Object {}, - "D8": Object {}, - "D9": Object {}, - "E1": Object {}, - "E10": Object {}, - "E11": Object {}, - "E12": Object {}, - "E2": Object {}, - "E3": Object {}, - "E4": Object {}, - "E5": Object {}, - "E6": Object {}, - "E7": Object {}, - "E8": Object {}, - "E9": Object {}, - "F1": Object {}, - "F10": Object {}, - "F11": Object {}, - "F12": Object {}, - "F2": Object {}, - "F3": Object {}, - "F4": Object {}, - "F5": Object {}, - "F6": Object {}, - "F7": Object {}, - "F8": Object {}, - "F9": Object {}, - "G1": Object {}, - "G10": Object {}, - "G11": Object {}, - "G12": Object {}, - "G2": Object {}, - "G3": Object {}, - "G4": Object {}, - "G5": Object {}, - "G6": Object {}, - "G7": Object {}, - "G8": Object {}, - "G9": Object {}, - "H1": Object {}, - "H10": Object {}, - "H11": Object {}, - "H12": Object {}, - "H2": Object {}, - "H3": Object {}, - "H4": Object {}, - "H5": Object {}, - "H6": Object {}, - "H7": Object {}, - "H8": Object {}, - "H9": Object {}, - }, - "tiprack1Id": Object { - "A1": Object {}, - "A10": Object {}, - "A11": Object {}, - "A12": Object {}, - "A2": Object {}, - "A3": Object {}, - "A4": Object {}, - "A5": Object {}, - "A6": Object {}, - "A7": Object {}, - "A8": Object {}, - "A9": Object {}, - "B1": Object {}, - "B10": Object {}, - "B11": Object {}, - "B12": Object {}, - "B2": Object {}, - "B3": Object {}, - "B4": Object {}, - "B5": Object {}, - "B6": Object {}, - "B7": Object {}, - "B8": Object {}, - "B9": Object {}, - "C1": Object {}, - "C10": Object {}, - "C11": Object {}, - "C12": Object {}, - "C2": Object {}, - "C3": Object {}, - "C4": Object {}, - "C5": Object {}, - "C6": Object {}, - "C7": Object {}, - "C8": Object {}, - "C9": Object {}, - "D1": Object {}, - "D10": Object {}, - "D11": Object {}, - "D12": Object {}, - "D2": Object {}, - "D3": Object {}, - "D4": Object {}, - "D5": Object {}, - "D6": Object {}, - "D7": Object {}, - "D8": Object {}, - "D9": Object {}, - "E1": Object {}, - "E10": Object {}, - "E11": Object {}, - "E12": Object {}, - "E2": Object {}, - "E3": Object {}, - "E4": Object {}, - "E5": Object {}, - "E6": Object {}, - "E7": Object {}, - "E8": Object {}, - "E9": Object {}, - "F1": Object {}, - "F10": Object {}, - "F11": Object {}, - "F12": Object {}, - "F2": Object {}, - "F3": Object {}, - "F4": Object {}, - "F5": Object {}, - "F6": Object {}, - "F7": Object {}, - "F8": Object {}, - "F9": Object {}, - "G1": Object {}, - "G10": Object {}, - "G11": Object {}, - "G12": Object {}, - "G2": Object {}, - "G3": Object {}, - "G4": Object {}, - "G5": Object {}, - "G6": Object {}, - "G7": Object {}, - "G8": Object {}, - "G9": Object {}, - "H1": Object {}, - "H10": Object {}, - "H11": Object {}, - "H12": Object {}, - "H2": Object {}, - "H3": Object {}, - "H4": Object {}, - "H5": Object {}, - "H6": Object {}, - "H7": Object {}, - "H8": Object {}, - "H9": Object {}, - }, - "tiprack2Id": Object { - "A1": Object {}, - "A10": Object {}, - "A11": Object {}, - "A12": Object {}, - "A2": Object {}, - "A3": Object {}, - "A4": Object {}, - "A5": Object {}, - "A6": Object {}, - "A7": Object {}, - "A8": Object {}, - "A9": Object {}, - "B1": Object {}, - "B10": Object {}, - "B11": Object {}, - "B12": Object {}, - "B2": Object {}, - "B3": Object {}, - "B4": Object {}, - "B5": Object {}, - "B6": Object {}, - "B7": Object {}, - "B8": Object {}, - "B9": Object {}, - "C1": Object {}, - "C10": Object {}, - "C11": Object {}, - "C12": Object {}, - "C2": Object {}, - "C3": Object {}, - "C4": Object {}, - "C5": Object {}, - "C6": Object {}, - "C7": Object {}, - "C8": Object {}, - "C9": Object {}, - "D1": Object {}, - "D10": Object {}, - "D11": Object {}, - "D12": Object {}, - "D2": Object {}, - "D3": Object {}, - "D4": Object {}, - "D5": Object {}, - "D6": Object {}, - "D7": Object {}, - "D8": Object {}, - "D9": Object {}, - "E1": Object {}, - "E10": Object {}, - "E11": Object {}, - "E12": Object {}, - "E2": Object {}, - "E3": Object {}, - "E4": Object {}, - "E5": Object {}, - "E6": Object {}, - "E7": Object {}, - "E8": Object {}, - "E9": Object {}, - "F1": Object {}, - "F10": Object {}, - "F11": Object {}, - "F12": Object {}, - "F2": Object {}, - "F3": Object {}, - "F4": Object {}, - "F5": Object {}, - "F6": Object {}, - "F7": Object {}, - "F8": Object {}, - "F9": Object {}, - "G1": Object {}, - "G10": Object {}, - "G11": Object {}, - "G12": Object {}, - "G2": Object {}, - "G3": Object {}, - "G4": Object {}, - "G5": Object {}, - "G6": Object {}, - "G7": Object {}, - "G8": Object {}, - "G9": Object {}, - "H1": Object {}, - "H10": Object {}, - "H11": Object {}, - "H12": Object {}, - "H2": Object {}, - "H3": Object {}, - "H4": Object {}, - "H5": Object {}, - "H6": Object {}, - "H7": Object {}, - "H8": Object {}, - "H9": Object {}, - }, - "tiprack3Id": Object { - "A1": Object {}, - "A10": Object {}, - "A11": Object {}, - "A12": Object {}, - "A2": Object {}, - "A3": Object {}, - "A4": Object {}, - "A5": Object {}, - "A6": Object {}, - "A7": Object {}, - "A8": Object {}, - "A9": Object {}, - "B1": Object {}, - "B10": Object {}, - "B11": Object {}, - "B12": Object {}, - "B2": Object {}, - "B3": Object {}, - "B4": Object {}, - "B5": Object {}, - "B6": Object {}, - "B7": Object {}, - "B8": Object {}, - "B9": Object {}, - "C1": Object {}, - "C10": Object {}, - "C11": Object {}, - "C12": Object {}, - "C2": Object {}, - "C3": Object {}, - "C4": Object {}, - "C5": Object {}, - "C6": Object {}, - "C7": Object {}, - "C8": Object {}, - "C9": Object {}, - "D1": Object {}, - "D10": Object {}, - "D11": Object {}, - "D12": Object {}, - "D2": Object {}, - "D3": Object {}, - "D4": Object {}, - "D5": Object {}, - "D6": Object {}, - "D7": Object {}, - "D8": Object {}, - "D9": Object {}, - "E1": Object {}, - "E10": Object {}, - "E11": Object {}, - "E12": Object {}, - "E2": Object {}, - "E3": Object {}, - "E4": Object {}, - "E5": Object {}, - "E6": Object {}, - "E7": Object {}, - "E8": Object {}, - "E9": Object {}, - "F1": Object {}, - "F10": Object {}, - "F11": Object {}, - "F12": Object {}, - "F2": Object {}, - "F3": Object {}, - "F4": Object {}, - "F5": Object {}, - "F6": Object {}, - "F7": Object {}, - "F8": Object {}, - "F9": Object {}, - "G1": Object {}, - "G10": Object {}, - "G11": Object {}, - "G12": Object {}, - "G2": Object {}, - "G3": Object {}, - "G4": Object {}, - "G5": Object {}, - "G6": Object {}, - "G7": Object {}, - "G8": Object {}, - "G9": Object {}, - "H1": Object {}, - "H10": Object {}, - "H11": Object {}, - "H12": Object {}, - "H2": Object {}, - "H3": Object {}, - "H4": Object {}, - "H5": Object {}, - "H6": Object {}, - "H7": Object {}, - "H8": Object {}, - "H9": Object {}, - }, - "tiprack4AdapterId": Object {}, - "tiprack4Id": Object { - "A1": Object {}, - "A10": Object {}, - "A11": Object {}, - "A12": Object {}, - "A2": Object {}, - "A3": Object {}, - "A4": Object {}, - "A5": Object {}, - "A6": Object {}, - "A7": Object {}, - "A8": Object {}, - "A9": Object {}, - "B1": Object {}, - "B10": Object {}, - "B11": Object {}, - "B12": Object {}, - "B2": Object {}, - "B3": Object {}, - "B4": Object {}, - "B5": Object {}, - "B6": Object {}, - "B7": Object {}, - "B8": Object {}, - "B9": Object {}, - "C1": Object {}, - "C10": Object {}, - "C11": Object {}, - "C12": Object {}, - "C2": Object {}, - "C3": Object {}, - "C4": Object {}, - "C5": Object {}, - "C6": Object {}, - "C7": Object {}, - "C8": Object {}, - "C9": Object {}, - "D1": Object {}, - "D10": Object {}, - "D11": Object {}, - "D12": Object {}, - "D2": Object {}, - "D3": Object {}, - "D4": Object {}, - "D5": Object {}, - "D6": Object {}, - "D7": Object {}, - "D8": Object {}, - "D9": Object {}, - "E1": Object {}, - "E10": Object {}, - "E11": Object {}, - "E12": Object {}, - "E2": Object {}, - "E3": Object {}, - "E4": Object {}, - "E5": Object {}, - "E6": Object {}, - "E7": Object {}, - "E8": Object {}, - "E9": Object {}, - "F1": Object {}, - "F10": Object {}, - "F11": Object {}, - "F12": Object {}, - "F2": Object {}, - "F3": Object {}, - "F4": Object {}, - "F5": Object {}, - "F6": Object {}, - "F7": Object {}, - "F8": Object {}, - "F9": Object {}, - "G1": Object {}, - "G10": Object {}, - "G11": Object {}, - "G12": Object {}, - "G2": Object {}, - "G3": Object {}, - "G4": Object {}, - "G5": Object {}, - "G6": Object {}, - "G7": Object {}, - "G8": Object {}, - "G9": Object {}, - "H1": Object {}, - "H10": Object {}, - "H11": Object {}, - "H12": Object {}, - "H2": Object {}, - "H3": Object {}, - "H4": Object {}, - "H5": Object {}, - "H6": Object {}, - "H7": Object {}, - "H8": Object {}, - "H9": Object {}, - }, - "tiprack5AdapterId": Object {}, - "tiprack5Id": Object { - "A1": Object {}, - "A10": Object {}, - "A11": Object {}, - "A12": Object {}, - "A2": Object {}, - "A3": Object {}, - "A4": Object {}, - "A5": Object {}, - "A6": Object {}, - "A7": Object {}, - "A8": Object {}, - "A9": Object {}, - "B1": Object {}, - "B10": Object {}, - "B11": Object {}, - "B12": Object {}, - "B2": Object {}, - "B3": Object {}, - "B4": Object {}, - "B5": Object {}, - "B6": Object {}, - "B7": Object {}, - "B8": Object {}, - "B9": Object {}, - "C1": Object {}, - "C10": Object {}, - "C11": Object {}, - "C12": Object {}, - "C2": Object {}, - "C3": Object {}, - "C4": Object {}, - "C5": Object {}, - "C6": Object {}, - "C7": Object {}, - "C8": Object {}, - "C9": Object {}, - "D1": Object {}, - "D10": Object {}, - "D11": Object {}, - "D12": Object {}, - "D2": Object {}, - "D3": Object {}, - "D4": Object {}, - "D5": Object {}, - "D6": Object {}, - "D7": Object {}, - "D8": Object {}, - "D9": Object {}, - "E1": Object {}, - "E10": Object {}, - "E11": Object {}, - "E12": Object {}, - "E2": Object {}, - "E3": Object {}, - "E4": Object {}, - "E5": Object {}, - "E6": Object {}, - "E7": Object {}, - "E8": Object {}, - "E9": Object {}, - "F1": Object {}, - "F10": Object {}, - "F11": Object {}, - "F12": Object {}, - "F2": Object {}, - "F3": Object {}, - "F4": Object {}, - "F5": Object {}, - "F6": Object {}, - "F7": Object {}, - "F8": Object {}, - "F9": Object {}, - "G1": Object {}, - "G10": Object {}, - "G11": Object {}, - "G12": Object {}, - "G2": Object {}, - "G3": Object {}, - "G4": Object {}, - "G5": Object {}, - "G6": Object {}, - "G7": Object {}, - "G8": Object {}, - "G9": Object {}, - "H1": Object {}, - "H10": Object {}, - "H11": Object {}, - "H12": Object {}, - "H2": Object {}, - "H3": Object {}, - "H4": Object {}, - "H5": Object {}, - "H6": Object {}, - "H7": Object {}, - "H8": Object {}, - "H9": Object {}, - }, - "troughId": Object { - "A1": Object {}, - "A10": Object {}, - "A11": Object {}, - "A12": Object {}, - "A2": Object {}, - "A3": Object {}, - "A4": Object {}, - "A5": Object {}, - "A6": Object {}, - "A7": Object {}, - "A8": Object {}, - "A9": Object {}, - }, - }, - "pipettes": Object { - "p100096Id": Object { - "0": Object {}, - "1": Object {}, - "10": Object {}, - "11": Object {}, - "12": Object {}, - "13": Object {}, - "14": Object {}, - "15": Object {}, - "16": Object {}, - "17": Object {}, - "18": Object {}, - "19": Object {}, - "2": Object {}, - "20": Object {}, - "21": Object {}, - "22": Object {}, - "23": Object {}, - "24": Object {}, - "25": Object {}, - "26": Object {}, - "27": Object {}, - "28": Object {}, - "29": Object {}, - "3": Object {}, - "30": Object {}, - "31": Object {}, - "32": Object {}, - "33": Object {}, - "34": Object {}, - "35": Object {}, - "36": Object {}, - "37": Object {}, - "38": Object {}, - "39": Object {}, - "4": Object {}, - "40": Object {}, - "41": Object {}, - "42": Object {}, - "43": Object {}, - "44": Object {}, - "45": Object {}, - "46": Object {}, - "47": Object {}, - "48": Object {}, - "49": Object {}, - "5": Object {}, - "50": Object {}, - "51": Object {}, - "52": Object {}, - "53": Object {}, - "54": Object {}, - "55": Object {}, - "56": Object {}, - "57": Object {}, - "58": Object {}, - "59": Object {}, - "6": Object {}, - "60": Object {}, - "61": Object {}, - "62": Object {}, - "63": Object {}, - "64": Object {}, - "65": Object {}, - "66": Object {}, - "67": Object {}, - "68": Object {}, - "69": Object {}, - "7": Object {}, - "70": Object {}, - "71": Object {}, - "72": Object {}, - "73": Object {}, - "74": Object {}, - "75": Object {}, - "76": Object {}, - "77": Object {}, - "78": Object {}, - "79": Object {}, - "8": Object {}, - "80": Object {}, - "81": Object {}, - "82": Object {}, - "83": Object {}, - "84": Object {}, - "85": Object {}, - "86": Object {}, - "87": Object {}, - "88": Object {}, - "89": Object {}, - "9": Object {}, - "90": Object {}, - "91": Object {}, - "92": Object {}, - "93": Object {}, - "94": Object {}, - "95": Object {}, - }, - "p10MultiId": Object { - "0": Object {}, - "1": Object {}, - "2": Object {}, - "3": Object {}, - "4": Object {}, - "5": Object {}, - "6": Object {}, - "7": Object {}, - }, - "p10SingleId": Object { - "0": Object {}, - }, - "p300MultiId": Object { - "0": Object {}, - "1": Object {}, - "2": Object {}, - "3": Object {}, - "4": Object {}, - "5": Object {}, - "6": Object {}, - "7": Object {}, - }, - "p300SingleId": Object { - "0": Object {}, - }, - }, -} -`; - -exports[`snapshot tests makeContext 1`] = ` -Object { - "additionalEquipmentEntities": Object { - "fixedTrash": Object { - "id": "fixedTrash", - "location": "cutoutA3", - "name": "trashBin", - }, - }, - "config": Object { - "OT_PD_DISABLE_MODULE_RESTRICTIONS": false, - }, - "labwareEntities": Object { - "destPlateId": Object { - "def": Object { - "brand": Object { - "brand": "generic", - }, - "cornerOffsetFromSlot": Object { - "x": 0, - "y": 0, - "z": 0, - }, - "dimensions": Object { - "xDimension": 127.76, - "yDimension": 85.48, - "zDimension": 14.35, - }, - "groups": Array [ - Object { - "metadata": Object { - "wellBottomShape": "flat", - }, - "wells": Array [ - "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", - ], - }, - ], - "metadata": Object { - "displayCategory": "wellPlate", - "displayName": "ANSI 96 Standard Microplate", - "displayVolumeUnits": "µL", - "tags": Array [ - "flat", - "microplate", - "SBS", - "ANSI", - "generic", - ], - }, - "namespace": "fixture", - "ordering": Array [ - Array [ - "A1", - "B1", - "C1", - "D1", - "E1", - "F1", - "G1", - "H1", - ], - Array [ - "A2", - "B2", - "C2", - "D2", - "E2", - "F2", - "G2", - "H2", - ], - Array [ - "A3", - "B3", - "C3", - "D3", - "E3", - "F3", - "G3", - "H3", - ], - Array [ - "A4", - "B4", - "C4", - "D4", - "E4", - "F4", - "G4", - "H4", - ], - Array [ - "A5", - "B5", - "C5", - "D5", - "E5", - "F5", - "G5", - "H5", - ], - Array [ - "A6", - "B6", - "C6", - "D6", - "E6", - "F6", - "G6", - "H6", - ], - Array [ - "A7", - "B7", - "C7", - "D7", - "E7", - "F7", - "G7", - "H7", - ], - Array [ - "A8", - "B8", - "C8", - "D8", - "E8", - "F8", - "G8", - "H8", - ], - Array [ - "A9", - "B9", - "C9", - "D9", - "E9", - "F9", - "G9", - "H9", - ], - Array [ - "A10", - "B10", - "C10", - "D10", - "E10", - "F10", - "G10", - "H10", - ], - Array [ - "A11", - "B11", - "C11", - "D11", - "E11", - "F11", - "G11", - "H11", - ], - Array [ - "A12", - "B12", - "C12", - "D12", - "E12", - "F12", - "G12", - "H12", - ], - ], - "parameters": Object { - "format": "96Standard", - "isMagneticModuleCompatible": false, - "isTiprack": false, - "loadName": "fixture_96_plate", - }, - "schemaVersion": 2, - "version": 1, - "wells": Object { - "A1": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 14.38, - "y": 74.24, - "z": 3.81, - }, - "A10": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 95.38, - "y": 74.24, - "z": 3.81, - }, - "A11": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 104.38, - "y": 74.24, - "z": 3.81, - }, - "A12": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 113.38, - "y": 74.24, - "z": 3.81, - }, - "A2": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 23.38, - "y": 74.24, - "z": 3.81, - }, - "A3": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 32.38, - "y": 74.24, - "z": 3.81, - }, - "A4": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 41.38, - "y": 74.24, - "z": 3.81, - }, - "A5": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 50.38, - "y": 74.24, - "z": 3.81, - }, - "A6": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 59.38, - "y": 74.24, - "z": 3.81, - }, - "A7": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 68.38, - "y": 74.24, - "z": 3.81, - }, - "A8": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 77.38, - "y": 74.24, - "z": 3.81, - }, - "A9": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 86.38, - "y": 74.24, - "z": 3.81, - }, - "B1": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 14.38, - "y": 65.24, - "z": 3.81, - }, - "B10": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 95.38, - "y": 65.24, - "z": 3.81, - }, - "B11": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 104.38, - "y": 65.24, - "z": 3.81, - }, - "B12": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 113.38, - "y": 65.24, - "z": 3.81, - }, - "B2": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 23.38, - "y": 65.24, - "z": 3.81, - }, - "B3": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 32.38, - "y": 65.24, - "z": 3.81, - }, - "B4": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 41.38, - "y": 65.24, - "z": 3.81, - }, - "B5": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 50.38, - "y": 65.24, - "z": 3.81, - }, - "B6": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 59.38, - "y": 65.24, - "z": 3.81, - }, - "B7": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 68.38, - "y": 65.24, - "z": 3.81, - }, - "B8": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 77.38, - "y": 65.24, - "z": 3.81, - }, - "B9": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 86.38, - "y": 65.24, - "z": 3.81, - }, - "C1": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 14.38, - "y": 56.24, - "z": 3.81, - }, - "C10": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 95.38, - "y": 56.24, - "z": 3.81, - }, - "C11": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 104.38, - "y": 56.24, - "z": 3.81, - }, - "C12": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 113.38, - "y": 56.24, - "z": 3.81, - }, - "C2": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 23.38, - "y": 56.24, - "z": 3.81, - }, - "C3": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 32.38, - "y": 56.24, - "z": 3.81, - }, - "C4": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 41.38, - "y": 56.24, - "z": 3.81, - }, - "C5": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 50.38, - "y": 56.24, - "z": 3.81, - }, - "C6": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 59.38, - "y": 56.24, - "z": 3.81, - }, - "C7": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 68.38, - "y": 56.24, - "z": 3.81, - }, - "C8": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 77.38, - "y": 56.24, - "z": 3.81, - }, - "C9": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 86.38, - "y": 56.24, - "z": 3.81, - }, - "D1": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 14.38, - "y": 47.24, - "z": 3.81, - }, - "D10": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 95.38, - "y": 47.24, - "z": 3.81, - }, - "D11": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 104.38, - "y": 47.24, - "z": 3.81, - }, - "D12": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 113.38, - "y": 47.24, - "z": 3.81, - }, - "D2": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 23.38, - "y": 47.24, - "z": 3.81, - }, - "D3": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 32.38, - "y": 47.24, - "z": 3.81, - }, - "D4": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 41.38, - "y": 47.24, - "z": 3.81, - }, - "D5": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 50.38, - "y": 47.24, - "z": 3.81, - }, - "D6": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 59.38, - "y": 47.24, - "z": 3.81, - }, - "D7": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 68.38, - "y": 47.24, - "z": 3.81, - }, - "D8": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 77.38, - "y": 47.24, - "z": 3.81, - }, - "D9": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 86.38, - "y": 47.24, - "z": 3.81, - }, - "E1": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 14.38, - "y": 38.24, - "z": 3.81, - }, - "E10": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 95.38, - "y": 38.24, - "z": 3.81, - }, - "E11": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 104.38, - "y": 38.24, - "z": 3.81, - }, - "E12": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 113.38, - "y": 38.24, - "z": 3.81, - }, - "E2": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 23.38, - "y": 38.24, - "z": 3.81, - }, - "E3": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 32.38, - "y": 38.24, - "z": 3.81, - }, - "E4": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 41.38, - "y": 38.24, - "z": 3.81, - }, - "E5": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 50.38, - "y": 38.24, - "z": 3.81, - }, - "E6": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 59.38, - "y": 38.24, - "z": 3.81, - }, - "E7": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 68.38, - "y": 38.24, - "z": 3.81, - }, - "E8": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 77.38, - "y": 38.24, - "z": 3.81, - }, - "E9": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 86.38, - "y": 38.24, - "z": 3.81, - }, - "F1": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 14.38, - "y": 29.24, - "z": 3.81, - }, - "F10": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 95.38, - "y": 29.24, - "z": 3.81, - }, - "F11": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 104.38, - "y": 29.24, - "z": 3.81, - }, - "F12": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 113.38, - "y": 29.24, - "z": 3.81, - }, - "F2": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 23.38, - "y": 29.24, - "z": 3.81, - }, - "F3": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 32.38, - "y": 29.24, - "z": 3.81, - }, - "F4": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 41.38, - "y": 29.24, - "z": 3.81, - }, - "F5": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 50.38, - "y": 29.24, - "z": 3.81, - }, - "F6": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 59.38, - "y": 29.24, - "z": 3.81, - }, - "F7": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 68.38, - "y": 29.24, - "z": 3.81, - }, - "F8": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 77.38, - "y": 29.24, - "z": 3.81, - }, - "F9": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 86.38, - "y": 29.24, - "z": 3.81, - }, - "G1": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 14.38, - "y": 20.24, - "z": 3.81, - }, - "G10": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 95.38, - "y": 20.24, - "z": 3.81, - }, - "G11": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 104.38, - "y": 20.24, - "z": 3.81, - }, - "G12": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 113.38, - "y": 20.24, - "z": 3.81, - }, - "G2": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 23.38, - "y": 20.24, - "z": 3.81, - }, - "G3": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 32.38, - "y": 20.24, - "z": 3.81, - }, - "G4": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 41.38, - "y": 20.24, - "z": 3.81, - }, - "G5": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 50.38, - "y": 20.24, - "z": 3.81, - }, - "G6": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 59.38, - "y": 20.24, - "z": 3.81, - }, - "G7": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 68.38, - "y": 20.24, - "z": 3.81, - }, - "G8": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 77.38, - "y": 20.24, - "z": 3.81, - }, - "G9": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 86.38, - "y": 20.24, - "z": 3.81, - }, - "H1": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 14.38, - "y": 11.24, - "z": 3.81, - }, - "H10": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 95.38, - "y": 11.24, - "z": 3.81, - }, - "H11": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 104.38, - "y": 11.24, - "z": 3.81, - }, - "H12": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 113.38, - "y": 11.24, - "z": 3.81, - }, - "H2": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 23.38, - "y": 11.24, - "z": 3.81, - }, - "H3": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 32.38, - "y": 11.24, - "z": 3.81, - }, - "H4": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 41.38, - "y": 11.24, - "z": 3.81, - }, - "H5": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 50.38, - "y": 11.24, - "z": 3.81, - }, - "H6": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 59.38, - "y": 11.24, - "z": 3.81, - }, - "H7": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 68.38, - "y": 11.24, - "z": 3.81, - }, - "H8": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 77.38, - "y": 11.24, - "z": 3.81, - }, - "H9": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 86.38, - "y": 11.24, - "z": 3.81, - }, - }, - }, - "id": "destPlateId", - "labwareDefURI": "fixture/fixture_96_plate/1", - }, - "sourcePlateId": Object { - "def": Object { - "brand": Object { - "brand": "generic", - }, - "cornerOffsetFromSlot": Object { - "x": 0, - "y": 0, - "z": 0, - }, - "dimensions": Object { - "xDimension": 127.76, - "yDimension": 85.48, - "zDimension": 14.35, - }, - "groups": Array [ - Object { - "metadata": Object { - "wellBottomShape": "flat", - }, - "wells": Array [ - "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", - ], - }, - ], - "metadata": Object { - "displayCategory": "wellPlate", - "displayName": "ANSI 96 Standard Microplate", - "displayVolumeUnits": "µL", - "tags": Array [ - "flat", - "microplate", - "SBS", - "ANSI", - "generic", - ], - }, - "namespace": "fixture", - "ordering": Array [ - Array [ - "A1", - "B1", - "C1", - "D1", - "E1", - "F1", - "G1", - "H1", - ], - Array [ - "A2", - "B2", - "C2", - "D2", - "E2", - "F2", - "G2", - "H2", - ], - Array [ - "A3", - "B3", - "C3", - "D3", - "E3", - "F3", - "G3", - "H3", - ], - Array [ - "A4", - "B4", - "C4", - "D4", - "E4", - "F4", - "G4", - "H4", - ], - Array [ - "A5", - "B5", - "C5", - "D5", - "E5", - "F5", - "G5", - "H5", - ], - Array [ - "A6", - "B6", - "C6", - "D6", - "E6", - "F6", - "G6", - "H6", - ], - Array [ - "A7", - "B7", - "C7", - "D7", - "E7", - "F7", - "G7", - "H7", - ], - Array [ - "A8", - "B8", - "C8", - "D8", - "E8", - "F8", - "G8", - "H8", - ], - Array [ - "A9", - "B9", - "C9", - "D9", - "E9", - "F9", - "G9", - "H9", - ], - Array [ - "A10", - "B10", - "C10", - "D10", - "E10", - "F10", - "G10", - "H10", - ], - Array [ - "A11", - "B11", - "C11", - "D11", - "E11", - "F11", - "G11", - "H11", - ], - Array [ - "A12", - "B12", - "C12", - "D12", - "E12", - "F12", - "G12", - "H12", - ], - ], - "parameters": Object { - "format": "96Standard", - "isMagneticModuleCompatible": false, - "isTiprack": false, - "loadName": "fixture_96_plate", - }, - "schemaVersion": 2, - "version": 1, - "wells": Object { - "A1": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 14.38, - "y": 74.24, - "z": 3.81, - }, - "A10": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 95.38, - "y": 74.24, - "z": 3.81, - }, - "A11": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 104.38, - "y": 74.24, - "z": 3.81, - }, - "A12": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 113.38, - "y": 74.24, - "z": 3.81, - }, - "A2": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 23.38, - "y": 74.24, - "z": 3.81, - }, - "A3": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 32.38, - "y": 74.24, - "z": 3.81, - }, - "A4": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 41.38, - "y": 74.24, - "z": 3.81, - }, - "A5": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 50.38, - "y": 74.24, - "z": 3.81, - }, - "A6": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 59.38, - "y": 74.24, - "z": 3.81, - }, - "A7": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 68.38, - "y": 74.24, - "z": 3.81, - }, - "A8": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 77.38, - "y": 74.24, - "z": 3.81, - }, - "A9": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 86.38, - "y": 74.24, - "z": 3.81, - }, - "B1": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 14.38, - "y": 65.24, - "z": 3.81, - }, - "B10": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 95.38, - "y": 65.24, - "z": 3.81, - }, - "B11": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 104.38, - "y": 65.24, - "z": 3.81, - }, - "B12": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 113.38, - "y": 65.24, - "z": 3.81, - }, - "B2": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 23.38, - "y": 65.24, - "z": 3.81, - }, - "B3": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 32.38, - "y": 65.24, - "z": 3.81, - }, - "B4": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 41.38, - "y": 65.24, - "z": 3.81, - }, - "B5": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 50.38, - "y": 65.24, - "z": 3.81, - }, - "B6": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 59.38, - "y": 65.24, - "z": 3.81, - }, - "B7": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 68.38, - "y": 65.24, - "z": 3.81, - }, - "B8": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 77.38, - "y": 65.24, - "z": 3.81, - }, - "B9": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 86.38, - "y": 65.24, - "z": 3.81, - }, - "C1": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 14.38, - "y": 56.24, - "z": 3.81, - }, - "C10": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 95.38, - "y": 56.24, - "z": 3.81, - }, - "C11": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 104.38, - "y": 56.24, - "z": 3.81, - }, - "C12": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 113.38, - "y": 56.24, - "z": 3.81, - }, - "C2": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 23.38, - "y": 56.24, - "z": 3.81, - }, - "C3": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 32.38, - "y": 56.24, - "z": 3.81, - }, - "C4": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 41.38, - "y": 56.24, - "z": 3.81, - }, - "C5": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 50.38, - "y": 56.24, - "z": 3.81, - }, - "C6": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 59.38, - "y": 56.24, - "z": 3.81, - }, - "C7": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 68.38, - "y": 56.24, - "z": 3.81, - }, - "C8": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 77.38, - "y": 56.24, - "z": 3.81, - }, - "C9": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 86.38, - "y": 56.24, - "z": 3.81, - }, - "D1": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 14.38, - "y": 47.24, - "z": 3.81, - }, - "D10": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 95.38, - "y": 47.24, - "z": 3.81, - }, - "D11": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 104.38, - "y": 47.24, - "z": 3.81, - }, - "D12": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 113.38, - "y": 47.24, - "z": 3.81, - }, - "D2": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 23.38, - "y": 47.24, - "z": 3.81, - }, - "D3": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 32.38, - "y": 47.24, - "z": 3.81, - }, - "D4": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 41.38, - "y": 47.24, - "z": 3.81, - }, - "D5": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 50.38, - "y": 47.24, - "z": 3.81, - }, - "D6": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 59.38, - "y": 47.24, - "z": 3.81, - }, - "D7": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 68.38, - "y": 47.24, - "z": 3.81, - }, - "D8": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 77.38, - "y": 47.24, - "z": 3.81, - }, - "D9": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 86.38, - "y": 47.24, - "z": 3.81, - }, - "E1": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 14.38, - "y": 38.24, - "z": 3.81, - }, - "E10": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 95.38, - "y": 38.24, - "z": 3.81, - }, - "E11": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 104.38, - "y": 38.24, - "z": 3.81, - }, - "E12": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 113.38, - "y": 38.24, - "z": 3.81, - }, - "E2": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 23.38, - "y": 38.24, - "z": 3.81, - }, - "E3": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 32.38, - "y": 38.24, - "z": 3.81, - }, - "E4": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 41.38, - "y": 38.24, - "z": 3.81, - }, - "E5": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 50.38, - "y": 38.24, - "z": 3.81, - }, - "E6": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 59.38, - "y": 38.24, - "z": 3.81, - }, - "E7": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 68.38, - "y": 38.24, - "z": 3.81, - }, - "E8": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 77.38, - "y": 38.24, - "z": 3.81, - }, - "E9": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 86.38, - "y": 38.24, - "z": 3.81, - }, - "F1": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 14.38, - "y": 29.24, - "z": 3.81, - }, - "F10": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 95.38, - "y": 29.24, - "z": 3.81, - }, - "F11": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 104.38, - "y": 29.24, - "z": 3.81, - }, - "F12": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 113.38, - "y": 29.24, - "z": 3.81, - }, - "F2": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 23.38, - "y": 29.24, - "z": 3.81, - }, - "F3": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 32.38, - "y": 29.24, - "z": 3.81, - }, - "F4": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 41.38, - "y": 29.24, - "z": 3.81, - }, - "F5": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 50.38, - "y": 29.24, - "z": 3.81, - }, - "F6": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 59.38, - "y": 29.24, - "z": 3.81, - }, - "F7": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 68.38, - "y": 29.24, - "z": 3.81, - }, - "F8": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 77.38, - "y": 29.24, - "z": 3.81, - }, - "F9": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 86.38, - "y": 29.24, - "z": 3.81, - }, - "G1": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 14.38, - "y": 20.24, - "z": 3.81, - }, - "G10": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 95.38, - "y": 20.24, - "z": 3.81, - }, - "G11": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 104.38, - "y": 20.24, - "z": 3.81, - }, - "G12": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 113.38, - "y": 20.24, - "z": 3.81, - }, - "G2": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 23.38, - "y": 20.24, - "z": 3.81, - }, - "G3": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 32.38, - "y": 20.24, - "z": 3.81, - }, - "G4": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 41.38, - "y": 20.24, - "z": 3.81, - }, - "G5": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 50.38, - "y": 20.24, - "z": 3.81, - }, - "G6": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 59.38, - "y": 20.24, - "z": 3.81, - }, - "G7": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 68.38, - "y": 20.24, - "z": 3.81, - }, - "G8": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 77.38, - "y": 20.24, - "z": 3.81, - }, - "G9": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 86.38, - "y": 20.24, - "z": 3.81, - }, - "H1": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 14.38, - "y": 11.24, - "z": 3.81, - }, - "H10": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 95.38, - "y": 11.24, - "z": 3.81, - }, - "H11": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 104.38, - "y": 11.24, - "z": 3.81, - }, - "H12": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 113.38, - "y": 11.24, - "z": 3.81, - }, - "H2": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 23.38, - "y": 11.24, - "z": 3.81, - }, - "H3": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 32.38, - "y": 11.24, - "z": 3.81, - }, - "H4": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 41.38, - "y": 11.24, - "z": 3.81, - }, - "H5": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 50.38, - "y": 11.24, - "z": 3.81, - }, - "H6": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 59.38, - "y": 11.24, - "z": 3.81, - }, - "H7": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 68.38, - "y": 11.24, - "z": 3.81, - }, - "H8": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 77.38, - "y": 11.24, - "z": 3.81, - }, - "H9": Object { - "depth": 10.54, - "diameter": 6.4, - "shape": "circular", - "totalLiquidVolume": 380, - "x": 86.38, - "y": 11.24, - "z": 3.81, - }, - }, - }, - "id": "sourcePlateId", - "labwareDefURI": "fixture/fixture_96_plate/1", - }, - "tiprack1Id": Object { - "def": Object { - "brand": Object { - "brand": "Fixture Brand", - }, - "cornerOffsetFromSlot": Object { - "x": 0, - "y": 0, - "z": 0, - }, - "dimensions": Object { - "xDimension": 127.76, - "yDimension": 85.48, - "zDimension": 64.49, - }, - "groups": Array [ - Object { - "metadata": Object {}, - "wells": Array [ - "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", - ], - }, - ], - "metadata": Object { - "displayCategory": "tipRack", - "displayName": "300ul Tiprack FIXTURE", - "displayVolumeUnits": "µL", - "tags": Array [], - }, - "namespace": "fixture", - "ordering": Array [ - Array [ - "A1", - "B1", - "C1", - "D1", - "E1", - "F1", - "G1", - "H1", - ], - Array [ - "A2", - "B2", - "C2", - "D2", - "E2", - "F2", - "G2", - "H2", - ], - Array [ - "A3", - "B3", - "C3", - "D3", - "E3", - "F3", - "G3", - "H3", - ], - Array [ - "A4", - "B4", - "C4", - "D4", - "E4", - "F4", - "G4", - "H4", - ], - Array [ - "A5", - "B5", - "C5", - "D5", - "E5", - "F5", - "G5", - "H5", - ], - Array [ - "A6", - "B6", - "C6", - "D6", - "E6", - "F6", - "G6", - "H6", - ], - Array [ - "A7", - "B7", - "C7", - "D7", - "E7", - "F7", - "G7", - "H7", - ], - Array [ - "A8", - "B8", - "C8", - "D8", - "E8", - "F8", - "G8", - "H8", - ], - Array [ - "A9", - "B9", - "C9", - "D9", - "E9", - "F9", - "G9", - "H9", - ], - Array [ - "A10", - "B10", - "C10", - "D10", - "E10", - "F10", - "G10", - "H10", - ], - Array [ - "A11", - "B11", - "C11", - "D11", - "E11", - "F11", - "G11", - "H11", - ], - Array [ - "A12", - "B12", - "C12", - "D12", - "E12", - "F12", - "G12", - "H12", - ], - ], - "parameters": Object { - "format": "96Standard", - "isMagneticModuleCompatible": false, - "isTiprack": true, - "loadName": "fixture_tiprack_300_ul", - "tipLength": 59.3, - }, - "schemaVersion": 2, - "version": 1, - "wells": Object { - "A1": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 14.38, - "y": 74.24, - "z": 5.19, - }, - "A10": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 95.38, - "y": 74.24, - "z": 5.19, - }, - "A11": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 104.38, - "y": 74.24, - "z": 5.19, - }, - "A12": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 113.38, - "y": 74.24, - "z": 5.19, - }, - "A2": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 23.38, - "y": 74.24, - "z": 5.19, - }, - "A3": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 32.38, - "y": 74.24, - "z": 5.19, - }, - "A4": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 41.38, - "y": 74.24, - "z": 5.19, - }, - "A5": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 50.38, - "y": 74.24, - "z": 5.19, - }, - "A6": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 59.38, - "y": 74.24, - "z": 5.19, - }, - "A7": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 68.38, - "y": 74.24, - "z": 5.19, - }, - "A8": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 77.38, - "y": 74.24, - "z": 5.19, - }, - "A9": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 86.38, - "y": 74.24, - "z": 5.19, - }, - "B1": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 14.38, - "y": 65.24, - "z": 5.19, - }, - "B10": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 95.38, - "y": 65.24, - "z": 5.19, - }, - "B11": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 104.38, - "y": 65.24, - "z": 5.19, - }, - "B12": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 113.38, - "y": 65.24, - "z": 5.19, - }, - "B2": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 23.38, - "y": 65.24, - "z": 5.19, - }, - "B3": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 32.38, - "y": 65.24, - "z": 5.19, - }, - "B4": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 41.38, - "y": 65.24, - "z": 5.19, - }, - "B5": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 50.38, - "y": 65.24, - "z": 5.19, - }, - "B6": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 59.38, - "y": 65.24, - "z": 5.19, - }, - "B7": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 68.38, - "y": 65.24, - "z": 5.19, - }, - "B8": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 77.38, - "y": 65.24, - "z": 5.19, - }, - "B9": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 86.38, - "y": 65.24, - "z": 5.19, - }, - "C1": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 14.38, - "y": 56.24, - "z": 5.19, - }, - "C10": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 95.38, - "y": 56.24, - "z": 5.19, - }, - "C11": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 104.38, - "y": 56.24, - "z": 5.19, - }, - "C12": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 113.38, - "y": 56.24, - "z": 5.19, - }, - "C2": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 23.38, - "y": 56.24, - "z": 5.19, - }, - "C3": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 32.38, - "y": 56.24, - "z": 5.19, - }, - "C4": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 41.38, - "y": 56.24, - "z": 5.19, - }, - "C5": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 50.38, - "y": 56.24, - "z": 5.19, - }, - "C6": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 59.38, - "y": 56.24, - "z": 5.19, - }, - "C7": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 68.38, - "y": 56.24, - "z": 5.19, - }, - "C8": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 77.38, - "y": 56.24, - "z": 5.19, - }, - "C9": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 86.38, - "y": 56.24, - "z": 5.19, - }, - "D1": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 14.38, - "y": 47.24, - "z": 5.19, - }, - "D10": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 95.38, - "y": 47.24, - "z": 5.19, - }, - "D11": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 104.38, - "y": 47.24, - "z": 5.19, - }, - "D12": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 113.38, - "y": 47.24, - "z": 5.19, - }, - "D2": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 23.38, - "y": 47.24, - "z": 5.19, - }, - "D3": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 32.38, - "y": 47.24, - "z": 5.19, - }, - "D4": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 41.38, - "y": 47.24, - "z": 5.19, - }, - "D5": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 50.38, - "y": 47.24, - "z": 5.19, - }, - "D6": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 59.38, - "y": 47.24, - "z": 5.19, - }, - "D7": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 68.38, - "y": 47.24, - "z": 5.19, - }, - "D8": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 77.38, - "y": 47.24, - "z": 5.19, - }, - "D9": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 86.38, - "y": 47.24, - "z": 5.19, - }, - "E1": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 14.38, - "y": 38.24, - "z": 5.19, - }, - "E10": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 95.38, - "y": 38.24, - "z": 5.19, - }, - "E11": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 104.38, - "y": 38.24, - "z": 5.19, - }, - "E12": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 113.38, - "y": 38.24, - "z": 5.19, - }, - "E2": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 23.38, - "y": 38.24, - "z": 5.19, - }, - "E3": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 32.38, - "y": 38.24, - "z": 5.19, - }, - "E4": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 41.38, - "y": 38.24, - "z": 5.19, - }, - "E5": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 50.38, - "y": 38.24, - "z": 5.19, - }, - "E6": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 59.38, - "y": 38.24, - "z": 5.19, - }, - "E7": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 68.38, - "y": 38.24, - "z": 5.19, - }, - "E8": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 77.38, - "y": 38.24, - "z": 5.19, - }, - "E9": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 86.38, - "y": 38.24, - "z": 5.19, - }, - "F1": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 14.38, - "y": 29.24, - "z": 5.19, - }, - "F10": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 95.38, - "y": 29.24, - "z": 5.19, - }, - "F11": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 104.38, - "y": 29.24, - "z": 5.19, - }, - "F12": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 113.38, - "y": 29.24, - "z": 5.19, - }, - "F2": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 23.38, - "y": 29.24, - "z": 5.19, - }, - "F3": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 32.38, - "y": 29.24, - "z": 5.19, - }, - "F4": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 41.38, - "y": 29.24, - "z": 5.19, - }, - "F5": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 50.38, - "y": 29.24, - "z": 5.19, - }, - "F6": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 59.38, - "y": 29.24, - "z": 5.19, - }, - "F7": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 68.38, - "y": 29.24, - "z": 5.19, - }, - "F8": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 77.38, - "y": 29.24, - "z": 5.19, - }, - "F9": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 86.38, - "y": 29.24, - "z": 5.19, - }, - "G1": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 14.38, - "y": 20.24, - "z": 5.19, - }, - "G10": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 95.38, - "y": 20.24, - "z": 5.19, - }, - "G11": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 104.38, - "y": 20.24, - "z": 5.19, - }, - "G12": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 113.38, - "y": 20.24, - "z": 5.19, - }, - "G2": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 23.38, - "y": 20.24, - "z": 5.19, - }, - "G3": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 32.38, - "y": 20.24, - "z": 5.19, - }, - "G4": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 41.38, - "y": 20.24, - "z": 5.19, - }, - "G5": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 50.38, - "y": 20.24, - "z": 5.19, - }, - "G6": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 59.38, - "y": 20.24, - "z": 5.19, - }, - "G7": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 68.38, - "y": 20.24, - "z": 5.19, - }, - "G8": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 77.38, - "y": 20.24, - "z": 5.19, - }, - "G9": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 86.38, - "y": 20.24, - "z": 5.19, - }, - "H1": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 14.38, - "y": 11.24, - "z": 5.19, - }, - "H10": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 95.38, - "y": 11.24, - "z": 5.19, - }, - "H11": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 104.38, - "y": 11.24, - "z": 5.19, - }, - "H12": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 113.38, - "y": 11.24, - "z": 5.19, - }, - "H2": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 23.38, - "y": 11.24, - "z": 5.19, - }, - "H3": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 32.38, - "y": 11.24, - "z": 5.19, - }, - "H4": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 41.38, - "y": 11.24, - "z": 5.19, - }, - "H5": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 50.38, - "y": 11.24, - "z": 5.19, - }, - "H6": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 59.38, - "y": 11.24, - "z": 5.19, - }, - "H7": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 68.38, - "y": 11.24, - "z": 5.19, - }, - "H8": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 77.38, - "y": 11.24, - "z": 5.19, - }, - "H9": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 86.38, - "y": 11.24, - "z": 5.19, - }, - }, - }, - "id": "tiprack1Id", - "labwareDefURI": "fixture/fixture_tiprack_300_ul/1", - }, - "tiprack2Id": Object { - "def": Object { - "brand": Object { - "brand": "Fixture Brand", - }, - "cornerOffsetFromSlot": Object { - "x": 0, - "y": 0, - "z": 0, - }, - "dimensions": Object { - "xDimension": 127.76, - "yDimension": 85.48, - "zDimension": 64.49, - }, - "groups": Array [ - Object { - "metadata": Object {}, - "wells": Array [ - "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", - ], - }, - ], - "metadata": Object { - "displayCategory": "tipRack", - "displayName": "300ul Tiprack FIXTURE", - "displayVolumeUnits": "µL", - "tags": Array [], - }, - "namespace": "fixture", - "ordering": Array [ - Array [ - "A1", - "B1", - "C1", - "D1", - "E1", - "F1", - "G1", - "H1", - ], - Array [ - "A2", - "B2", - "C2", - "D2", - "E2", - "F2", - "G2", - "H2", - ], - Array [ - "A3", - "B3", - "C3", - "D3", - "E3", - "F3", - "G3", - "H3", - ], - Array [ - "A4", - "B4", - "C4", - "D4", - "E4", - "F4", - "G4", - "H4", - ], - Array [ - "A5", - "B5", - "C5", - "D5", - "E5", - "F5", - "G5", - "H5", - ], - Array [ - "A6", - "B6", - "C6", - "D6", - "E6", - "F6", - "G6", - "H6", - ], - Array [ - "A7", - "B7", - "C7", - "D7", - "E7", - "F7", - "G7", - "H7", - ], - Array [ - "A8", - "B8", - "C8", - "D8", - "E8", - "F8", - "G8", - "H8", - ], - Array [ - "A9", - "B9", - "C9", - "D9", - "E9", - "F9", - "G9", - "H9", - ], - Array [ - "A10", - "B10", - "C10", - "D10", - "E10", - "F10", - "G10", - "H10", - ], - Array [ - "A11", - "B11", - "C11", - "D11", - "E11", - "F11", - "G11", - "H11", - ], - Array [ - "A12", - "B12", - "C12", - "D12", - "E12", - "F12", - "G12", - "H12", - ], - ], - "parameters": Object { - "format": "96Standard", - "isMagneticModuleCompatible": false, - "isTiprack": true, - "loadName": "fixture_tiprack_300_ul", - "tipLength": 59.3, - }, - "schemaVersion": 2, - "version": 1, - "wells": Object { - "A1": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 14.38, - "y": 74.24, - "z": 5.19, - }, - "A10": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 95.38, - "y": 74.24, - "z": 5.19, - }, - "A11": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 104.38, - "y": 74.24, - "z": 5.19, - }, - "A12": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 113.38, - "y": 74.24, - "z": 5.19, - }, - "A2": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 23.38, - "y": 74.24, - "z": 5.19, - }, - "A3": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 32.38, - "y": 74.24, - "z": 5.19, - }, - "A4": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 41.38, - "y": 74.24, - "z": 5.19, - }, - "A5": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 50.38, - "y": 74.24, - "z": 5.19, - }, - "A6": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 59.38, - "y": 74.24, - "z": 5.19, - }, - "A7": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 68.38, - "y": 74.24, - "z": 5.19, - }, - "A8": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 77.38, - "y": 74.24, - "z": 5.19, - }, - "A9": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 86.38, - "y": 74.24, - "z": 5.19, - }, - "B1": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 14.38, - "y": 65.24, - "z": 5.19, - }, - "B10": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 95.38, - "y": 65.24, - "z": 5.19, - }, - "B11": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 104.38, - "y": 65.24, - "z": 5.19, - }, - "B12": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 113.38, - "y": 65.24, - "z": 5.19, - }, - "B2": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 23.38, - "y": 65.24, - "z": 5.19, - }, - "B3": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 32.38, - "y": 65.24, - "z": 5.19, - }, - "B4": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 41.38, - "y": 65.24, - "z": 5.19, - }, - "B5": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 50.38, - "y": 65.24, - "z": 5.19, - }, - "B6": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 59.38, - "y": 65.24, - "z": 5.19, - }, - "B7": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 68.38, - "y": 65.24, - "z": 5.19, - }, - "B8": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 77.38, - "y": 65.24, - "z": 5.19, - }, - "B9": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 86.38, - "y": 65.24, - "z": 5.19, - }, - "C1": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 14.38, - "y": 56.24, - "z": 5.19, - }, - "C10": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 95.38, - "y": 56.24, - "z": 5.19, - }, - "C11": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 104.38, - "y": 56.24, - "z": 5.19, - }, - "C12": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 113.38, - "y": 56.24, - "z": 5.19, - }, - "C2": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 23.38, - "y": 56.24, - "z": 5.19, - }, - "C3": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 32.38, - "y": 56.24, - "z": 5.19, - }, - "C4": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 41.38, - "y": 56.24, - "z": 5.19, - }, - "C5": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 50.38, - "y": 56.24, - "z": 5.19, - }, - "C6": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 59.38, - "y": 56.24, - "z": 5.19, - }, - "C7": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 68.38, - "y": 56.24, - "z": 5.19, - }, - "C8": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 77.38, - "y": 56.24, - "z": 5.19, - }, - "C9": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 86.38, - "y": 56.24, - "z": 5.19, - }, - "D1": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 14.38, - "y": 47.24, - "z": 5.19, - }, - "D10": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 95.38, - "y": 47.24, - "z": 5.19, - }, - "D11": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 104.38, - "y": 47.24, - "z": 5.19, - }, - "D12": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 113.38, - "y": 47.24, - "z": 5.19, - }, - "D2": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 23.38, - "y": 47.24, - "z": 5.19, - }, - "D3": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 32.38, - "y": 47.24, - "z": 5.19, - }, - "D4": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 41.38, - "y": 47.24, - "z": 5.19, - }, - "D5": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 50.38, - "y": 47.24, - "z": 5.19, - }, - "D6": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 59.38, - "y": 47.24, - "z": 5.19, - }, - "D7": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 68.38, - "y": 47.24, - "z": 5.19, - }, - "D8": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 77.38, - "y": 47.24, - "z": 5.19, - }, - "D9": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 86.38, - "y": 47.24, - "z": 5.19, - }, - "E1": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 14.38, - "y": 38.24, - "z": 5.19, - }, - "E10": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 95.38, - "y": 38.24, - "z": 5.19, - }, - "E11": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 104.38, - "y": 38.24, - "z": 5.19, - }, - "E12": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 113.38, - "y": 38.24, - "z": 5.19, - }, - "E2": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 23.38, - "y": 38.24, - "z": 5.19, - }, - "E3": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 32.38, - "y": 38.24, - "z": 5.19, - }, - "E4": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 41.38, - "y": 38.24, - "z": 5.19, - }, - "E5": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 50.38, - "y": 38.24, - "z": 5.19, - }, - "E6": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 59.38, - "y": 38.24, - "z": 5.19, - }, - "E7": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 68.38, - "y": 38.24, - "z": 5.19, - }, - "E8": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 77.38, - "y": 38.24, - "z": 5.19, - }, - "E9": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 86.38, - "y": 38.24, - "z": 5.19, - }, - "F1": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 14.38, - "y": 29.24, - "z": 5.19, - }, - "F10": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 95.38, - "y": 29.24, - "z": 5.19, - }, - "F11": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 104.38, - "y": 29.24, - "z": 5.19, - }, - "F12": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 113.38, - "y": 29.24, - "z": 5.19, - }, - "F2": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 23.38, - "y": 29.24, - "z": 5.19, - }, - "F3": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 32.38, - "y": 29.24, - "z": 5.19, - }, - "F4": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 41.38, - "y": 29.24, - "z": 5.19, - }, - "F5": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 50.38, - "y": 29.24, - "z": 5.19, - }, - "F6": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 59.38, - "y": 29.24, - "z": 5.19, - }, - "F7": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 68.38, - "y": 29.24, - "z": 5.19, - }, - "F8": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 77.38, - "y": 29.24, - "z": 5.19, - }, - "F9": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 86.38, - "y": 29.24, - "z": 5.19, - }, - "G1": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 14.38, - "y": 20.24, - "z": 5.19, - }, - "G10": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 95.38, - "y": 20.24, - "z": 5.19, - }, - "G11": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 104.38, - "y": 20.24, - "z": 5.19, - }, - "G12": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 113.38, - "y": 20.24, - "z": 5.19, - }, - "G2": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 23.38, - "y": 20.24, - "z": 5.19, - }, - "G3": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 32.38, - "y": 20.24, - "z": 5.19, - }, - "G4": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 41.38, - "y": 20.24, - "z": 5.19, - }, - "G5": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 50.38, - "y": 20.24, - "z": 5.19, - }, - "G6": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 59.38, - "y": 20.24, - "z": 5.19, - }, - "G7": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 68.38, - "y": 20.24, - "z": 5.19, - }, - "G8": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 77.38, - "y": 20.24, - "z": 5.19, - }, - "G9": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 86.38, - "y": 20.24, - "z": 5.19, - }, - "H1": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 14.38, - "y": 11.24, - "z": 5.19, - }, - "H10": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 95.38, - "y": 11.24, - "z": 5.19, - }, - "H11": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 104.38, - "y": 11.24, - "z": 5.19, - }, - "H12": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 113.38, - "y": 11.24, - "z": 5.19, - }, - "H2": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 23.38, - "y": 11.24, - "z": 5.19, - }, - "H3": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 32.38, - "y": 11.24, - "z": 5.19, - }, - "H4": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 41.38, - "y": 11.24, - "z": 5.19, - }, - "H5": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 50.38, - "y": 11.24, - "z": 5.19, - }, - "H6": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 59.38, - "y": 11.24, - "z": 5.19, - }, - "H7": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 68.38, - "y": 11.24, - "z": 5.19, - }, - "H8": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 77.38, - "y": 11.24, - "z": 5.19, - }, - "H9": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 86.38, - "y": 11.24, - "z": 5.19, - }, - }, - }, - "id": "tiprack2Id", - "labwareDefURI": "fixture/fixture_tiprack_300_ul/1", - }, - "tiprack3Id": Object { - "def": Object { - "brand": Object { - "brand": "Fixture Brand", - }, - "cornerOffsetFromSlot": Object { - "x": 0, - "y": 0, - "z": 0, - }, - "dimensions": Object { - "xDimension": 127.76, - "yDimension": 85.48, - "zDimension": 64.49, - }, - "groups": Array [ - Object { - "metadata": Object {}, - "wells": Array [ - "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", - ], - }, - ], - "metadata": Object { - "displayCategory": "tipRack", - "displayName": "300ul Tiprack FIXTURE", - "displayVolumeUnits": "µL", - "tags": Array [], - }, - "namespace": "fixture", - "ordering": Array [ - Array [ - "A1", - "B1", - "C1", - "D1", - "E1", - "F1", - "G1", - "H1", - ], - Array [ - "A2", - "B2", - "C2", - "D2", - "E2", - "F2", - "G2", - "H2", - ], - Array [ - "A3", - "B3", - "C3", - "D3", - "E3", - "F3", - "G3", - "H3", - ], - Array [ - "A4", - "B4", - "C4", - "D4", - "E4", - "F4", - "G4", - "H4", - ], - Array [ - "A5", - "B5", - "C5", - "D5", - "E5", - "F5", - "G5", - "H5", - ], - Array [ - "A6", - "B6", - "C6", - "D6", - "E6", - "F6", - "G6", - "H6", - ], - Array [ - "A7", - "B7", - "C7", - "D7", - "E7", - "F7", - "G7", - "H7", - ], - Array [ - "A8", - "B8", - "C8", - "D8", - "E8", - "F8", - "G8", - "H8", - ], - Array [ - "A9", - "B9", - "C9", - "D9", - "E9", - "F9", - "G9", - "H9", - ], - Array [ - "A10", - "B10", - "C10", - "D10", - "E10", - "F10", - "G10", - "H10", - ], - Array [ - "A11", - "B11", - "C11", - "D11", - "E11", - "F11", - "G11", - "H11", - ], - Array [ - "A12", - "B12", - "C12", - "D12", - "E12", - "F12", - "G12", - "H12", - ], - ], - "parameters": Object { - "format": "96Standard", - "isMagneticModuleCompatible": false, - "isTiprack": true, - "loadName": "fixture_tiprack_300_ul", - "tipLength": 59.3, - }, - "schemaVersion": 2, - "version": 1, - "wells": Object { - "A1": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 14.38, - "y": 74.24, - "z": 5.19, - }, - "A10": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 95.38, - "y": 74.24, - "z": 5.19, - }, - "A11": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 104.38, - "y": 74.24, - "z": 5.19, - }, - "A12": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 113.38, - "y": 74.24, - "z": 5.19, - }, - "A2": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 23.38, - "y": 74.24, - "z": 5.19, - }, - "A3": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 32.38, - "y": 74.24, - "z": 5.19, - }, - "A4": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 41.38, - "y": 74.24, - "z": 5.19, - }, - "A5": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 50.38, - "y": 74.24, - "z": 5.19, - }, - "A6": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 59.38, - "y": 74.24, - "z": 5.19, - }, - "A7": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 68.38, - "y": 74.24, - "z": 5.19, - }, - "A8": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 77.38, - "y": 74.24, - "z": 5.19, - }, - "A9": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 86.38, - "y": 74.24, - "z": 5.19, - }, - "B1": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 14.38, - "y": 65.24, - "z": 5.19, - }, - "B10": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 95.38, - "y": 65.24, - "z": 5.19, - }, - "B11": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 104.38, - "y": 65.24, - "z": 5.19, - }, - "B12": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 113.38, - "y": 65.24, - "z": 5.19, - }, - "B2": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 23.38, - "y": 65.24, - "z": 5.19, - }, - "B3": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 32.38, - "y": 65.24, - "z": 5.19, - }, - "B4": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 41.38, - "y": 65.24, - "z": 5.19, - }, - "B5": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 50.38, - "y": 65.24, - "z": 5.19, - }, - "B6": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 59.38, - "y": 65.24, - "z": 5.19, - }, - "B7": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 68.38, - "y": 65.24, - "z": 5.19, - }, - "B8": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 77.38, - "y": 65.24, - "z": 5.19, - }, - "B9": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 86.38, - "y": 65.24, - "z": 5.19, - }, - "C1": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 14.38, - "y": 56.24, - "z": 5.19, - }, - "C10": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 95.38, - "y": 56.24, - "z": 5.19, - }, - "C11": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 104.38, - "y": 56.24, - "z": 5.19, - }, - "C12": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 113.38, - "y": 56.24, - "z": 5.19, - }, - "C2": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 23.38, - "y": 56.24, - "z": 5.19, - }, - "C3": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 32.38, - "y": 56.24, - "z": 5.19, - }, - "C4": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 41.38, - "y": 56.24, - "z": 5.19, - }, - "C5": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 50.38, - "y": 56.24, - "z": 5.19, - }, - "C6": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 59.38, - "y": 56.24, - "z": 5.19, - }, - "C7": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 68.38, - "y": 56.24, - "z": 5.19, - }, - "C8": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 77.38, - "y": 56.24, - "z": 5.19, - }, - "C9": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 86.38, - "y": 56.24, - "z": 5.19, - }, - "D1": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 14.38, - "y": 47.24, - "z": 5.19, - }, - "D10": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 95.38, - "y": 47.24, - "z": 5.19, - }, - "D11": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 104.38, - "y": 47.24, - "z": 5.19, - }, - "D12": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 113.38, - "y": 47.24, - "z": 5.19, - }, - "D2": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 23.38, - "y": 47.24, - "z": 5.19, - }, - "D3": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 32.38, - "y": 47.24, - "z": 5.19, - }, - "D4": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 41.38, - "y": 47.24, - "z": 5.19, - }, - "D5": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 50.38, - "y": 47.24, - "z": 5.19, - }, - "D6": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 59.38, - "y": 47.24, - "z": 5.19, - }, - "D7": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 68.38, - "y": 47.24, - "z": 5.19, - }, - "D8": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 77.38, - "y": 47.24, - "z": 5.19, - }, - "D9": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 86.38, - "y": 47.24, - "z": 5.19, - }, - "E1": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 14.38, - "y": 38.24, - "z": 5.19, - }, - "E10": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 95.38, - "y": 38.24, - "z": 5.19, - }, - "E11": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 104.38, - "y": 38.24, - "z": 5.19, - }, - "E12": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 113.38, - "y": 38.24, - "z": 5.19, - }, - "E2": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 23.38, - "y": 38.24, - "z": 5.19, - }, - "E3": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 32.38, - "y": 38.24, - "z": 5.19, - }, - "E4": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 41.38, - "y": 38.24, - "z": 5.19, - }, - "E5": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 50.38, - "y": 38.24, - "z": 5.19, - }, - "E6": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 59.38, - "y": 38.24, - "z": 5.19, - }, - "E7": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 68.38, - "y": 38.24, - "z": 5.19, - }, - "E8": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 77.38, - "y": 38.24, - "z": 5.19, - }, - "E9": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 86.38, - "y": 38.24, - "z": 5.19, - }, - "F1": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 14.38, - "y": 29.24, - "z": 5.19, - }, - "F10": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 95.38, - "y": 29.24, - "z": 5.19, - }, - "F11": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 104.38, - "y": 29.24, - "z": 5.19, - }, - "F12": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 113.38, - "y": 29.24, - "z": 5.19, - }, - "F2": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 23.38, - "y": 29.24, - "z": 5.19, - }, - "F3": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 32.38, - "y": 29.24, - "z": 5.19, - }, - "F4": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 41.38, - "y": 29.24, - "z": 5.19, - }, - "F5": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 50.38, - "y": 29.24, - "z": 5.19, - }, - "F6": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 59.38, - "y": 29.24, - "z": 5.19, - }, - "F7": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 68.38, - "y": 29.24, - "z": 5.19, - }, - "F8": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 77.38, - "y": 29.24, - "z": 5.19, - }, - "F9": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 86.38, - "y": 29.24, - "z": 5.19, - }, - "G1": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 14.38, - "y": 20.24, - "z": 5.19, - }, - "G10": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 95.38, - "y": 20.24, - "z": 5.19, - }, - "G11": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 104.38, - "y": 20.24, - "z": 5.19, - }, - "G12": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 113.38, - "y": 20.24, - "z": 5.19, - }, - "G2": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 23.38, - "y": 20.24, - "z": 5.19, - }, - "G3": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 32.38, - "y": 20.24, - "z": 5.19, - }, - "G4": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 41.38, - "y": 20.24, - "z": 5.19, - }, - "G5": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 50.38, - "y": 20.24, - "z": 5.19, - }, - "G6": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 59.38, - "y": 20.24, - "z": 5.19, - }, - "G7": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 68.38, - "y": 20.24, - "z": 5.19, - }, - "G8": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 77.38, - "y": 20.24, - "z": 5.19, - }, - "G9": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 86.38, - "y": 20.24, - "z": 5.19, - }, - "H1": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 14.38, - "y": 11.24, - "z": 5.19, - }, - "H10": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 95.38, - "y": 11.24, - "z": 5.19, - }, - "H11": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 104.38, - "y": 11.24, - "z": 5.19, - }, - "H12": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 113.38, - "y": 11.24, - "z": 5.19, - }, - "H2": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 23.38, - "y": 11.24, - "z": 5.19, - }, - "H3": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 32.38, - "y": 11.24, - "z": 5.19, - }, - "H4": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 41.38, - "y": 11.24, - "z": 5.19, - }, - "H5": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 50.38, - "y": 11.24, - "z": 5.19, - }, - "H6": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 59.38, - "y": 11.24, - "z": 5.19, - }, - "H7": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 68.38, - "y": 11.24, - "z": 5.19, - }, - "H8": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 77.38, - "y": 11.24, - "z": 5.19, - }, - "H9": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 86.38, - "y": 11.24, - "z": 5.19, - }, - }, - }, - "id": "tiprack3Id", - "labwareDefURI": "fixture/fixture_tiprack_300_ul/1", - }, - "tiprack4AdapterId": Object { - "def": Object { - "allowedRoles": Array [ - "adapter", - ], - "brand": Object { - "brand": "Fixture", - "brandId": Array [], - }, - "cornerOffsetFromSlot": Object { - "x": -14.25, - "y": -3.5, - "z": 0, - }, - "dimensions": Object { - "xDimension": 156.5, - "yDimension": 93, - "zDimension": 132, - }, - "groups": Array [ - Object { - "metadata": Object {}, - "wells": Array [], - }, - ], - "metadata": Object { - "displayCategory": "adapter", - "displayName": "Fixture Flex 96 Tip Rack Adapter", - "displayVolumeUnits": "µL", - "tags": Array [], - }, - "namespace": "fixture", - "ordering": Array [], - "parameters": Object { - "format": "96Standard", - "isMagneticModuleCompatible": false, - "isTiprack": false, - "loadName": "fixture_flex_96_tiprack_adapter", - "quirks": Array [], - }, - "schemaVersion": 2, - "version": 1, - "wells": Object {}, - }, - "id": "tiprack4AdapterId", - "labwareDefURI": "fixture/fixture_flex_96_tiprack_adapter/1", - }, - "tiprack4Id": Object { - "def": Object { - "brand": Object { - "brand": "Fixture", - "brandId": Array [], - }, - "cornerOffsetFromSlot": Object { - "x": 0, - "y": 0, - "z": 0, - }, - "dimensions": Object { - "xDimension": 127.75, - "yDimension": 85.75, - "zDimension": 99, - }, - "gripForce": 16, - "gripHeightFromLabwareBottom": 23.9, - "groups": Array [ - Object { - "metadata": Object {}, - "wells": Array [ - "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", - ], - }, - ], - "metadata": Object { - "displayCategory": "tipRack", - "displayName": "Fixture Flex Tiprack 1000 uL", - "displayVolumeUnits": "µL", - "tags": Array [], - }, - "namespace": "fixture", - "ordering": Array [ - Array [ - "A1", - "B1", - "C1", - "D1", - "E1", - "F1", - "G1", - "H1", - ], - Array [ - "A2", - "B2", - "C2", - "D2", - "E2", - "F2", - "G2", - "H2", - ], - Array [ - "A3", - "B3", - "C3", - "D3", - "E3", - "F3", - "G3", - "H3", - ], - Array [ - "A4", - "B4", - "C4", - "D4", - "E4", - "F4", - "G4", - "H4", - ], - Array [ - "A5", - "B5", - "C5", - "D5", - "E5", - "F5", - "G5", - "H5", - ], - Array [ - "A6", - "B6", - "C6", - "D6", - "E6", - "F6", - "G6", - "H6", - ], - Array [ - "A7", - "B7", - "C7", - "D7", - "E7", - "F7", - "G7", - "H7", - ], - Array [ - "A8", - "B8", - "C8", - "D8", - "E8", - "F8", - "G8", - "H8", - ], - Array [ - "A9", - "B9", - "C9", - "D9", - "E9", - "F9", - "G9", - "H9", - ], - Array [ - "A10", - "B10", - "C10", - "D10", - "E10", - "F10", - "G10", - "H10", - ], - Array [ - "A11", - "B11", - "C11", - "D11", - "E11", - "F11", - "G11", - "H11", - ], - Array [ - "A12", - "B12", - "C12", - "D12", - "E12", - "F12", - "G12", - "H12", - ], - ], - "parameters": Object { - "format": "96Standard", - "isMagneticModuleCompatible": false, - "isTiprack": true, - "loadName": "fixture_flex_96_tiprack_1000ul", - "quirks": Array [], - "tipLength": 95.6, - "tipOverlap": 10.5, - }, - "schemaVersion": 2, - "stackingOffsetWithLabware": Object { - "opentrons_flex_96_tiprack_adapter": Object { - "x": 0, - "y": 0, - "z": 121, - }, - }, - "version": 1, - "wells": Object { - "A1": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 14.38, - "y": 74.38, - "z": 1.5, - }, - "A10": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 95.38, - "y": 74.38, - "z": 1.5, - }, - "A11": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 104.38, - "y": 74.38, - "z": 1.5, - }, - "A12": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 113.38, - "y": 74.38, - "z": 1.5, - }, - "A2": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 23.38, - "y": 74.38, - "z": 1.5, - }, - "A3": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 32.38, - "y": 74.38, - "z": 1.5, - }, - "A4": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 41.38, - "y": 74.38, - "z": 1.5, - }, - "A5": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 50.38, - "y": 74.38, - "z": 1.5, - }, - "A6": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 59.38, - "y": 74.38, - "z": 1.5, - }, - "A7": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 68.38, - "y": 74.38, - "z": 1.5, - }, - "A8": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 77.38, - "y": 74.38, - "z": 1.5, - }, - "A9": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 86.38, - "y": 74.38, - "z": 1.5, - }, - "B1": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 14.38, - "y": 65.38, - "z": 1.5, - }, - "B10": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 95.38, - "y": 65.38, - "z": 1.5, - }, - "B11": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 104.38, - "y": 65.38, - "z": 1.5, - }, - "B12": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 113.38, - "y": 65.38, - "z": 1.5, - }, - "B2": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 23.38, - "y": 65.38, - "z": 1.5, - }, - "B3": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 32.38, - "y": 65.38, - "z": 1.5, - }, - "B4": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 41.38, - "y": 65.38, - "z": 1.5, - }, - "B5": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 50.38, - "y": 65.38, - "z": 1.5, - }, - "B6": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 59.38, - "y": 65.38, - "z": 1.5, - }, - "B7": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 68.38, - "y": 65.38, - "z": 1.5, - }, - "B8": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 77.38, - "y": 65.38, - "z": 1.5, - }, - "B9": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 86.38, - "y": 65.38, - "z": 1.5, - }, - "C1": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 14.38, - "y": 56.38, - "z": 1.5, - }, - "C10": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 95.38, - "y": 56.38, - "z": 1.5, - }, - "C11": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 104.38, - "y": 56.38, - "z": 1.5, - }, - "C12": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 113.38, - "y": 56.38, - "z": 1.5, - }, - "C2": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 23.38, - "y": 56.38, - "z": 1.5, - }, - "C3": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 32.38, - "y": 56.38, - "z": 1.5, - }, - "C4": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 41.38, - "y": 56.38, - "z": 1.5, - }, - "C5": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 50.38, - "y": 56.38, - "z": 1.5, - }, - "C6": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 59.38, - "y": 56.38, - "z": 1.5, - }, - "C7": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 68.38, - "y": 56.38, - "z": 1.5, - }, - "C8": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 77.38, - "y": 56.38, - "z": 1.5, - }, - "C9": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 86.38, - "y": 56.38, - "z": 1.5, - }, - "D1": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 14.38, - "y": 47.38, - "z": 1.5, - }, - "D10": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 95.38, - "y": 47.38, - "z": 1.5, - }, - "D11": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 104.38, - "y": 47.38, - "z": 1.5, - }, - "D12": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 113.38, - "y": 47.38, - "z": 1.5, - }, - "D2": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 23.38, - "y": 47.38, - "z": 1.5, - }, - "D3": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 32.38, - "y": 47.38, - "z": 1.5, - }, - "D4": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 41.38, - "y": 47.38, - "z": 1.5, - }, - "D5": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 50.38, - "y": 47.38, - "z": 1.5, - }, - "D6": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 59.38, - "y": 47.38, - "z": 1.5, - }, - "D7": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 68.38, - "y": 47.38, - "z": 1.5, - }, - "D8": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 77.38, - "y": 47.38, - "z": 1.5, - }, - "D9": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 86.38, - "y": 47.38, - "z": 1.5, - }, - "E1": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 14.38, - "y": 38.38, - "z": 1.5, - }, - "E10": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 95.38, - "y": 38.38, - "z": 1.5, - }, - "E11": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 104.38, - "y": 38.38, - "z": 1.5, - }, - "E12": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 113.38, - "y": 38.38, - "z": 1.5, - }, - "E2": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 23.38, - "y": 38.38, - "z": 1.5, - }, - "E3": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 32.38, - "y": 38.38, - "z": 1.5, - }, - "E4": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 41.38, - "y": 38.38, - "z": 1.5, - }, - "E5": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 50.38, - "y": 38.38, - "z": 1.5, - }, - "E6": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 59.38, - "y": 38.38, - "z": 1.5, - }, - "E7": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 68.38, - "y": 38.38, - "z": 1.5, - }, - "E8": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 77.38, - "y": 38.38, - "z": 1.5, - }, - "E9": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 86.38, - "y": 38.38, - "z": 1.5, - }, - "F1": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 14.38, - "y": 29.38, - "z": 1.5, - }, - "F10": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 95.38, - "y": 29.38, - "z": 1.5, - }, - "F11": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 104.38, - "y": 29.38, - "z": 1.5, - }, - "F12": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 113.38, - "y": 29.38, - "z": 1.5, - }, - "F2": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 23.38, - "y": 29.38, - "z": 1.5, - }, - "F3": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 32.38, - "y": 29.38, - "z": 1.5, - }, - "F4": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 41.38, - "y": 29.38, - "z": 1.5, - }, - "F5": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 50.38, - "y": 29.38, - "z": 1.5, - }, - "F6": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 59.38, - "y": 29.38, - "z": 1.5, - }, - "F7": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 68.38, - "y": 29.38, - "z": 1.5, - }, - "F8": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 77.38, - "y": 29.38, - "z": 1.5, - }, - "F9": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 86.38, - "y": 29.38, - "z": 1.5, - }, - "G1": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 14.38, - "y": 20.38, - "z": 1.5, - }, - "G10": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 95.38, - "y": 20.38, - "z": 1.5, - }, - "G11": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 104.38, - "y": 20.38, - "z": 1.5, - }, - "G12": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 113.38, - "y": 20.38, - "z": 1.5, - }, - "G2": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 23.38, - "y": 20.38, - "z": 1.5, - }, - "G3": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 32.38, - "y": 20.38, - "z": 1.5, - }, - "G4": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 41.38, - "y": 20.38, - "z": 1.5, - }, - "G5": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 50.38, - "y": 20.38, - "z": 1.5, - }, - "G6": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 59.38, - "y": 20.38, - "z": 1.5, - }, - "G7": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 68.38, - "y": 20.38, - "z": 1.5, - }, - "G8": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 77.38, - "y": 20.38, - "z": 1.5, - }, - "G9": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 86.38, - "y": 20.38, - "z": 1.5, - }, - "H1": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 14.38, - "y": 11.38, - "z": 1.5, - }, - "H10": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 95.38, - "y": 11.38, - "z": 1.5, - }, - "H11": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 104.38, - "y": 11.38, - "z": 1.5, - }, - "H12": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 113.38, - "y": 11.38, - "z": 1.5, - }, - "H2": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 23.38, - "y": 11.38, - "z": 1.5, - }, - "H3": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 32.38, - "y": 11.38, - "z": 1.5, - }, - "H4": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 41.38, - "y": 11.38, - "z": 1.5, - }, - "H5": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 50.38, - "y": 11.38, - "z": 1.5, - }, - "H6": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 59.38, - "y": 11.38, - "z": 1.5, - }, - "H7": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 68.38, - "y": 11.38, - "z": 1.5, - }, - "H8": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 77.38, - "y": 11.38, - "z": 1.5, - }, - "H9": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 86.38, - "y": 11.38, - "z": 1.5, - }, - }, - }, - "id": "tiprack4Id", - "labwareDefURI": "fixture/fixture_flex_96_tiprack_1000ul/1", - }, - "tiprack5AdapterId": Object { - "def": Object { - "allowedRoles": Array [ - "adapter", - ], - "brand": Object { - "brand": "Fixture", - "brandId": Array [], - }, - "cornerOffsetFromSlot": Object { - "x": -14.25, - "y": -3.5, - "z": 0, - }, - "dimensions": Object { - "xDimension": 156.5, - "yDimension": 93, - "zDimension": 132, - }, - "groups": Array [ - Object { - "metadata": Object {}, - "wells": Array [], - }, - ], - "metadata": Object { - "displayCategory": "adapter", - "displayName": "Fixture Flex 96 Tip Rack Adapter", - "displayVolumeUnits": "µL", - "tags": Array [], - }, - "namespace": "fixture", - "ordering": Array [], - "parameters": Object { - "format": "96Standard", - "isMagneticModuleCompatible": false, - "isTiprack": false, - "loadName": "fixture_flex_96_tiprack_adapter", - "quirks": Array [], - }, - "schemaVersion": 2, - "version": 1, - "wells": Object {}, - }, - "id": "tiprack5AdapterId", - "labwareDefURI": "fixture/fixture_flex_96_tiprack_adapter/1", - }, - "tiprack5Id": Object { - "def": Object { - "brand": Object { - "brand": "Fixture", - "brandId": Array [], - }, - "cornerOffsetFromSlot": Object { - "x": 0, - "y": 0, - "z": 0, - }, - "dimensions": Object { - "xDimension": 127.75, - "yDimension": 85.75, - "zDimension": 99, - }, - "gripForce": 16, - "gripHeightFromLabwareBottom": 23.9, - "groups": Array [ - Object { - "metadata": Object {}, - "wells": Array [ - "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", - ], - }, - ], - "metadata": Object { - "displayCategory": "tipRack", - "displayName": "Fixture Flex Tiprack 1000 uL", - "displayVolumeUnits": "µL", - "tags": Array [], - }, - "namespace": "fixture", - "ordering": Array [ - Array [ - "A1", - "B1", - "C1", - "D1", - "E1", - "F1", - "G1", - "H1", - ], - Array [ - "A2", - "B2", - "C2", - "D2", - "E2", - "F2", - "G2", - "H2", - ], - Array [ - "A3", - "B3", - "C3", - "D3", - "E3", - "F3", - "G3", - "H3", - ], - Array [ - "A4", - "B4", - "C4", - "D4", - "E4", - "F4", - "G4", - "H4", - ], - Array [ - "A5", - "B5", - "C5", - "D5", - "E5", - "F5", - "G5", - "H5", - ], - Array [ - "A6", - "B6", - "C6", - "D6", - "E6", - "F6", - "G6", - "H6", - ], - Array [ - "A7", - "B7", - "C7", - "D7", - "E7", - "F7", - "G7", - "H7", - ], - Array [ - "A8", - "B8", - "C8", - "D8", - "E8", - "F8", - "G8", - "H8", - ], - Array [ - "A9", - "B9", - "C9", - "D9", - "E9", - "F9", - "G9", - "H9", - ], - Array [ - "A10", - "B10", - "C10", - "D10", - "E10", - "F10", - "G10", - "H10", - ], - Array [ - "A11", - "B11", - "C11", - "D11", - "E11", - "F11", - "G11", - "H11", - ], - Array [ - "A12", - "B12", - "C12", - "D12", - "E12", - "F12", - "G12", - "H12", - ], - ], - "parameters": Object { - "format": "96Standard", - "isMagneticModuleCompatible": false, - "isTiprack": true, - "loadName": "fixture_flex_96_tiprack_1000ul", - "quirks": Array [], - "tipLength": 95.6, - "tipOverlap": 10.5, - }, - "schemaVersion": 2, - "stackingOffsetWithLabware": Object { - "opentrons_flex_96_tiprack_adapter": Object { - "x": 0, - "y": 0, - "z": 121, - }, - }, - "version": 1, - "wells": Object { - "A1": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 14.38, - "y": 74.38, - "z": 1.5, - }, - "A10": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 95.38, - "y": 74.38, - "z": 1.5, - }, - "A11": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 104.38, - "y": 74.38, - "z": 1.5, - }, - "A12": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 113.38, - "y": 74.38, - "z": 1.5, - }, - "A2": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 23.38, - "y": 74.38, - "z": 1.5, - }, - "A3": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 32.38, - "y": 74.38, - "z": 1.5, - }, - "A4": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 41.38, - "y": 74.38, - "z": 1.5, - }, - "A5": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 50.38, - "y": 74.38, - "z": 1.5, - }, - "A6": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 59.38, - "y": 74.38, - "z": 1.5, - }, - "A7": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 68.38, - "y": 74.38, - "z": 1.5, - }, - "A8": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 77.38, - "y": 74.38, - "z": 1.5, - }, - "A9": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 86.38, - "y": 74.38, - "z": 1.5, - }, - "B1": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 14.38, - "y": 65.38, - "z": 1.5, - }, - "B10": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 95.38, - "y": 65.38, - "z": 1.5, - }, - "B11": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 104.38, - "y": 65.38, - "z": 1.5, - }, - "B12": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 113.38, - "y": 65.38, - "z": 1.5, - }, - "B2": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 23.38, - "y": 65.38, - "z": 1.5, - }, - "B3": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 32.38, - "y": 65.38, - "z": 1.5, - }, - "B4": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 41.38, - "y": 65.38, - "z": 1.5, - }, - "B5": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 50.38, - "y": 65.38, - "z": 1.5, - }, - "B6": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 59.38, - "y": 65.38, - "z": 1.5, - }, - "B7": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 68.38, - "y": 65.38, - "z": 1.5, - }, - "B8": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 77.38, - "y": 65.38, - "z": 1.5, - }, - "B9": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 86.38, - "y": 65.38, - "z": 1.5, - }, - "C1": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 14.38, - "y": 56.38, - "z": 1.5, - }, - "C10": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 95.38, - "y": 56.38, - "z": 1.5, - }, - "C11": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 104.38, - "y": 56.38, - "z": 1.5, - }, - "C12": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 113.38, - "y": 56.38, - "z": 1.5, - }, - "C2": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 23.38, - "y": 56.38, - "z": 1.5, - }, - "C3": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 32.38, - "y": 56.38, - "z": 1.5, - }, - "C4": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 41.38, - "y": 56.38, - "z": 1.5, - }, - "C5": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 50.38, - "y": 56.38, - "z": 1.5, - }, - "C6": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 59.38, - "y": 56.38, - "z": 1.5, - }, - "C7": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 68.38, - "y": 56.38, - "z": 1.5, - }, - "C8": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 77.38, - "y": 56.38, - "z": 1.5, - }, - "C9": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 86.38, - "y": 56.38, - "z": 1.5, - }, - "D1": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 14.38, - "y": 47.38, - "z": 1.5, - }, - "D10": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 95.38, - "y": 47.38, - "z": 1.5, - }, - "D11": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 104.38, - "y": 47.38, - "z": 1.5, - }, - "D12": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 113.38, - "y": 47.38, - "z": 1.5, - }, - "D2": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 23.38, - "y": 47.38, - "z": 1.5, - }, - "D3": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 32.38, - "y": 47.38, - "z": 1.5, - }, - "D4": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 41.38, - "y": 47.38, - "z": 1.5, - }, - "D5": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 50.38, - "y": 47.38, - "z": 1.5, - }, - "D6": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 59.38, - "y": 47.38, - "z": 1.5, - }, - "D7": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 68.38, - "y": 47.38, - "z": 1.5, - }, - "D8": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 77.38, - "y": 47.38, - "z": 1.5, - }, - "D9": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 86.38, - "y": 47.38, - "z": 1.5, - }, - "E1": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 14.38, - "y": 38.38, - "z": 1.5, - }, - "E10": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 95.38, - "y": 38.38, - "z": 1.5, - }, - "E11": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 104.38, - "y": 38.38, - "z": 1.5, - }, - "E12": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 113.38, - "y": 38.38, - "z": 1.5, - }, - "E2": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 23.38, - "y": 38.38, - "z": 1.5, - }, - "E3": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 32.38, - "y": 38.38, - "z": 1.5, - }, - "E4": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 41.38, - "y": 38.38, - "z": 1.5, - }, - "E5": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 50.38, - "y": 38.38, - "z": 1.5, - }, - "E6": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 59.38, - "y": 38.38, - "z": 1.5, - }, - "E7": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 68.38, - "y": 38.38, - "z": 1.5, - }, - "E8": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 77.38, - "y": 38.38, - "z": 1.5, - }, - "E9": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 86.38, - "y": 38.38, - "z": 1.5, - }, - "F1": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 14.38, - "y": 29.38, - "z": 1.5, - }, - "F10": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 95.38, - "y": 29.38, - "z": 1.5, - }, - "F11": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 104.38, - "y": 29.38, - "z": 1.5, - }, - "F12": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 113.38, - "y": 29.38, - "z": 1.5, - }, - "F2": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 23.38, - "y": 29.38, - "z": 1.5, - }, - "F3": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 32.38, - "y": 29.38, - "z": 1.5, - }, - "F4": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 41.38, - "y": 29.38, - "z": 1.5, - }, - "F5": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 50.38, - "y": 29.38, - "z": 1.5, - }, - "F6": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 59.38, - "y": 29.38, - "z": 1.5, - }, - "F7": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 68.38, - "y": 29.38, - "z": 1.5, - }, - "F8": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 77.38, - "y": 29.38, - "z": 1.5, - }, - "F9": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 86.38, - "y": 29.38, - "z": 1.5, - }, - "G1": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 14.38, - "y": 20.38, - "z": 1.5, - }, - "G10": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 95.38, - "y": 20.38, - "z": 1.5, - }, - "G11": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 104.38, - "y": 20.38, - "z": 1.5, - }, - "G12": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 113.38, - "y": 20.38, - "z": 1.5, - }, - "G2": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 23.38, - "y": 20.38, - "z": 1.5, - }, - "G3": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 32.38, - "y": 20.38, - "z": 1.5, - }, - "G4": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 41.38, - "y": 20.38, - "z": 1.5, - }, - "G5": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 50.38, - "y": 20.38, - "z": 1.5, - }, - "G6": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 59.38, - "y": 20.38, - "z": 1.5, - }, - "G7": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 68.38, - "y": 20.38, - "z": 1.5, - }, - "G8": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 77.38, - "y": 20.38, - "z": 1.5, - }, - "G9": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 86.38, - "y": 20.38, - "z": 1.5, - }, - "H1": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 14.38, - "y": 11.38, - "z": 1.5, - }, - "H10": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 95.38, - "y": 11.38, - "z": 1.5, - }, - "H11": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 104.38, - "y": 11.38, - "z": 1.5, - }, - "H12": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 113.38, - "y": 11.38, - "z": 1.5, - }, - "H2": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 23.38, - "y": 11.38, - "z": 1.5, - }, - "H3": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 32.38, - "y": 11.38, - "z": 1.5, - }, - "H4": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 41.38, - "y": 11.38, - "z": 1.5, - }, - "H5": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 50.38, - "y": 11.38, - "z": 1.5, - }, - "H6": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 59.38, - "y": 11.38, - "z": 1.5, - }, - "H7": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 68.38, - "y": 11.38, - "z": 1.5, - }, - "H8": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 77.38, - "y": 11.38, - "z": 1.5, - }, - "H9": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 86.38, - "y": 11.38, - "z": 1.5, - }, - }, - }, - "id": "tiprack5Id", - "labwareDefURI": "fixture/fixture_flex_96_tiprack_1000ul/1", - }, - "troughId": Object { - "def": Object { - "brand": Object { - "brand": "USA Scientific", - "brandId": Array [ - "1061-8150", - ], - }, - "cornerOffsetFromSlot": Object { - "x": 0, - "y": 0, - "z": 0, - }, - "dimensions": Object { - "xDimension": 127.76, - "yDimension": 85.8, - "zDimension": 44.45, - }, - "groups": Array [ - Object { - "metadata": Object { - "wellBottomShape": "v", - }, - "wells": Array [ - "A1", - "A2", - "A3", - "A4", - "A5", - "A6", - "A7", - "A8", - "A9", - "A10", - "A11", - "A12", - ], - }, - ], - "metadata": Object { - "displayCategory": "reservoir", - "displayName": "12 Channel Trough", - "displayVolumeUnits": "mL", - }, - "namespace": "fixture", - "ordering": Array [ - Array [ - "A1", - ], - Array [ - "A2", - ], - Array [ - "A3", - ], - Array [ - "A4", - ], - Array [ - "A5", - ], - Array [ - "A6", - ], - Array [ - "A7", - ], - Array [ - "A8", - ], - Array [ - "A9", - ], - Array [ - "A10", - ], - Array [ - "A11", - ], - Array [ - "A12", - ], - ], - "parameters": Object { - "format": "trough", - "isMagneticModuleCompatible": false, - "isTiprack": false, - "loadName": "fixture_12_trough", - "quirks": Array [ - "centerMultichannelOnWells", - "touchTipDisabled", - ], - }, - "schemaVersion": 2, - "version": 1, - "wells": Object { - "A1": Object { - "depth": 42.16, - "shape": "rectangular", - "totalLiquidVolume": 22000, - "x": 13.94, - "xDimension": 8.33, - "y": 42.9, - "yDimension": 71.88, - "z": 2.29, - }, - "A10": Object { - "depth": 42.16, - "shape": "rectangular", - "totalLiquidVolume": 22000, - "x": 95.75, - "xDimension": 8.33, - "y": 42.9, - "yDimension": 71.88, - "z": 2.29, - }, - "A11": Object { - "depth": 42.16, - "shape": "rectangular", - "totalLiquidVolume": 22000, - "x": 104.84, - "xDimension": 8.33, - "y": 42.9, - "yDimension": 71.88, - "z": 2.29, - }, - "A12": Object { - "depth": 42.16, - "shape": "rectangular", - "totalLiquidVolume": 22000, - "x": 113.93, - "xDimension": 8.33, - "y": 42.9, - "yDimension": 71.88, - "z": 2.29, - }, - "A2": Object { - "depth": 42.16, - "shape": "rectangular", - "totalLiquidVolume": 22000, - "x": 23.03, - "xDimension": 8.33, - "y": 42.9, - "yDimension": 71.88, - "z": 2.29, - }, - "A3": Object { - "depth": 42.16, - "shape": "rectangular", - "totalLiquidVolume": 22000, - "x": 32.12, - "xDimension": 8.33, - "y": 42.9, - "yDimension": 71.88, - "z": 2.29, - }, - "A4": Object { - "depth": 42.16, - "shape": "rectangular", - "totalLiquidVolume": 22000, - "x": 41.21, - "xDimension": 8.33, - "y": 42.9, - "yDimension": 71.88, - "z": 2.29, - }, - "A5": Object { - "depth": 42.16, - "shape": "rectangular", - "totalLiquidVolume": 22000, - "x": 50.3, - "xDimension": 8.33, - "y": 42.9, - "yDimension": 71.88, - "z": 2.29, - }, - "A6": Object { - "depth": 42.16, - "shape": "rectangular", - "totalLiquidVolume": 22000, - "x": 59.39, - "xDimension": 8.33, - "y": 42.9, - "yDimension": 71.88, - "z": 2.29, - }, - "A7": Object { - "depth": 42.16, - "shape": "rectangular", - "totalLiquidVolume": 22000, - "x": 68.48, - "xDimension": 8.33, - "y": 42.9, - "yDimension": 71.88, - "z": 2.29, - }, - "A8": Object { - "depth": 42.16, - "shape": "rectangular", - "totalLiquidVolume": 22000, - "x": 77.57, - "xDimension": 8.33, - "y": 42.9, - "yDimension": 71.88, - "z": 2.29, - }, - "A9": Object { - "depth": 42.16, - "shape": "rectangular", - "totalLiquidVolume": 22000, - "x": 86.66, - "xDimension": 8.33, - "y": 42.9, - "yDimension": 71.88, - "z": 2.29, - }, - }, - }, - "id": "troughId", - "labwareDefURI": "fixture/fixture_12_trough/1", - }, - }, - "moduleEntities": Object {}, - "pipetteEntities": Object { - "p100096Id": Object { - "id": "p100096Id", - "name": "p1000_96", - "spec": Object { - "channels": 96, - "defaultAspirateFlowRate": Object { - "max": 812, - "min": 3, - "value": 7.85, - }, - "defaultBlowOutFlowRate": Object { - "max": 812, - "min": 3, - "value": 80, - }, - "defaultDispenseFlowRate": Object { - "max": 812, - "min": 3, - "value": 7.85, - }, - "displayName": "Flex 96-Channel 1000 μL", - "maxVolume": 1000, - "minVolume": 5, - }, - "tiprackDefURI": "fixture/fixture_flex_96_tiprack_1000ul/1", - "tiprackLabwareDef": Object { - "brand": Object { - "brand": "Fixture", - "brandId": Array [], - }, - "cornerOffsetFromSlot": Object { - "x": 0, - "y": 0, - "z": 0, - }, - "dimensions": Object { - "xDimension": 127.75, - "yDimension": 85.75, - "zDimension": 99, - }, - "gripForce": 16, - "gripHeightFromLabwareBottom": 23.9, - "groups": Array [ - Object { - "metadata": Object {}, - "wells": Array [ - "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", - ], - }, - ], - "metadata": Object { - "displayCategory": "tipRack", - "displayName": "Fixture Flex Tiprack 1000 uL", - "displayVolumeUnits": "µL", - "tags": Array [], - }, - "namespace": "fixture", - "ordering": Array [ - Array [ - "A1", - "B1", - "C1", - "D1", - "E1", - "F1", - "G1", - "H1", - ], - Array [ - "A2", - "B2", - "C2", - "D2", - "E2", - "F2", - "G2", - "H2", - ], - Array [ - "A3", - "B3", - "C3", - "D3", - "E3", - "F3", - "G3", - "H3", - ], - Array [ - "A4", - "B4", - "C4", - "D4", - "E4", - "F4", - "G4", - "H4", - ], - Array [ - "A5", - "B5", - "C5", - "D5", - "E5", - "F5", - "G5", - "H5", - ], - Array [ - "A6", - "B6", - "C6", - "D6", - "E6", - "F6", - "G6", - "H6", - ], - Array [ - "A7", - "B7", - "C7", - "D7", - "E7", - "F7", - "G7", - "H7", - ], - Array [ - "A8", - "B8", - "C8", - "D8", - "E8", - "F8", - "G8", - "H8", - ], - Array [ - "A9", - "B9", - "C9", - "D9", - "E9", - "F9", - "G9", - "H9", - ], - Array [ - "A10", - "B10", - "C10", - "D10", - "E10", - "F10", - "G10", - "H10", - ], - Array [ - "A11", - "B11", - "C11", - "D11", - "E11", - "F11", - "G11", - "H11", - ], - Array [ - "A12", - "B12", - "C12", - "D12", - "E12", - "F12", - "G12", - "H12", - ], - ], - "parameters": Object { - "format": "96Standard", - "isMagneticModuleCompatible": false, - "isTiprack": true, - "loadName": "fixture_flex_96_tiprack_1000ul", - "quirks": Array [], - "tipLength": 95.6, - "tipOverlap": 10.5, - }, - "schemaVersion": 2, - "stackingOffsetWithLabware": Object { - "opentrons_flex_96_tiprack_adapter": Object { - "x": 0, - "y": 0, - "z": 121, - }, - }, - "version": 1, - "wells": Object { - "A1": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 14.38, - "y": 74.38, - "z": 1.5, - }, - "A10": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 95.38, - "y": 74.38, - "z": 1.5, - }, - "A11": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 104.38, - "y": 74.38, - "z": 1.5, - }, - "A12": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 113.38, - "y": 74.38, - "z": 1.5, - }, - "A2": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 23.38, - "y": 74.38, - "z": 1.5, - }, - "A3": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 32.38, - "y": 74.38, - "z": 1.5, - }, - "A4": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 41.38, - "y": 74.38, - "z": 1.5, - }, - "A5": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 50.38, - "y": 74.38, - "z": 1.5, - }, - "A6": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 59.38, - "y": 74.38, - "z": 1.5, - }, - "A7": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 68.38, - "y": 74.38, - "z": 1.5, - }, - "A8": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 77.38, - "y": 74.38, - "z": 1.5, - }, - "A9": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 86.38, - "y": 74.38, - "z": 1.5, - }, - "B1": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 14.38, - "y": 65.38, - "z": 1.5, - }, - "B10": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 95.38, - "y": 65.38, - "z": 1.5, - }, - "B11": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 104.38, - "y": 65.38, - "z": 1.5, - }, - "B12": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 113.38, - "y": 65.38, - "z": 1.5, - }, - "B2": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 23.38, - "y": 65.38, - "z": 1.5, - }, - "B3": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 32.38, - "y": 65.38, - "z": 1.5, - }, - "B4": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 41.38, - "y": 65.38, - "z": 1.5, - }, - "B5": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 50.38, - "y": 65.38, - "z": 1.5, - }, - "B6": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 59.38, - "y": 65.38, - "z": 1.5, - }, - "B7": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 68.38, - "y": 65.38, - "z": 1.5, - }, - "B8": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 77.38, - "y": 65.38, - "z": 1.5, - }, - "B9": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 86.38, - "y": 65.38, - "z": 1.5, - }, - "C1": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 14.38, - "y": 56.38, - "z": 1.5, - }, - "C10": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 95.38, - "y": 56.38, - "z": 1.5, - }, - "C11": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 104.38, - "y": 56.38, - "z": 1.5, - }, - "C12": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 113.38, - "y": 56.38, - "z": 1.5, - }, - "C2": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 23.38, - "y": 56.38, - "z": 1.5, - }, - "C3": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 32.38, - "y": 56.38, - "z": 1.5, - }, - "C4": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 41.38, - "y": 56.38, - "z": 1.5, - }, - "C5": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 50.38, - "y": 56.38, - "z": 1.5, - }, - "C6": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 59.38, - "y": 56.38, - "z": 1.5, - }, - "C7": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 68.38, - "y": 56.38, - "z": 1.5, - }, - "C8": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 77.38, - "y": 56.38, - "z": 1.5, - }, - "C9": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 86.38, - "y": 56.38, - "z": 1.5, - }, - "D1": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 14.38, - "y": 47.38, - "z": 1.5, - }, - "D10": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 95.38, - "y": 47.38, - "z": 1.5, - }, - "D11": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 104.38, - "y": 47.38, - "z": 1.5, - }, - "D12": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 113.38, - "y": 47.38, - "z": 1.5, - }, - "D2": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 23.38, - "y": 47.38, - "z": 1.5, - }, - "D3": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 32.38, - "y": 47.38, - "z": 1.5, - }, - "D4": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 41.38, - "y": 47.38, - "z": 1.5, - }, - "D5": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 50.38, - "y": 47.38, - "z": 1.5, - }, - "D6": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 59.38, - "y": 47.38, - "z": 1.5, - }, - "D7": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 68.38, - "y": 47.38, - "z": 1.5, - }, - "D8": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 77.38, - "y": 47.38, - "z": 1.5, - }, - "D9": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 86.38, - "y": 47.38, - "z": 1.5, - }, - "E1": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 14.38, - "y": 38.38, - "z": 1.5, - }, - "E10": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 95.38, - "y": 38.38, - "z": 1.5, - }, - "E11": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 104.38, - "y": 38.38, - "z": 1.5, - }, - "E12": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 113.38, - "y": 38.38, - "z": 1.5, - }, - "E2": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 23.38, - "y": 38.38, - "z": 1.5, - }, - "E3": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 32.38, - "y": 38.38, - "z": 1.5, - }, - "E4": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 41.38, - "y": 38.38, - "z": 1.5, - }, - "E5": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 50.38, - "y": 38.38, - "z": 1.5, - }, - "E6": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 59.38, - "y": 38.38, - "z": 1.5, - }, - "E7": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 68.38, - "y": 38.38, - "z": 1.5, - }, - "E8": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 77.38, - "y": 38.38, - "z": 1.5, - }, - "E9": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 86.38, - "y": 38.38, - "z": 1.5, - }, - "F1": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 14.38, - "y": 29.38, - "z": 1.5, - }, - "F10": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 95.38, - "y": 29.38, - "z": 1.5, - }, - "F11": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 104.38, - "y": 29.38, - "z": 1.5, - }, - "F12": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 113.38, - "y": 29.38, - "z": 1.5, - }, - "F2": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 23.38, - "y": 29.38, - "z": 1.5, - }, - "F3": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 32.38, - "y": 29.38, - "z": 1.5, - }, - "F4": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 41.38, - "y": 29.38, - "z": 1.5, - }, - "F5": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 50.38, - "y": 29.38, - "z": 1.5, - }, - "F6": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 59.38, - "y": 29.38, - "z": 1.5, - }, - "F7": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 68.38, - "y": 29.38, - "z": 1.5, - }, - "F8": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 77.38, - "y": 29.38, - "z": 1.5, - }, - "F9": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 86.38, - "y": 29.38, - "z": 1.5, - }, - "G1": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 14.38, - "y": 20.38, - "z": 1.5, - }, - "G10": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 95.38, - "y": 20.38, - "z": 1.5, - }, - "G11": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 104.38, - "y": 20.38, - "z": 1.5, - }, - "G12": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 113.38, - "y": 20.38, - "z": 1.5, - }, - "G2": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 23.38, - "y": 20.38, - "z": 1.5, - }, - "G3": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 32.38, - "y": 20.38, - "z": 1.5, - }, - "G4": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 41.38, - "y": 20.38, - "z": 1.5, - }, - "G5": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 50.38, - "y": 20.38, - "z": 1.5, - }, - "G6": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 59.38, - "y": 20.38, - "z": 1.5, - }, - "G7": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 68.38, - "y": 20.38, - "z": 1.5, - }, - "G8": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 77.38, - "y": 20.38, - "z": 1.5, - }, - "G9": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 86.38, - "y": 20.38, - "z": 1.5, - }, - "H1": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 14.38, - "y": 11.38, - "z": 1.5, - }, - "H10": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 95.38, - "y": 11.38, - "z": 1.5, - }, - "H11": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 104.38, - "y": 11.38, - "z": 1.5, - }, - "H12": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 113.38, - "y": 11.38, - "z": 1.5, - }, - "H2": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 23.38, - "y": 11.38, - "z": 1.5, - }, - "H3": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 32.38, - "y": 11.38, - "z": 1.5, - }, - "H4": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 41.38, - "y": 11.38, - "z": 1.5, - }, - "H5": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 50.38, - "y": 11.38, - "z": 1.5, - }, - "H6": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 59.38, - "y": 11.38, - "z": 1.5, - }, - "H7": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 68.38, - "y": 11.38, - "z": 1.5, - }, - "H8": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 77.38, - "y": 11.38, - "z": 1.5, - }, - "H9": Object { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 86.38, - "y": 11.38, - "z": 1.5, - }, - }, - }, - }, - "p10MultiId": Object { - "id": "p10MultiId", - "name": "p10_multi", - "spec": Object { - "channels": 8, - "defaultAspirateFlowRate": Object { - "max": 50, - "min": 0.001, - "value": 5, - }, - "defaultBlowOutFlowRate": Object { - "max": 1000, - "min": 5, - "value": 1000, - }, - "defaultDispenseFlowRate": Object { - "max": 50, - "min": 0.001, - "value": 10, - }, - "displayName": "P10 8-Channel", - "maxVolume": 10, - "minVolume": 1, - }, - "tiprackDefURI": "fixture/fixture_tiprack_10_ul/1", - "tiprackLabwareDef": Object { - "brand": Object { - "brand": "Opentrons", - }, - "cornerOffsetFromSlot": Object { - "x": 0, - "y": 0, - "z": 0, - }, - "dimensions": Object { - "xDimension": 127.75, - "yDimension": 85.5, - "zDimension": 52.25, - }, - "groups": Array [ - Object { - "metadata": Object {}, - "wells": Array [ - "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", - ], - }, - ], - "metadata": Object { - "displayCategory": "tipRack", - "displayName": "Opentrons GEB 10uL Tiprack", - "displayVolumeUnits": "µL", - "tags": Array [ - "GEB", - "tiprack", - "10uL", - "Opentrons", - ], - }, - "namespace": "fixture", - "ordering": Array [ - Array [ - "A1", - "B1", - "C1", - "D1", - "E1", - "F1", - "G1", - "H1", - ], - Array [ - "A2", - "B2", - "C2", - "D2", - "E2", - "F2", - "G2", - "H2", - ], - Array [ - "A3", - "B3", - "C3", - "D3", - "E3", - "F3", - "G3", - "H3", - ], - Array [ - "A4", - "B4", - "C4", - "D4", - "E4", - "F4", - "G4", - "H4", - ], - Array [ - "A5", - "B5", - "C5", - "D5", - "E5", - "F5", - "G5", - "H5", - ], - Array [ - "A6", - "B6", - "C6", - "D6", - "E6", - "F6", - "G6", - "H6", - ], - Array [ - "A7", - "B7", - "C7", - "D7", - "E7", - "F7", - "G7", - "H7", - ], - Array [ - "A8", - "B8", - "C8", - "D8", - "E8", - "F8", - "G8", - "H8", - ], - Array [ - "A9", - "B9", - "C9", - "D9", - "E9", - "F9", - "G9", - "H9", - ], - Array [ - "A10", - "B10", - "C10", - "D10", - "E10", - "F10", - "G10", - "H10", - ], - Array [ - "A11", - "B11", - "C11", - "D11", - "E11", - "F11", - "G11", - "H11", - ], - Array [ - "A12", - "B12", - "C12", - "D12", - "E12", - "F12", - "G12", - "H12", - ], - ], - "parameters": Object { - "format": "96Standard", - "isMagneticModuleCompatible": false, - "isTiprack": true, - "loadName": "fixture_tiprack_10_ul", - "tipLength": 39.2, - "tipOverlap": 6.2, - }, - "schemaVersion": 2, - "version": 1, - "wells": Object { - "A1": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 14.38, - "y": 74.25, - "z": 22.25, - }, - "A10": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 95.38, - "y": 74.25, - "z": 22.25, - }, - "A11": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 104.38, - "y": 74.25, - "z": 22.25, - }, - "A12": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 113.38, - "y": 74.25, - "z": 22.25, - }, - "A2": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 23.38, - "y": 74.25, - "z": 22.25, - }, - "A3": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 32.38, - "y": 74.25, - "z": 22.25, - }, - "A4": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 41.38, - "y": 74.25, - "z": 22.25, - }, - "A5": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 50.38, - "y": 74.25, - "z": 22.25, - }, - "A6": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 59.38, - "y": 74.25, - "z": 22.25, - }, - "A7": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 68.38, - "y": 74.25, - "z": 22.25, - }, - "A8": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 77.38, - "y": 74.25, - "z": 22.25, - }, - "A9": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 86.38, - "y": 74.25, - "z": 22.25, - }, - "B1": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 14.38, - "y": 65.25, - "z": 22.25, - }, - "B10": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 95.38, - "y": 65.25, - "z": 22.25, - }, - "B11": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 104.38, - "y": 65.25, - "z": 22.25, - }, - "B12": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 113.38, - "y": 65.25, - "z": 22.25, - }, - "B2": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 23.38, - "y": 65.25, - "z": 22.25, - }, - "B3": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 32.38, - "y": 65.25, - "z": 22.25, - }, - "B4": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 41.38, - "y": 65.25, - "z": 22.25, - }, - "B5": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 50.38, - "y": 65.25, - "z": 22.25, - }, - "B6": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 59.38, - "y": 65.25, - "z": 22.25, - }, - "B7": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 68.38, - "y": 65.25, - "z": 22.25, - }, - "B8": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 77.38, - "y": 65.25, - "z": 22.25, - }, - "B9": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 86.38, - "y": 65.25, - "z": 22.25, - }, - "C1": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 14.38, - "y": 56.25, - "z": 22.25, - }, - "C10": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 95.38, - "y": 56.25, - "z": 22.25, - }, - "C11": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 104.38, - "y": 56.25, - "z": 22.25, - }, - "C12": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 113.38, - "y": 56.25, - "z": 22.25, - }, - "C2": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 23.38, - "y": 56.25, - "z": 22.25, - }, - "C3": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 32.38, - "y": 56.25, - "z": 22.25, - }, - "C4": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 41.38, - "y": 56.25, - "z": 22.25, - }, - "C5": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 50.38, - "y": 56.25, - "z": 22.25, - }, - "C6": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 59.38, - "y": 56.25, - "z": 22.25, - }, - "C7": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 68.38, - "y": 56.25, - "z": 22.25, - }, - "C8": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 77.38, - "y": 56.25, - "z": 22.25, - }, - "C9": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 86.38, - "y": 56.25, - "z": 22.25, - }, - "D1": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 14.38, - "y": 47.25, - "z": 22.25, - }, - "D10": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 95.38, - "y": 47.25, - "z": 22.25, - }, - "D11": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 104.38, - "y": 47.25, - "z": 22.25, - }, - "D12": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 113.38, - "y": 47.25, - "z": 22.25, - }, - "D2": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 23.38, - "y": 47.25, - "z": 22.25, - }, - "D3": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 32.38, - "y": 47.25, - "z": 22.25, - }, - "D4": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 41.38, - "y": 47.25, - "z": 22.25, - }, - "D5": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 50.38, - "y": 47.25, - "z": 22.25, - }, - "D6": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 59.38, - "y": 47.25, - "z": 22.25, - }, - "D7": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 68.38, - "y": 47.25, - "z": 22.25, - }, - "D8": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 77.38, - "y": 47.25, - "z": 22.25, - }, - "D9": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 86.38, - "y": 47.25, - "z": 22.25, - }, - "E1": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 14.38, - "y": 38.25, - "z": 22.25, - }, - "E10": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 95.38, - "y": 38.25, - "z": 22.25, - }, - "E11": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 104.38, - "y": 38.25, - "z": 22.25, - }, - "E12": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 113.38, - "y": 38.25, - "z": 22.25, - }, - "E2": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 23.38, - "y": 38.25, - "z": 22.25, - }, - "E3": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 32.38, - "y": 38.25, - "z": 22.25, - }, - "E4": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 41.38, - "y": 38.25, - "z": 22.25, - }, - "E5": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 50.38, - "y": 38.25, - "z": 22.25, - }, - "E6": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 59.38, - "y": 38.25, - "z": 22.25, - }, - "E7": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 68.38, - "y": 38.25, - "z": 22.25, - }, - "E8": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 77.38, - "y": 38.25, - "z": 22.25, - }, - "E9": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 86.38, - "y": 38.25, - "z": 22.25, - }, - "F1": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 14.38, - "y": 29.25, - "z": 22.25, - }, - "F10": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 95.38, - "y": 29.25, - "z": 22.25, - }, - "F11": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 104.38, - "y": 29.25, - "z": 22.25, - }, - "F12": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 113.38, - "y": 29.25, - "z": 22.25, - }, - "F2": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 23.38, - "y": 29.25, - "z": 22.25, - }, - "F3": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 32.38, - "y": 29.25, - "z": 22.25, - }, - "F4": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 41.38, - "y": 29.25, - "z": 22.25, - }, - "F5": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 50.38, - "y": 29.25, - "z": 22.25, - }, - "F6": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 59.38, - "y": 29.25, - "z": 22.25, - }, - "F7": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 68.38, - "y": 29.25, - "z": 22.25, - }, - "F8": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 77.38, - "y": 29.25, - "z": 22.25, - }, - "F9": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 86.38, - "y": 29.25, - "z": 22.25, - }, - "G1": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 14.38, - "y": 20.25, - "z": 22.25, - }, - "G10": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 95.38, - "y": 20.25, - "z": 22.25, - }, - "G11": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 104.38, - "y": 20.25, - "z": 22.25, - }, - "G12": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 113.38, - "y": 20.25, - "z": 22.25, - }, - "G2": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 23.38, - "y": 20.25, - "z": 22.25, - }, - "G3": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 32.38, - "y": 20.25, - "z": 22.25, - }, - "G4": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 41.38, - "y": 20.25, - "z": 22.25, - }, - "G5": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 50.38, - "y": 20.25, - "z": 22.25, - }, - "G6": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 59.38, - "y": 20.25, - "z": 22.25, - }, - "G7": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 68.38, - "y": 20.25, - "z": 22.25, - }, - "G8": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 77.38, - "y": 20.25, - "z": 22.25, - }, - "G9": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 86.38, - "y": 20.25, - "z": 22.25, - }, - "H1": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 14.38, - "y": 11.25, - "z": 22.25, - }, - "H10": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 95.38, - "y": 11.25, - "z": 22.25, - }, - "H11": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 104.38, - "y": 11.25, - "z": 22.25, - }, - "H12": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 113.38, - "y": 11.25, - "z": 22.25, - }, - "H2": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 23.38, - "y": 11.25, - "z": 22.25, - }, - "H3": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 32.38, - "y": 11.25, - "z": 22.25, - }, - "H4": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 41.38, - "y": 11.25, - "z": 22.25, - }, - "H5": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 50.38, - "y": 11.25, - "z": 22.25, - }, - "H6": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 59.38, - "y": 11.25, - "z": 22.25, - }, - "H7": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 68.38, - "y": 11.25, - "z": 22.25, - }, - "H8": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 77.38, - "y": 11.25, - "z": 22.25, - }, - "H9": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 86.38, - "y": 11.25, - "z": 22.25, - }, - }, - }, - }, - "p10SingleId": Object { - "id": "p10SingleId", - "name": "p10_single", - "spec": Object { - "channels": 1, - "defaultAspirateFlowRate": Object { - "max": 50, - "min": 0.001, - "value": 5, - }, - "defaultBlowOutFlowRate": Object { - "max": 1000, - "min": 5, - "value": 1000, - }, - "defaultDispenseFlowRate": Object { - "max": 50, - "min": 0.001, - "value": 10, - }, - "displayName": "P10 Single-Channel", - "maxVolume": 10, - "minVolume": 1, - }, - "tiprackDefURI": "fixture/fixture_tiprack_10_ul/1", - "tiprackLabwareDef": Object { - "brand": Object { - "brand": "Opentrons", - }, - "cornerOffsetFromSlot": Object { - "x": 0, - "y": 0, - "z": 0, - }, - "dimensions": Object { - "xDimension": 127.75, - "yDimension": 85.5, - "zDimension": 52.25, - }, - "groups": Array [ - Object { - "metadata": Object {}, - "wells": Array [ - "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", - ], - }, - ], - "metadata": Object { - "displayCategory": "tipRack", - "displayName": "Opentrons GEB 10uL Tiprack", - "displayVolumeUnits": "µL", - "tags": Array [ - "GEB", - "tiprack", - "10uL", - "Opentrons", - ], - }, - "namespace": "fixture", - "ordering": Array [ - Array [ - "A1", - "B1", - "C1", - "D1", - "E1", - "F1", - "G1", - "H1", - ], - Array [ - "A2", - "B2", - "C2", - "D2", - "E2", - "F2", - "G2", - "H2", - ], - Array [ - "A3", - "B3", - "C3", - "D3", - "E3", - "F3", - "G3", - "H3", - ], - Array [ - "A4", - "B4", - "C4", - "D4", - "E4", - "F4", - "G4", - "H4", - ], - Array [ - "A5", - "B5", - "C5", - "D5", - "E5", - "F5", - "G5", - "H5", - ], - Array [ - "A6", - "B6", - "C6", - "D6", - "E6", - "F6", - "G6", - "H6", - ], - Array [ - "A7", - "B7", - "C7", - "D7", - "E7", - "F7", - "G7", - "H7", - ], - Array [ - "A8", - "B8", - "C8", - "D8", - "E8", - "F8", - "G8", - "H8", - ], - Array [ - "A9", - "B9", - "C9", - "D9", - "E9", - "F9", - "G9", - "H9", - ], - Array [ - "A10", - "B10", - "C10", - "D10", - "E10", - "F10", - "G10", - "H10", - ], - Array [ - "A11", - "B11", - "C11", - "D11", - "E11", - "F11", - "G11", - "H11", - ], - Array [ - "A12", - "B12", - "C12", - "D12", - "E12", - "F12", - "G12", - "H12", - ], - ], - "parameters": Object { - "format": "96Standard", - "isMagneticModuleCompatible": false, - "isTiprack": true, - "loadName": "fixture_tiprack_10_ul", - "tipLength": 39.2, - "tipOverlap": 6.2, - }, - "schemaVersion": 2, - "version": 1, - "wells": Object { - "A1": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 14.38, - "y": 74.25, - "z": 22.25, - }, - "A10": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 95.38, - "y": 74.25, - "z": 22.25, - }, - "A11": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 104.38, - "y": 74.25, - "z": 22.25, - }, - "A12": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 113.38, - "y": 74.25, - "z": 22.25, - }, - "A2": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 23.38, - "y": 74.25, - "z": 22.25, - }, - "A3": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 32.38, - "y": 74.25, - "z": 22.25, - }, - "A4": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 41.38, - "y": 74.25, - "z": 22.25, - }, - "A5": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 50.38, - "y": 74.25, - "z": 22.25, - }, - "A6": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 59.38, - "y": 74.25, - "z": 22.25, - }, - "A7": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 68.38, - "y": 74.25, - "z": 22.25, - }, - "A8": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 77.38, - "y": 74.25, - "z": 22.25, - }, - "A9": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 86.38, - "y": 74.25, - "z": 22.25, - }, - "B1": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 14.38, - "y": 65.25, - "z": 22.25, - }, - "B10": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 95.38, - "y": 65.25, - "z": 22.25, - }, - "B11": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 104.38, - "y": 65.25, - "z": 22.25, - }, - "B12": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 113.38, - "y": 65.25, - "z": 22.25, - }, - "B2": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 23.38, - "y": 65.25, - "z": 22.25, - }, - "B3": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 32.38, - "y": 65.25, - "z": 22.25, - }, - "B4": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 41.38, - "y": 65.25, - "z": 22.25, - }, - "B5": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 50.38, - "y": 65.25, - "z": 22.25, - }, - "B6": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 59.38, - "y": 65.25, - "z": 22.25, - }, - "B7": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 68.38, - "y": 65.25, - "z": 22.25, - }, - "B8": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 77.38, - "y": 65.25, - "z": 22.25, - }, - "B9": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 86.38, - "y": 65.25, - "z": 22.25, - }, - "C1": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 14.38, - "y": 56.25, - "z": 22.25, - }, - "C10": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 95.38, - "y": 56.25, - "z": 22.25, - }, - "C11": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 104.38, - "y": 56.25, - "z": 22.25, - }, - "C12": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 113.38, - "y": 56.25, - "z": 22.25, - }, - "C2": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 23.38, - "y": 56.25, - "z": 22.25, - }, - "C3": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 32.38, - "y": 56.25, - "z": 22.25, - }, - "C4": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 41.38, - "y": 56.25, - "z": 22.25, - }, - "C5": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 50.38, - "y": 56.25, - "z": 22.25, - }, - "C6": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 59.38, - "y": 56.25, - "z": 22.25, - }, - "C7": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 68.38, - "y": 56.25, - "z": 22.25, - }, - "C8": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 77.38, - "y": 56.25, - "z": 22.25, - }, - "C9": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 86.38, - "y": 56.25, - "z": 22.25, - }, - "D1": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 14.38, - "y": 47.25, - "z": 22.25, - }, - "D10": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 95.38, - "y": 47.25, - "z": 22.25, - }, - "D11": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 104.38, - "y": 47.25, - "z": 22.25, - }, - "D12": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 113.38, - "y": 47.25, - "z": 22.25, - }, - "D2": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 23.38, - "y": 47.25, - "z": 22.25, - }, - "D3": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 32.38, - "y": 47.25, - "z": 22.25, - }, - "D4": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 41.38, - "y": 47.25, - "z": 22.25, - }, - "D5": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 50.38, - "y": 47.25, - "z": 22.25, - }, - "D6": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 59.38, - "y": 47.25, - "z": 22.25, - }, - "D7": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 68.38, - "y": 47.25, - "z": 22.25, - }, - "D8": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 77.38, - "y": 47.25, - "z": 22.25, - }, - "D9": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 86.38, - "y": 47.25, - "z": 22.25, - }, - "E1": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 14.38, - "y": 38.25, - "z": 22.25, - }, - "E10": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 95.38, - "y": 38.25, - "z": 22.25, - }, - "E11": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 104.38, - "y": 38.25, - "z": 22.25, - }, - "E12": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 113.38, - "y": 38.25, - "z": 22.25, - }, - "E2": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 23.38, - "y": 38.25, - "z": 22.25, - }, - "E3": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 32.38, - "y": 38.25, - "z": 22.25, - }, - "E4": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 41.38, - "y": 38.25, - "z": 22.25, - }, - "E5": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 50.38, - "y": 38.25, - "z": 22.25, - }, - "E6": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 59.38, - "y": 38.25, - "z": 22.25, - }, - "E7": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 68.38, - "y": 38.25, - "z": 22.25, - }, - "E8": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 77.38, - "y": 38.25, - "z": 22.25, - }, - "E9": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 86.38, - "y": 38.25, - "z": 22.25, - }, - "F1": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 14.38, - "y": 29.25, - "z": 22.25, - }, - "F10": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 95.38, - "y": 29.25, - "z": 22.25, - }, - "F11": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 104.38, - "y": 29.25, - "z": 22.25, - }, - "F12": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 113.38, - "y": 29.25, - "z": 22.25, - }, - "F2": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 23.38, - "y": 29.25, - "z": 22.25, - }, - "F3": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 32.38, - "y": 29.25, - "z": 22.25, - }, - "F4": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 41.38, - "y": 29.25, - "z": 22.25, - }, - "F5": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 50.38, - "y": 29.25, - "z": 22.25, - }, - "F6": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 59.38, - "y": 29.25, - "z": 22.25, - }, - "F7": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 68.38, - "y": 29.25, - "z": 22.25, - }, - "F8": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 77.38, - "y": 29.25, - "z": 22.25, - }, - "F9": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 86.38, - "y": 29.25, - "z": 22.25, - }, - "G1": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 14.38, - "y": 20.25, - "z": 22.25, - }, - "G10": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 95.38, - "y": 20.25, - "z": 22.25, - }, - "G11": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 104.38, - "y": 20.25, - "z": 22.25, - }, - "G12": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 113.38, - "y": 20.25, - "z": 22.25, - }, - "G2": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 23.38, - "y": 20.25, - "z": 22.25, - }, - "G3": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 32.38, - "y": 20.25, - "z": 22.25, - }, - "G4": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 41.38, - "y": 20.25, - "z": 22.25, - }, - "G5": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 50.38, - "y": 20.25, - "z": 22.25, - }, - "G6": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 59.38, - "y": 20.25, - "z": 22.25, - }, - "G7": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 68.38, - "y": 20.25, - "z": 22.25, - }, - "G8": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 77.38, - "y": 20.25, - "z": 22.25, - }, - "G9": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 86.38, - "y": 20.25, - "z": 22.25, - }, - "H1": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 14.38, - "y": 11.25, - "z": 22.25, - }, - "H10": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 95.38, - "y": 11.25, - "z": 22.25, - }, - "H11": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 104.38, - "y": 11.25, - "z": 22.25, - }, - "H12": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 113.38, - "y": 11.25, - "z": 22.25, - }, - "H2": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 23.38, - "y": 11.25, - "z": 22.25, - }, - "H3": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 32.38, - "y": 11.25, - "z": 22.25, - }, - "H4": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 41.38, - "y": 11.25, - "z": 22.25, - }, - "H5": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 50.38, - "y": 11.25, - "z": 22.25, - }, - "H6": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 59.38, - "y": 11.25, - "z": 22.25, - }, - "H7": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 68.38, - "y": 11.25, - "z": 22.25, - }, - "H8": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 77.38, - "y": 11.25, - "z": 22.25, - }, - "H9": Object { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 86.38, - "y": 11.25, - "z": 22.25, - }, - }, - }, - }, - "p300MultiId": Object { - "id": "p300MultiId", - "name": "p300_multi", - "spec": Object { - "channels": 8, - "defaultAspirateFlowRate": Object { - "max": 600, - "min": 0.001, - "value": 150, - }, - "defaultBlowOutFlowRate": Object { - "max": 275, - "min": 1, - "value": 94, - }, - "defaultDispenseFlowRate": Object { - "max": 600, - "min": 0.001, - "value": 300, - }, - "displayName": "P300 8-Channel", - "maxVolume": 300, - "minVolume": 30, - }, - "tiprackDefURI": "fixture/fixture_tiprack_300_ul/1", - "tiprackLabwareDef": Object { - "brand": Object { - "brand": "Fixture Brand", - }, - "cornerOffsetFromSlot": Object { - "x": 0, - "y": 0, - "z": 0, - }, - "dimensions": Object { - "xDimension": 127.76, - "yDimension": 85.48, - "zDimension": 64.49, - }, - "groups": Array [ - Object { - "metadata": Object {}, - "wells": Array [ - "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", - ], - }, - ], - "metadata": Object { - "displayCategory": "tipRack", - "displayName": "300ul Tiprack FIXTURE", - "displayVolumeUnits": "µL", - "tags": Array [], - }, - "namespace": "fixture", - "ordering": Array [ - Array [ - "A1", - "B1", - "C1", - "D1", - "E1", - "F1", - "G1", - "H1", - ], - Array [ - "A2", - "B2", - "C2", - "D2", - "E2", - "F2", - "G2", - "H2", - ], - Array [ - "A3", - "B3", - "C3", - "D3", - "E3", - "F3", - "G3", - "H3", - ], - Array [ - "A4", - "B4", - "C4", - "D4", - "E4", - "F4", - "G4", - "H4", - ], - Array [ - "A5", - "B5", - "C5", - "D5", - "E5", - "F5", - "G5", - "H5", - ], - Array [ - "A6", - "B6", - "C6", - "D6", - "E6", - "F6", - "G6", - "H6", - ], - Array [ - "A7", - "B7", - "C7", - "D7", - "E7", - "F7", - "G7", - "H7", - ], - Array [ - "A8", - "B8", - "C8", - "D8", - "E8", - "F8", - "G8", - "H8", - ], - Array [ - "A9", - "B9", - "C9", - "D9", - "E9", - "F9", - "G9", - "H9", - ], - Array [ - "A10", - "B10", - "C10", - "D10", - "E10", - "F10", - "G10", - "H10", - ], - Array [ - "A11", - "B11", - "C11", - "D11", - "E11", - "F11", - "G11", - "H11", - ], - Array [ - "A12", - "B12", - "C12", - "D12", - "E12", - "F12", - "G12", - "H12", - ], - ], - "parameters": Object { - "format": "96Standard", - "isMagneticModuleCompatible": false, - "isTiprack": true, - "loadName": "fixture_tiprack_300_ul", - "tipLength": 59.3, - }, - "schemaVersion": 2, - "version": 1, - "wells": Object { - "A1": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 14.38, - "y": 74.24, - "z": 5.19, - }, - "A10": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 95.38, - "y": 74.24, - "z": 5.19, - }, - "A11": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 104.38, - "y": 74.24, - "z": 5.19, - }, - "A12": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 113.38, - "y": 74.24, - "z": 5.19, - }, - "A2": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 23.38, - "y": 74.24, - "z": 5.19, - }, - "A3": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 32.38, - "y": 74.24, - "z": 5.19, - }, - "A4": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 41.38, - "y": 74.24, - "z": 5.19, - }, - "A5": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 50.38, - "y": 74.24, - "z": 5.19, - }, - "A6": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 59.38, - "y": 74.24, - "z": 5.19, - }, - "A7": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 68.38, - "y": 74.24, - "z": 5.19, - }, - "A8": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 77.38, - "y": 74.24, - "z": 5.19, - }, - "A9": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 86.38, - "y": 74.24, - "z": 5.19, - }, - "B1": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 14.38, - "y": 65.24, - "z": 5.19, - }, - "B10": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 95.38, - "y": 65.24, - "z": 5.19, - }, - "B11": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 104.38, - "y": 65.24, - "z": 5.19, - }, - "B12": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 113.38, - "y": 65.24, - "z": 5.19, - }, - "B2": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 23.38, - "y": 65.24, - "z": 5.19, - }, - "B3": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 32.38, - "y": 65.24, - "z": 5.19, - }, - "B4": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 41.38, - "y": 65.24, - "z": 5.19, - }, - "B5": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 50.38, - "y": 65.24, - "z": 5.19, - }, - "B6": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 59.38, - "y": 65.24, - "z": 5.19, - }, - "B7": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 68.38, - "y": 65.24, - "z": 5.19, - }, - "B8": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 77.38, - "y": 65.24, - "z": 5.19, - }, - "B9": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 86.38, - "y": 65.24, - "z": 5.19, - }, - "C1": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 14.38, - "y": 56.24, - "z": 5.19, - }, - "C10": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 95.38, - "y": 56.24, - "z": 5.19, - }, - "C11": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 104.38, - "y": 56.24, - "z": 5.19, - }, - "C12": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 113.38, - "y": 56.24, - "z": 5.19, - }, - "C2": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 23.38, - "y": 56.24, - "z": 5.19, - }, - "C3": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 32.38, - "y": 56.24, - "z": 5.19, - }, - "C4": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 41.38, - "y": 56.24, - "z": 5.19, - }, - "C5": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 50.38, - "y": 56.24, - "z": 5.19, - }, - "C6": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 59.38, - "y": 56.24, - "z": 5.19, - }, - "C7": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 68.38, - "y": 56.24, - "z": 5.19, - }, - "C8": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 77.38, - "y": 56.24, - "z": 5.19, - }, - "C9": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 86.38, - "y": 56.24, - "z": 5.19, - }, - "D1": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 14.38, - "y": 47.24, - "z": 5.19, - }, - "D10": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 95.38, - "y": 47.24, - "z": 5.19, - }, - "D11": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 104.38, - "y": 47.24, - "z": 5.19, - }, - "D12": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 113.38, - "y": 47.24, - "z": 5.19, - }, - "D2": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 23.38, - "y": 47.24, - "z": 5.19, - }, - "D3": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 32.38, - "y": 47.24, - "z": 5.19, - }, - "D4": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 41.38, - "y": 47.24, - "z": 5.19, - }, - "D5": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 50.38, - "y": 47.24, - "z": 5.19, - }, - "D6": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 59.38, - "y": 47.24, - "z": 5.19, - }, - "D7": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 68.38, - "y": 47.24, - "z": 5.19, - }, - "D8": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 77.38, - "y": 47.24, - "z": 5.19, - }, - "D9": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 86.38, - "y": 47.24, - "z": 5.19, - }, - "E1": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 14.38, - "y": 38.24, - "z": 5.19, - }, - "E10": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 95.38, - "y": 38.24, - "z": 5.19, - }, - "E11": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 104.38, - "y": 38.24, - "z": 5.19, - }, - "E12": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 113.38, - "y": 38.24, - "z": 5.19, - }, - "E2": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 23.38, - "y": 38.24, - "z": 5.19, - }, - "E3": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 32.38, - "y": 38.24, - "z": 5.19, - }, - "E4": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 41.38, - "y": 38.24, - "z": 5.19, - }, - "E5": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 50.38, - "y": 38.24, - "z": 5.19, - }, - "E6": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 59.38, - "y": 38.24, - "z": 5.19, - }, - "E7": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 68.38, - "y": 38.24, - "z": 5.19, - }, - "E8": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 77.38, - "y": 38.24, - "z": 5.19, - }, - "E9": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 86.38, - "y": 38.24, - "z": 5.19, - }, - "F1": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 14.38, - "y": 29.24, - "z": 5.19, - }, - "F10": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 95.38, - "y": 29.24, - "z": 5.19, - }, - "F11": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 104.38, - "y": 29.24, - "z": 5.19, - }, - "F12": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 113.38, - "y": 29.24, - "z": 5.19, - }, - "F2": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 23.38, - "y": 29.24, - "z": 5.19, - }, - "F3": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 32.38, - "y": 29.24, - "z": 5.19, - }, - "F4": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 41.38, - "y": 29.24, - "z": 5.19, - }, - "F5": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 50.38, - "y": 29.24, - "z": 5.19, - }, - "F6": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 59.38, - "y": 29.24, - "z": 5.19, - }, - "F7": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 68.38, - "y": 29.24, - "z": 5.19, - }, - "F8": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 77.38, - "y": 29.24, - "z": 5.19, - }, - "F9": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 86.38, - "y": 29.24, - "z": 5.19, - }, - "G1": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 14.38, - "y": 20.24, - "z": 5.19, - }, - "G10": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 95.38, - "y": 20.24, - "z": 5.19, - }, - "G11": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 104.38, - "y": 20.24, - "z": 5.19, - }, - "G12": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 113.38, - "y": 20.24, - "z": 5.19, - }, - "G2": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 23.38, - "y": 20.24, - "z": 5.19, - }, - "G3": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 32.38, - "y": 20.24, - "z": 5.19, - }, - "G4": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 41.38, - "y": 20.24, - "z": 5.19, - }, - "G5": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 50.38, - "y": 20.24, - "z": 5.19, - }, - "G6": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 59.38, - "y": 20.24, - "z": 5.19, - }, - "G7": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 68.38, - "y": 20.24, - "z": 5.19, - }, - "G8": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 77.38, - "y": 20.24, - "z": 5.19, - }, - "G9": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 86.38, - "y": 20.24, - "z": 5.19, - }, - "H1": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 14.38, - "y": 11.24, - "z": 5.19, - }, - "H10": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 95.38, - "y": 11.24, - "z": 5.19, - }, - "H11": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 104.38, - "y": 11.24, - "z": 5.19, - }, - "H12": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 113.38, - "y": 11.24, - "z": 5.19, - }, - "H2": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 23.38, - "y": 11.24, - "z": 5.19, - }, - "H3": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 32.38, - "y": 11.24, - "z": 5.19, - }, - "H4": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 41.38, - "y": 11.24, - "z": 5.19, - }, - "H5": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 50.38, - "y": 11.24, - "z": 5.19, - }, - "H6": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 59.38, - "y": 11.24, - "z": 5.19, - }, - "H7": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 68.38, - "y": 11.24, - "z": 5.19, - }, - "H8": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 77.38, - "y": 11.24, - "z": 5.19, - }, - "H9": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 86.38, - "y": 11.24, - "z": 5.19, - }, - }, - }, - }, - "p300SingleId": Object { - "id": "p300SingleId", - "name": "p300_single", - "spec": Object { - "channels": 1, - "defaultAspirateFlowRate": Object { - "max": 600, - "min": 0.001, - "value": 150, - }, - "defaultBlowOutFlowRate": Object { - "max": 1000, - "min": 5, - "value": 1000, - }, - "defaultDispenseFlowRate": Object { - "max": 600, - "min": 0.001, - "value": 300, - }, - "displayName": "P300 Single-Channel", - "maxVolume": 300, - "minVolume": 30, - }, - "tiprackDefURI": "fixture/fixture_tiprack_300_ul/1", - "tiprackLabwareDef": Object { - "brand": Object { - "brand": "Fixture Brand", - }, - "cornerOffsetFromSlot": Object { - "x": 0, - "y": 0, - "z": 0, - }, - "dimensions": Object { - "xDimension": 127.76, - "yDimension": 85.48, - "zDimension": 64.49, - }, - "groups": Array [ - Object { - "metadata": Object {}, - "wells": Array [ - "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", - ], - }, - ], - "metadata": Object { - "displayCategory": "tipRack", - "displayName": "300ul Tiprack FIXTURE", - "displayVolumeUnits": "µL", - "tags": Array [], - }, - "namespace": "fixture", - "ordering": Array [ - Array [ - "A1", - "B1", - "C1", - "D1", - "E1", - "F1", - "G1", - "H1", - ], - Array [ - "A2", - "B2", - "C2", - "D2", - "E2", - "F2", - "G2", - "H2", - ], - Array [ - "A3", - "B3", - "C3", - "D3", - "E3", - "F3", - "G3", - "H3", - ], - Array [ - "A4", - "B4", - "C4", - "D4", - "E4", - "F4", - "G4", - "H4", - ], - Array [ - "A5", - "B5", - "C5", - "D5", - "E5", - "F5", - "G5", - "H5", - ], - Array [ - "A6", - "B6", - "C6", - "D6", - "E6", - "F6", - "G6", - "H6", - ], - Array [ - "A7", - "B7", - "C7", - "D7", - "E7", - "F7", - "G7", - "H7", - ], - Array [ - "A8", - "B8", - "C8", - "D8", - "E8", - "F8", - "G8", - "H8", - ], - Array [ - "A9", - "B9", - "C9", - "D9", - "E9", - "F9", - "G9", - "H9", - ], - Array [ - "A10", - "B10", - "C10", - "D10", - "E10", - "F10", - "G10", - "H10", - ], - Array [ - "A11", - "B11", - "C11", - "D11", - "E11", - "F11", - "G11", - "H11", - ], - Array [ - "A12", - "B12", - "C12", - "D12", - "E12", - "F12", - "G12", - "H12", - ], - ], - "parameters": Object { - "format": "96Standard", - "isMagneticModuleCompatible": false, - "isTiprack": true, - "loadName": "fixture_tiprack_300_ul", - "tipLength": 59.3, - }, - "schemaVersion": 2, - "version": 1, - "wells": Object { - "A1": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 14.38, - "y": 74.24, - "z": 5.19, - }, - "A10": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 95.38, - "y": 74.24, - "z": 5.19, - }, - "A11": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 104.38, - "y": 74.24, - "z": 5.19, - }, - "A12": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 113.38, - "y": 74.24, - "z": 5.19, - }, - "A2": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 23.38, - "y": 74.24, - "z": 5.19, - }, - "A3": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 32.38, - "y": 74.24, - "z": 5.19, - }, - "A4": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 41.38, - "y": 74.24, - "z": 5.19, - }, - "A5": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 50.38, - "y": 74.24, - "z": 5.19, - }, - "A6": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 59.38, - "y": 74.24, - "z": 5.19, - }, - "A7": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 68.38, - "y": 74.24, - "z": 5.19, - }, - "A8": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 77.38, - "y": 74.24, - "z": 5.19, - }, - "A9": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 86.38, - "y": 74.24, - "z": 5.19, - }, - "B1": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 14.38, - "y": 65.24, - "z": 5.19, - }, - "B10": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 95.38, - "y": 65.24, - "z": 5.19, - }, - "B11": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 104.38, - "y": 65.24, - "z": 5.19, - }, - "B12": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 113.38, - "y": 65.24, - "z": 5.19, - }, - "B2": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 23.38, - "y": 65.24, - "z": 5.19, - }, - "B3": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 32.38, - "y": 65.24, - "z": 5.19, - }, - "B4": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 41.38, - "y": 65.24, - "z": 5.19, - }, - "B5": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 50.38, - "y": 65.24, - "z": 5.19, - }, - "B6": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 59.38, - "y": 65.24, - "z": 5.19, - }, - "B7": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 68.38, - "y": 65.24, - "z": 5.19, - }, - "B8": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 77.38, - "y": 65.24, - "z": 5.19, - }, - "B9": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 86.38, - "y": 65.24, - "z": 5.19, - }, - "C1": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 14.38, - "y": 56.24, - "z": 5.19, - }, - "C10": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 95.38, - "y": 56.24, - "z": 5.19, - }, - "C11": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 104.38, - "y": 56.24, - "z": 5.19, - }, - "C12": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 113.38, - "y": 56.24, - "z": 5.19, - }, - "C2": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 23.38, - "y": 56.24, - "z": 5.19, - }, - "C3": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 32.38, - "y": 56.24, - "z": 5.19, - }, - "C4": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 41.38, - "y": 56.24, - "z": 5.19, - }, - "C5": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 50.38, - "y": 56.24, - "z": 5.19, - }, - "C6": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 59.38, - "y": 56.24, - "z": 5.19, - }, - "C7": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 68.38, - "y": 56.24, - "z": 5.19, - }, - "C8": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 77.38, - "y": 56.24, - "z": 5.19, - }, - "C9": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 86.38, - "y": 56.24, - "z": 5.19, - }, - "D1": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 14.38, - "y": 47.24, - "z": 5.19, - }, - "D10": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 95.38, - "y": 47.24, - "z": 5.19, - }, - "D11": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 104.38, - "y": 47.24, - "z": 5.19, - }, - "D12": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 113.38, - "y": 47.24, - "z": 5.19, - }, - "D2": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 23.38, - "y": 47.24, - "z": 5.19, - }, - "D3": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 32.38, - "y": 47.24, - "z": 5.19, - }, - "D4": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 41.38, - "y": 47.24, - "z": 5.19, - }, - "D5": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 50.38, - "y": 47.24, - "z": 5.19, - }, - "D6": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 59.38, - "y": 47.24, - "z": 5.19, - }, - "D7": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 68.38, - "y": 47.24, - "z": 5.19, - }, - "D8": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 77.38, - "y": 47.24, - "z": 5.19, - }, - "D9": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 86.38, - "y": 47.24, - "z": 5.19, - }, - "E1": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 14.38, - "y": 38.24, - "z": 5.19, - }, - "E10": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 95.38, - "y": 38.24, - "z": 5.19, - }, - "E11": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 104.38, - "y": 38.24, - "z": 5.19, - }, - "E12": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 113.38, - "y": 38.24, - "z": 5.19, - }, - "E2": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 23.38, - "y": 38.24, - "z": 5.19, - }, - "E3": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 32.38, - "y": 38.24, - "z": 5.19, - }, - "E4": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 41.38, - "y": 38.24, - "z": 5.19, - }, - "E5": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 50.38, - "y": 38.24, - "z": 5.19, - }, - "E6": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 59.38, - "y": 38.24, - "z": 5.19, - }, - "E7": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 68.38, - "y": 38.24, - "z": 5.19, - }, - "E8": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 77.38, - "y": 38.24, - "z": 5.19, - }, - "E9": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 86.38, - "y": 38.24, - "z": 5.19, - }, - "F1": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 14.38, - "y": 29.24, - "z": 5.19, - }, - "F10": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 95.38, - "y": 29.24, - "z": 5.19, - }, - "F11": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 104.38, - "y": 29.24, - "z": 5.19, - }, - "F12": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 113.38, - "y": 29.24, - "z": 5.19, - }, - "F2": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 23.38, - "y": 29.24, - "z": 5.19, - }, - "F3": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 32.38, - "y": 29.24, - "z": 5.19, - }, - "F4": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 41.38, - "y": 29.24, - "z": 5.19, - }, - "F5": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 50.38, - "y": 29.24, - "z": 5.19, - }, - "F6": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 59.38, - "y": 29.24, - "z": 5.19, - }, - "F7": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 68.38, - "y": 29.24, - "z": 5.19, - }, - "F8": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 77.38, - "y": 29.24, - "z": 5.19, - }, - "F9": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 86.38, - "y": 29.24, - "z": 5.19, - }, - "G1": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 14.38, - "y": 20.24, - "z": 5.19, - }, - "G10": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 95.38, - "y": 20.24, - "z": 5.19, - }, - "G11": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 104.38, - "y": 20.24, - "z": 5.19, - }, - "G12": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 113.38, - "y": 20.24, - "z": 5.19, - }, - "G2": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 23.38, - "y": 20.24, - "z": 5.19, - }, - "G3": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 32.38, - "y": 20.24, - "z": 5.19, - }, - "G4": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 41.38, - "y": 20.24, - "z": 5.19, - }, - "G5": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 50.38, - "y": 20.24, - "z": 5.19, - }, - "G6": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 59.38, - "y": 20.24, - "z": 5.19, - }, - "G7": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 68.38, - "y": 20.24, - "z": 5.19, - }, - "G8": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 77.38, - "y": 20.24, - "z": 5.19, - }, - "G9": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 86.38, - "y": 20.24, - "z": 5.19, - }, - "H1": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 14.38, - "y": 11.24, - "z": 5.19, - }, - "H10": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 95.38, - "y": 11.24, - "z": 5.19, - }, - "H11": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 104.38, - "y": 11.24, - "z": 5.19, - }, - "H12": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 113.38, - "y": 11.24, - "z": 5.19, - }, - "H2": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 23.38, - "y": 11.24, - "z": 5.19, - }, - "H3": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 32.38, - "y": 11.24, - "z": 5.19, - }, - "H4": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 41.38, - "y": 11.24, - "z": 5.19, - }, - "H5": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 50.38, - "y": 11.24, - "z": 5.19, - }, - "H6": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 59.38, - "y": 11.24, - "z": 5.19, - }, - "H7": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 68.38, - "y": 11.24, - "z": 5.19, - }, - "H8": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 77.38, - "y": 11.24, - "z": 5.19, - }, - "H9": Object { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 86.38, - "y": 11.24, - "z": 5.19, - }, - }, - }, - }, - }, -} -`; - -exports[`snapshot tests makeState 1`] = ` -Object { - "labware": Object { - "sourcePlateId": Object { - "slot": "4", - }, - "tiprack1Id": Object { - "slot": "1", - }, - "tiprack2Id": Object { - "slot": "2", - }, - "tiprack4AdapterId": Object { - "slot": "7", - }, - "tiprack4Id": Object { - "slot": "tiprack4AdapterId", - }, - "tiprack5AdapterId": Object { - "slot": "8", - }, - "tiprack5Id": Object { - "slot": "tiprack5AdapterId", - }, - }, - "liquidState": Object { - "additionalEquipment": Object { - "fixedTrash": Object {}, - }, - "labware": Object { - "destPlateId": Object { - "A1": Object {}, - "A10": Object {}, - "A11": Object {}, - "A12": Object {}, - "A2": Object {}, - "A3": Object {}, - "A4": Object {}, - "A5": Object {}, - "A6": Object {}, - "A7": Object {}, - "A8": Object {}, - "A9": Object {}, - "B1": Object {}, - "B10": Object {}, - "B11": Object {}, - "B12": Object {}, - "B2": Object {}, - "B3": Object {}, - "B4": Object {}, - "B5": Object {}, - "B6": Object {}, - "B7": Object {}, - "B8": Object {}, - "B9": Object {}, - "C1": Object {}, - "C10": Object {}, - "C11": Object {}, - "C12": Object {}, - "C2": Object {}, - "C3": Object {}, - "C4": Object {}, - "C5": Object {}, - "C6": Object {}, - "C7": Object {}, - "C8": Object {}, - "C9": Object {}, - "D1": Object {}, - "D10": Object {}, - "D11": Object {}, - "D12": Object {}, - "D2": Object {}, - "D3": Object {}, - "D4": Object {}, - "D5": Object {}, - "D6": Object {}, - "D7": Object {}, - "D8": Object {}, - "D9": Object {}, - "E1": Object {}, - "E10": Object {}, - "E11": Object {}, - "E12": Object {}, - "E2": Object {}, - "E3": Object {}, - "E4": Object {}, - "E5": Object {}, - "E6": Object {}, - "E7": Object {}, - "E8": Object {}, - "E9": Object {}, - "F1": Object {}, - "F10": Object {}, - "F11": Object {}, - "F12": Object {}, - "F2": Object {}, - "F3": Object {}, - "F4": Object {}, - "F5": Object {}, - "F6": Object {}, - "F7": Object {}, - "F8": Object {}, - "F9": Object {}, - "G1": Object {}, - "G10": Object {}, - "G11": Object {}, - "G12": Object {}, - "G2": Object {}, - "G3": Object {}, - "G4": Object {}, - "G5": Object {}, - "G6": Object {}, - "G7": Object {}, - "G8": Object {}, - "G9": Object {}, - "H1": Object {}, - "H10": Object {}, - "H11": Object {}, - "H12": Object {}, - "H2": Object {}, - "H3": Object {}, - "H4": Object {}, - "H5": Object {}, - "H6": Object {}, - "H7": Object {}, - "H8": Object {}, - "H9": Object {}, - }, - "sourcePlateId": Object { - "A1": Object {}, - "A10": Object {}, - "A11": Object {}, - "A12": Object {}, - "A2": Object {}, - "A3": Object {}, - "A4": Object {}, - "A5": Object {}, - "A6": Object {}, - "A7": Object {}, - "A8": Object {}, - "A9": Object {}, - "B1": Object {}, - "B10": Object {}, - "B11": Object {}, - "B12": Object {}, - "B2": Object {}, - "B3": Object {}, - "B4": Object {}, - "B5": Object {}, - "B6": Object {}, - "B7": Object {}, - "B8": Object {}, - "B9": Object {}, - "C1": Object {}, - "C10": Object {}, - "C11": Object {}, - "C12": Object {}, - "C2": Object {}, - "C3": Object {}, - "C4": Object {}, - "C5": Object {}, - "C6": Object {}, - "C7": Object {}, - "C8": Object {}, - "C9": Object {}, - "D1": Object {}, - "D10": Object {}, - "D11": Object {}, - "D12": Object {}, - "D2": Object {}, - "D3": Object {}, - "D4": Object {}, - "D5": Object {}, - "D6": Object {}, - "D7": Object {}, - "D8": Object {}, - "D9": Object {}, - "E1": Object {}, - "E10": Object {}, - "E11": Object {}, - "E12": Object {}, - "E2": Object {}, - "E3": Object {}, - "E4": Object {}, - "E5": Object {}, - "E6": Object {}, - "E7": Object {}, - "E8": Object {}, - "E9": Object {}, - "F1": Object {}, - "F10": Object {}, - "F11": Object {}, - "F12": Object {}, - "F2": Object {}, - "F3": Object {}, - "F4": Object {}, - "F5": Object {}, - "F6": Object {}, - "F7": Object {}, - "F8": Object {}, - "F9": Object {}, - "G1": Object {}, - "G10": Object {}, - "G11": Object {}, - "G12": Object {}, - "G2": Object {}, - "G3": Object {}, - "G4": Object {}, - "G5": Object {}, - "G6": Object {}, - "G7": Object {}, - "G8": Object {}, - "G9": Object {}, - "H1": Object {}, - "H10": Object {}, - "H11": Object {}, - "H12": Object {}, - "H2": Object {}, - "H3": Object {}, - "H4": Object {}, - "H5": Object {}, - "H6": Object {}, - "H7": Object {}, - "H8": Object {}, - "H9": Object {}, - }, - "tiprack1Id": Object { - "A1": Object {}, - "A10": Object {}, - "A11": Object {}, - "A12": Object {}, - "A2": Object {}, - "A3": Object {}, - "A4": Object {}, - "A5": Object {}, - "A6": Object {}, - "A7": Object {}, - "A8": Object {}, - "A9": Object {}, - "B1": Object {}, - "B10": Object {}, - "B11": Object {}, - "B12": Object {}, - "B2": Object {}, - "B3": Object {}, - "B4": Object {}, - "B5": Object {}, - "B6": Object {}, - "B7": Object {}, - "B8": Object {}, - "B9": Object {}, - "C1": Object {}, - "C10": Object {}, - "C11": Object {}, - "C12": Object {}, - "C2": Object {}, - "C3": Object {}, - "C4": Object {}, - "C5": Object {}, - "C6": Object {}, - "C7": Object {}, - "C8": Object {}, - "C9": Object {}, - "D1": Object {}, - "D10": Object {}, - "D11": Object {}, - "D12": Object {}, - "D2": Object {}, - "D3": Object {}, - "D4": Object {}, - "D5": Object {}, - "D6": Object {}, - "D7": Object {}, - "D8": Object {}, - "D9": Object {}, - "E1": Object {}, - "E10": Object {}, - "E11": Object {}, - "E12": Object {}, - "E2": Object {}, - "E3": Object {}, - "E4": Object {}, - "E5": Object {}, - "E6": Object {}, - "E7": Object {}, - "E8": Object {}, - "E9": Object {}, - "F1": Object {}, - "F10": Object {}, - "F11": Object {}, - "F12": Object {}, - "F2": Object {}, - "F3": Object {}, - "F4": Object {}, - "F5": Object {}, - "F6": Object {}, - "F7": Object {}, - "F8": Object {}, - "F9": Object {}, - "G1": Object {}, - "G10": Object {}, - "G11": Object {}, - "G12": Object {}, - "G2": Object {}, - "G3": Object {}, - "G4": Object {}, - "G5": Object {}, - "G6": Object {}, - "G7": Object {}, - "G8": Object {}, - "G9": Object {}, - "H1": Object {}, - "H10": Object {}, - "H11": Object {}, - "H12": Object {}, - "H2": Object {}, - "H3": Object {}, - "H4": Object {}, - "H5": Object {}, - "H6": Object {}, - "H7": Object {}, - "H8": Object {}, - "H9": Object {}, - }, - "tiprack2Id": Object { - "A1": Object {}, - "A10": Object {}, - "A11": Object {}, - "A12": Object {}, - "A2": Object {}, - "A3": Object {}, - "A4": Object {}, - "A5": Object {}, - "A6": Object {}, - "A7": Object {}, - "A8": Object {}, - "A9": Object {}, - "B1": Object {}, - "B10": Object {}, - "B11": Object {}, - "B12": Object {}, - "B2": Object {}, - "B3": Object {}, - "B4": Object {}, - "B5": Object {}, - "B6": Object {}, - "B7": Object {}, - "B8": Object {}, - "B9": Object {}, - "C1": Object {}, - "C10": Object {}, - "C11": Object {}, - "C12": Object {}, - "C2": Object {}, - "C3": Object {}, - "C4": Object {}, - "C5": Object {}, - "C6": Object {}, - "C7": Object {}, - "C8": Object {}, - "C9": Object {}, - "D1": Object {}, - "D10": Object {}, - "D11": Object {}, - "D12": Object {}, - "D2": Object {}, - "D3": Object {}, - "D4": Object {}, - "D5": Object {}, - "D6": Object {}, - "D7": Object {}, - "D8": Object {}, - "D9": Object {}, - "E1": Object {}, - "E10": Object {}, - "E11": Object {}, - "E12": Object {}, - "E2": Object {}, - "E3": Object {}, - "E4": Object {}, - "E5": Object {}, - "E6": Object {}, - "E7": Object {}, - "E8": Object {}, - "E9": Object {}, - "F1": Object {}, - "F10": Object {}, - "F11": Object {}, - "F12": Object {}, - "F2": Object {}, - "F3": Object {}, - "F4": Object {}, - "F5": Object {}, - "F6": Object {}, - "F7": Object {}, - "F8": Object {}, - "F9": Object {}, - "G1": Object {}, - "G10": Object {}, - "G11": Object {}, - "G12": Object {}, - "G2": Object {}, - "G3": Object {}, - "G4": Object {}, - "G5": Object {}, - "G6": Object {}, - "G7": Object {}, - "G8": Object {}, - "G9": Object {}, - "H1": Object {}, - "H10": Object {}, - "H11": Object {}, - "H12": Object {}, - "H2": Object {}, - "H3": Object {}, - "H4": Object {}, - "H5": Object {}, - "H6": Object {}, - "H7": Object {}, - "H8": Object {}, - "H9": Object {}, - }, - "tiprack3Id": Object { - "A1": Object {}, - "A10": Object {}, - "A11": Object {}, - "A12": Object {}, - "A2": Object {}, - "A3": Object {}, - "A4": Object {}, - "A5": Object {}, - "A6": Object {}, - "A7": Object {}, - "A8": Object {}, - "A9": Object {}, - "B1": Object {}, - "B10": Object {}, - "B11": Object {}, - "B12": Object {}, - "B2": Object {}, - "B3": Object {}, - "B4": Object {}, - "B5": Object {}, - "B6": Object {}, - "B7": Object {}, - "B8": Object {}, - "B9": Object {}, - "C1": Object {}, - "C10": Object {}, - "C11": Object {}, - "C12": Object {}, - "C2": Object {}, - "C3": Object {}, - "C4": Object {}, - "C5": Object {}, - "C6": Object {}, - "C7": Object {}, - "C8": Object {}, - "C9": Object {}, - "D1": Object {}, - "D10": Object {}, - "D11": Object {}, - "D12": Object {}, - "D2": Object {}, - "D3": Object {}, - "D4": Object {}, - "D5": Object {}, - "D6": Object {}, - "D7": Object {}, - "D8": Object {}, - "D9": Object {}, - "E1": Object {}, - "E10": Object {}, - "E11": Object {}, - "E12": Object {}, - "E2": Object {}, - "E3": Object {}, - "E4": Object {}, - "E5": Object {}, - "E6": Object {}, - "E7": Object {}, - "E8": Object {}, - "E9": Object {}, - "F1": Object {}, - "F10": Object {}, - "F11": Object {}, - "F12": Object {}, - "F2": Object {}, - "F3": Object {}, - "F4": Object {}, - "F5": Object {}, - "F6": Object {}, - "F7": Object {}, - "F8": Object {}, - "F9": Object {}, - "G1": Object {}, - "G10": Object {}, - "G11": Object {}, - "G12": Object {}, - "G2": Object {}, - "G3": Object {}, - "G4": Object {}, - "G5": Object {}, - "G6": Object {}, - "G7": Object {}, - "G8": Object {}, - "G9": Object {}, - "H1": Object {}, - "H10": Object {}, - "H11": Object {}, - "H12": Object {}, - "H2": Object {}, - "H3": Object {}, - "H4": Object {}, - "H5": Object {}, - "H6": Object {}, - "H7": Object {}, - "H8": Object {}, - "H9": Object {}, - }, - "tiprack4AdapterId": Object {}, - "tiprack4Id": Object { - "A1": Object {}, - "A10": Object {}, - "A11": Object {}, - "A12": Object {}, - "A2": Object {}, - "A3": Object {}, - "A4": Object {}, - "A5": Object {}, - "A6": Object {}, - "A7": Object {}, - "A8": Object {}, - "A9": Object {}, - "B1": Object {}, - "B10": Object {}, - "B11": Object {}, - "B12": Object {}, - "B2": Object {}, - "B3": Object {}, - "B4": Object {}, - "B5": Object {}, - "B6": Object {}, - "B7": Object {}, - "B8": Object {}, - "B9": Object {}, - "C1": Object {}, - "C10": Object {}, - "C11": Object {}, - "C12": Object {}, - "C2": Object {}, - "C3": Object {}, - "C4": Object {}, - "C5": Object {}, - "C6": Object {}, - "C7": Object {}, - "C8": Object {}, - "C9": Object {}, - "D1": Object {}, - "D10": Object {}, - "D11": Object {}, - "D12": Object {}, - "D2": Object {}, - "D3": Object {}, - "D4": Object {}, - "D5": Object {}, - "D6": Object {}, - "D7": Object {}, - "D8": Object {}, - "D9": Object {}, - "E1": Object {}, - "E10": Object {}, - "E11": Object {}, - "E12": Object {}, - "E2": Object {}, - "E3": Object {}, - "E4": Object {}, - "E5": Object {}, - "E6": Object {}, - "E7": Object {}, - "E8": Object {}, - "E9": Object {}, - "F1": Object {}, - "F10": Object {}, - "F11": Object {}, - "F12": Object {}, - "F2": Object {}, - "F3": Object {}, - "F4": Object {}, - "F5": Object {}, - "F6": Object {}, - "F7": Object {}, - "F8": Object {}, - "F9": Object {}, - "G1": Object {}, - "G10": Object {}, - "G11": Object {}, - "G12": Object {}, - "G2": Object {}, - "G3": Object {}, - "G4": Object {}, - "G5": Object {}, - "G6": Object {}, - "G7": Object {}, - "G8": Object {}, - "G9": Object {}, - "H1": Object {}, - "H10": Object {}, - "H11": Object {}, - "H12": Object {}, - "H2": Object {}, - "H3": Object {}, - "H4": Object {}, - "H5": Object {}, - "H6": Object {}, - "H7": Object {}, - "H8": Object {}, - "H9": Object {}, + "G5": {}, + "G6": {}, + "G7": {}, + "G8": {}, + "G9": {}, + "H1": {}, + "H10": {}, + "H11": {}, + "H12": {}, + "H2": {}, + "H3": {}, + "H4": {}, + "H5": {}, + "H6": {}, + "H7": {}, + "H8": {}, + "H9": {}, }, - "tiprack5AdapterId": Object {}, - "tiprack5Id": Object { - "A1": Object {}, - "A10": Object {}, - "A11": Object {}, - "A12": Object {}, - "A2": Object {}, - "A3": Object {}, - "A4": Object {}, - "A5": Object {}, - "A6": Object {}, - "A7": Object {}, - "A8": Object {}, - "A9": Object {}, - "B1": Object {}, - "B10": Object {}, - "B11": Object {}, - "B12": Object {}, - "B2": Object {}, - "B3": Object {}, - "B4": Object {}, - "B5": Object {}, - "B6": Object {}, - "B7": Object {}, - "B8": Object {}, - "B9": Object {}, - "C1": Object {}, - "C10": Object {}, - "C11": Object {}, - "C12": Object {}, - "C2": Object {}, - "C3": Object {}, - "C4": Object {}, - "C5": Object {}, - "C6": Object {}, - "C7": Object {}, - "C8": Object {}, - "C9": Object {}, - "D1": Object {}, - "D10": Object {}, - "D11": Object {}, - "D12": Object {}, - "D2": Object {}, - "D3": Object {}, - "D4": Object {}, - "D5": Object {}, - "D6": Object {}, - "D7": Object {}, - "D8": Object {}, - "D9": Object {}, - "E1": Object {}, - "E10": Object {}, - "E11": Object {}, - "E12": Object {}, - "E2": Object {}, - "E3": Object {}, - "E4": Object {}, - "E5": Object {}, - "E6": Object {}, - "E7": Object {}, - "E8": Object {}, - "E9": Object {}, - "F1": Object {}, - "F10": Object {}, - "F11": Object {}, - "F12": Object {}, - "F2": Object {}, - "F3": Object {}, - "F4": Object {}, - "F5": Object {}, - "F6": Object {}, - "F7": Object {}, - "F8": Object {}, - "F9": Object {}, - "G1": Object {}, - "G10": Object {}, - "G11": Object {}, - "G12": Object {}, - "G2": Object {}, - "G3": Object {}, - "G4": Object {}, - "G5": Object {}, - "G6": Object {}, - "G7": Object {}, - "G8": Object {}, - "G9": Object {}, - "H1": Object {}, - "H10": Object {}, - "H11": Object {}, - "H12": Object {}, - "H2": Object {}, - "H3": Object {}, - "H4": Object {}, - "H5": Object {}, - "H6": Object {}, - "H7": Object {}, - "H8": Object {}, - "H9": Object {}, + "tiprack5AdapterId": {}, + "tiprack5Id": { + "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": {}, }, - "troughId": Object { - "A1": Object {}, - "A10": Object {}, - "A11": Object {}, - "A12": Object {}, - "A2": Object {}, - "A3": Object {}, - "A4": Object {}, - "A5": Object {}, - "A6": Object {}, - "A7": Object {}, - "A8": Object {}, - "A9": Object {}, + "troughId": { + "A1": {}, + "A10": {}, + "A11": {}, + "A12": {}, + "A2": {}, + "A3": {}, + "A4": {}, + "A5": {}, + "A6": {}, + "A7": {}, + "A8": {}, + "A9": {}, }, }, - "pipettes": Object { - "p100096Id": Object { - "0": Object {}, - "1": Object {}, - "10": Object {}, - "11": Object {}, - "12": Object {}, - "13": Object {}, - "14": Object {}, - "15": Object {}, - "16": Object {}, - "17": Object {}, - "18": Object {}, - "19": Object {}, - "2": Object {}, - "20": Object {}, - "21": Object {}, - "22": Object {}, - "23": Object {}, - "24": Object {}, - "25": Object {}, - "26": Object {}, - "27": Object {}, - "28": Object {}, - "29": Object {}, - "3": Object {}, - "30": Object {}, - "31": Object {}, - "32": Object {}, - "33": Object {}, - "34": Object {}, - "35": Object {}, - "36": Object {}, - "37": Object {}, - "38": Object {}, - "39": Object {}, - "4": Object {}, - "40": Object {}, - "41": Object {}, - "42": Object {}, - "43": Object {}, - "44": Object {}, - "45": Object {}, - "46": Object {}, - "47": Object {}, - "48": Object {}, - "49": Object {}, - "5": Object {}, - "50": Object {}, - "51": Object {}, - "52": Object {}, - "53": Object {}, - "54": Object {}, - "55": Object {}, - "56": Object {}, - "57": Object {}, - "58": Object {}, - "59": Object {}, - "6": Object {}, - "60": Object {}, - "61": Object {}, - "62": Object {}, - "63": Object {}, - "64": Object {}, - "65": Object {}, - "66": Object {}, - "67": Object {}, - "68": Object {}, - "69": Object {}, - "7": Object {}, - "70": Object {}, - "71": Object {}, - "72": Object {}, - "73": Object {}, - "74": Object {}, - "75": Object {}, - "76": Object {}, - "77": Object {}, - "78": Object {}, - "79": Object {}, - "8": Object {}, - "80": Object {}, - "81": Object {}, - "82": Object {}, - "83": Object {}, - "84": Object {}, - "85": Object {}, - "86": Object {}, - "87": Object {}, - "88": Object {}, - "89": Object {}, - "9": Object {}, - "90": Object {}, - "91": Object {}, - "92": Object {}, - "93": Object {}, - "94": Object {}, - "95": Object {}, + "pipettes": { + "p100096Id": { + "0": {}, + "1": {}, + "10": {}, + "11": {}, + "12": {}, + "13": {}, + "14": {}, + "15": {}, + "16": {}, + "17": {}, + "18": {}, + "19": {}, + "2": {}, + "20": {}, + "21": {}, + "22": {}, + "23": {}, + "24": {}, + "25": {}, + "26": {}, + "27": {}, + "28": {}, + "29": {}, + "3": {}, + "30": {}, + "31": {}, + "32": {}, + "33": {}, + "34": {}, + "35": {}, + "36": {}, + "37": {}, + "38": {}, + "39": {}, + "4": {}, + "40": {}, + "41": {}, + "42": {}, + "43": {}, + "44": {}, + "45": {}, + "46": {}, + "47": {}, + "48": {}, + "49": {}, + "5": {}, + "50": {}, + "51": {}, + "52": {}, + "53": {}, + "54": {}, + "55": {}, + "56": {}, + "57": {}, + "58": {}, + "59": {}, + "6": {}, + "60": {}, + "61": {}, + "62": {}, + "63": {}, + "64": {}, + "65": {}, + "66": {}, + "67": {}, + "68": {}, + "69": {}, + "7": {}, + "70": {}, + "71": {}, + "72": {}, + "73": {}, + "74": {}, + "75": {}, + "76": {}, + "77": {}, + "78": {}, + "79": {}, + "8": {}, + "80": {}, + "81": {}, + "82": {}, + "83": {}, + "84": {}, + "85": {}, + "86": {}, + "87": {}, + "88": {}, + "89": {}, + "9": {}, + "90": {}, + "91": {}, + "92": {}, + "93": {}, + "94": {}, + "95": {}, }, - "p10MultiId": Object { - "0": Object {}, - "1": Object {}, - "2": Object {}, - "3": Object {}, - "4": Object {}, - "5": Object {}, - "6": Object {}, - "7": Object {}, + "p10MultiId": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {}, + "6": {}, + "7": {}, }, - "p10SingleId": Object { - "0": Object {}, + "p10SingleId": { + "0": {}, }, - "p300MultiId": Object { - "0": Object {}, - "1": Object {}, - "2": Object {}, - "3": Object {}, - "4": Object {}, - "5": Object {}, - "6": Object {}, - "7": Object {}, + "p300MultiId": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {}, + "6": {}, + "7": {}, }, - "p300SingleId": Object { - "0": Object {}, + "p300SingleId": { + "0": {}, }, }, }, - "modules": Object {}, - "pipettes": Object { - "p300SingleId": Object { + "modules": {}, + "pipettes": { + "p300SingleId": { "mount": "left", }, }, - "tipState": Object { - "pipettes": Object { + "tipState": { + "pipettes": { "p300SingleId": false, }, - "tipracks": Object { - "tiprack1Id": Object { + "tipracks": { + "tiprack1Id": { "A1": true, "A10": true, "A11": true, @@ -31755,7 +18366,7 @@ Object { "H8": true, "H9": true, }, - "tiprack2Id": Object { + "tiprack2Id": { "A1": false, "A10": false, "A11": false, diff --git a/step-generation/src/__tests__/aspirate.test.ts b/step-generation/src/__tests__/aspirate.test.ts index f2c0a1949083..36b296eb517e 100644 --- a/step-generation/src/__tests__/aspirate.test.ts +++ b/step-generation/src/__tests__/aspirate.test.ts @@ -4,7 +4,7 @@ import { expectTimelineError } from '../__utils__/testMatchers' import { aspirate } from '../commandCreators/atomic/aspirate' import { getLabwareDefURI, - getPipetteNameSpecs, + getPipetteSpecsV2, fixtureTiprack10ul as tip10, fixtureTiprack1000ul as tip1000, } from '@opentrons/shared-data' @@ -35,7 +35,7 @@ import type { InvariantContext, RobotState } from '../' const fixtureTiprack10ul = tip10 as LabwareDefinition2 const fixtureTiprack1000ul = tip1000 as LabwareDefinition2 const FLEX_PIPETTE = 'p1000_single_flex' -const FlexPipetteNameSpecs = getPipetteNameSpecs(FLEX_PIPETTE) +const FlexPipetteNameSpecs = getPipetteSpecsV2(FLEX_PIPETTE) vi.mock('../utils/thermocyclerPipetteCollision') vi.mock('../utils/heaterShakerCollision') diff --git a/step-generation/src/__tests__/dispense.test.ts b/step-generation/src/__tests__/dispense.test.ts index 0b2d41d284f7..18e51c9b7a79 100644 --- a/step-generation/src/__tests__/dispense.test.ts +++ b/step-generation/src/__tests__/dispense.test.ts @@ -1,6 +1,6 @@ import { when } from 'vitest-when' import { beforeEach, describe, it, expect, vi, afterEach } from 'vitest' -import { getPipetteNameSpecs } from '@opentrons/shared-data' +import { getPipetteSpecsV2 } from '@opentrons/shared-data' import { thermocyclerPipetteCollision, pipetteIntoHeaterShakerLatchOpen, @@ -31,7 +31,7 @@ vi.mock('../utils/thermocyclerPipetteCollision') vi.mock('../utils/heaterShakerCollision') const FLEX_PIPETTE = 'p1000_single_flex' -const FlexPipetteNameSpecs = getPipetteNameSpecs(FLEX_PIPETTE) +const FlexPipetteNameSpecs = getPipetteSpecsV2(FLEX_PIPETTE) describe('dispense', () => { let initialRobotState: RobotState diff --git a/step-generation/src/__tests__/heaterShakerOpenLatch.test.ts b/step-generation/src/__tests__/heaterShakerOpenLatch.test.ts index 3fff02edb88b..441a19e8057a 100644 --- a/step-generation/src/__tests__/heaterShakerOpenLatch.test.ts +++ b/step-generation/src/__tests__/heaterShakerOpenLatch.test.ts @@ -2,7 +2,7 @@ import { when } from 'vitest-when' import { beforeEach, describe, it, expect, afterEach, vi } from 'vitest' import { getLabwareDefURI, - getPipetteNameSpecs, + getPipetteSpecsV2, fixtureTiprack1000ul as _fixtureTiprack1000ul, } from '@opentrons/shared-data' import { heaterShakerOpenLatch } from '../commandCreators/atomic/heaterShakerOpenLatch' @@ -20,7 +20,7 @@ vi.mock('../utils/heaterShakerCollision') const fixtureTiprack1000ul = _fixtureTiprack1000ul as LabwareDefinition2 const FLEX_PIPETTE = 'p1000_single_flex' -const FlexPipetteNameSpecs = getPipetteNameSpecs(FLEX_PIPETTE) +const FlexPipetteNameSpecs = getPipetteSpecsV2(FLEX_PIPETTE) describe('heaterShakerOpenLatch', () => { const HEATER_SHAKER_ID = 'heaterShakerId' diff --git a/step-generation/src/__tests__/moveToWell.test.ts b/step-generation/src/__tests__/moveToWell.test.ts index 595b6d08801a..ba97b783fb03 100644 --- a/step-generation/src/__tests__/moveToWell.test.ts +++ b/step-generation/src/__tests__/moveToWell.test.ts @@ -1,6 +1,6 @@ import { when } from 'vitest-when' import { beforeEach, describe, it, expect, afterEach, vi } from 'vitest' -import { getPipetteNameSpecs } from '@opentrons/shared-data' +import { getPipetteSpecsV2 } from '@opentrons/shared-data' import { expectTimelineError } from '../__utils__/testMatchers' import { moveToWell } from '../commandCreators/atomic/moveToWell' import { @@ -27,7 +27,7 @@ vi.mock('../utils/thermocyclerPipetteCollision') vi.mock('../utils/heaterShakerCollision') const FLEX_PIPETTE = 'p1000_single_flex' -const FlexPipetteNameSpecs = getPipetteNameSpecs(FLEX_PIPETTE) +const FlexPipetteNameSpecs = getPipetteSpecsV2(FLEX_PIPETTE) describe('moveToWell', () => { let robotStateWithTip: RobotState diff --git a/step-generation/src/__tests__/utils.test.ts b/step-generation/src/__tests__/utils.test.ts index 49fa7a20cfda..e4eb35c6a471 100644 --- a/step-generation/src/__tests__/utils.test.ts +++ b/step-generation/src/__tests__/utils.test.ts @@ -9,14 +9,12 @@ import { getIsLabwareAboveHeight, MAX_LABWARE_HEIGHT_EAST_WEST_HEATER_SHAKER_MM, HEATERSHAKER_MODULE_TYPE, - PipetteNameSpecs, fixtureTrash as _fixtureTrash, fixture96Plate as _fixture96Plate, fixtureTiprack10ul as _fixtureTiprack10ul, fixtureTiprack300ul as _fixtureTiprack300ul, - fixtureP10Single, - fixtureP300Multi, - pipetteNameSpecFixtures, + fixtureP10SingleV2Specs, + fixtureP300MultiV2Specs, } from '@opentrons/shared-data' import { FIXED_TRASH_ID, TEMPERATURE_DEACTIVATED } from '../constants' import { @@ -275,14 +273,14 @@ describe('makeInitialRobotState', () => { p10SingleId: { id: 'p10SingleId', name: 'p10_single', - spec: fixtureP10Single, + spec: fixtureP10SingleV2Specs, tiprackDefURI: getLabwareDefURI(fixtureTiprack10ul), tiprackLabwareDef: fixtureTiprack10ul, }, p300MultiId: { id: 'p300MultiId', name: 'p300_multi', - spec: fixtureP300Multi, + spec: fixtureP300MultiV2Specs, tiprackDefURI: getLabwareDefURI(fixtureTiprack300ul), tiprackLabwareDef: fixtureTiprack300ul, }, @@ -878,7 +876,7 @@ describe('getIsHeaterShakerEastWestWithLatchOpen', () => { describe('getIsHeaterShakerEastWestMultiChannelPipette', () => { let slot: string let modules: RobotState['modules'] - let pipetteSpecs: PipetteNameSpecs + let pipetteSpecs: SharedData.PipetteV2Specs beforeEach(() => { slot = '2' modules = { @@ -892,7 +890,7 @@ describe('getIsHeaterShakerEastWestMultiChannelPipette', () => { }, }, } - pipetteSpecs = pipetteNameSpecFixtures.p10_multi as PipetteNameSpecs + pipetteSpecs = SharedData.fixtureP10MultiV2Specs }) it('should return true when there is a heater shaker east west and the pipette is a multi channel', () => { expect( @@ -900,13 +898,13 @@ describe('getIsHeaterShakerEastWestMultiChannelPipette', () => { ).toBe(true) }) it('should return false when there the pipette is not a multi channel', () => { - pipetteSpecs = pipetteNameSpecFixtures.p1000_single as PipetteNameSpecs + pipetteSpecs = SharedData.fixtureP1000SingleV2Specs expect( getIsHeaterShakerEastWestMultiChannelPipette(modules, slot, pipetteSpecs) ).toBe(false) }) it('should return false when the HS is not next to the slot', () => { - pipetteSpecs = pipetteNameSpecFixtures.p1000_single as PipetteNameSpecs + pipetteSpecs = SharedData.fixtureP1000SingleV2Specs slot = '11' expect( getIsHeaterShakerEastWestMultiChannelPipette(modules, slot, pipetteSpecs) @@ -916,7 +914,7 @@ describe('getIsHeaterShakerEastWestMultiChannelPipette', () => { describe('getIsHeaterShakerNorthSouthOfNonTiprackWithMultiChannelPipette', () => { let slot: string let modules: RobotState['modules'] - let pipetteSpecs: PipetteNameSpecs + let pipetteSpecs: SharedData.PipetteV2Specs let labwareEntity: LabwareEntity beforeEach(() => { slot = '4' @@ -931,7 +929,7 @@ describe('getIsHeaterShakerNorthSouthOfNonTiprackWithMultiChannelPipette', () => }, }, } - pipetteSpecs = pipetteNameSpecFixtures.p10_multi as PipetteNameSpecs + pipetteSpecs = SharedData.fixtureP10MultiV2Specs labwareEntity = { id: 'fixture96PlateId', labwareDefURI: getLabwareDefURI(fixture96Plate), diff --git a/step-generation/src/commandCreators/atomic/aspirate.ts b/step-generation/src/commandCreators/atomic/aspirate.ts index efc734275f9e..6a468e0b4fa2 100644 --- a/step-generation/src/commandCreators/atomic/aspirate.ts +++ b/step-generation/src/commandCreators/atomic/aspirate.ts @@ -154,12 +154,16 @@ export const aspirate: CommandCreator = ( ) } } - if (errors.length === 0 && pipetteSpec && pipetteSpec.maxVolume < volume) { + if ( + errors.length === 0 && + pipetteSpec && + pipetteSpec.liquids.default.maxVolume < volume + ) { errors.push( errorCreators.pipetteVolumeExceeded({ actionName, volume, - maxVolume: pipetteSpec.maxVolume, + maxVolume: pipetteSpec.liquids.default.maxVolume, }) ) } diff --git a/step-generation/src/commandCreators/compound/transfer.ts b/step-generation/src/commandCreators/compound/transfer.ts index 76c8067d04d2..9bf327574082 100644 --- a/step-generation/src/commandCreators/compound/transfer.ts +++ b/step-generation/src/commandCreators/compound/transfer.ts @@ -208,7 +208,11 @@ export const transfer: CommandCreator = ( const effectiveTransferVol = getPipetteWithTipMaxVol(args.pipette, invariantContext) - aspirateAirGapVolume - const pipetteMinVol = pipetteSpec.minVolume + const liquidMinVolumes = Object.values(pipetteSpec.liquids).map( + liquid => liquid.minVolume + ) + // account for minVolume for lowVolume pipettes + const pipetteMinVol = Math.min(...liquidMinVolumes) const chunksPerSubTransfer = Math.ceil(args.volume / effectiveTransferVol) const lastSubTransferVol = args.volume - (chunksPerSubTransfer - 1) * effectiveTransferVol diff --git a/step-generation/src/fixtures/robotStateFixtures.ts b/step-generation/src/fixtures/robotStateFixtures.ts index 14651279de1f..8f65913f3e87 100644 --- a/step-generation/src/fixtures/robotStateFixtures.ts +++ b/step-generation/src/fixtures/robotStateFixtures.ts @@ -4,17 +4,17 @@ import { getLabwareDefURI, TEMPERATURE_MODULE_TYPE, THERMOCYCLER_MODULE_TYPE, - fixtureP10Single as _fixtureP10Single, - fixtureP10Multi as _fixtureP10Multi, - fixtureP300Single as _fixtureP300Single, - fixtureP300Multi as _fixtureP300Multi, - fixtureP100096 as _fixtureP100096, fixture96Plate as _fixture96Plate, fixture12Trough as _fixture12Trough, fixtureTiprack10ul as _fixtureTiprack10ul, fixtureTiprack300ul as _fixtureTiprack300ul, fixtureTiprack1000ul as _fixtureTiprack1000ul, fixtureTiprackAdapter as _fixtureTiprackAdapter, + fixtureP10SingleV2Specs, + fixtureP10MultiV2Specs, + fixtureP300SingleV2Specs, + fixtureP300MultiV2Specs, + fixtureP100096V2Specs, } from '@opentrons/shared-data' import { @@ -44,12 +44,6 @@ import type { RobotStateAndWarnings, } from '../' -const fixtureP10Single = _fixtureP10Single -const fixtureP10Multi = _fixtureP10Multi -const fixtureP300Single = _fixtureP300Single -const fixtureP300Multi = _fixtureP300Multi -const fixtureP100096 = _fixtureP100096 - const fixture96Plate = _fixture96Plate as LabwareDefinition2 const fixture12Trough = _fixture12Trough as LabwareDefinition2 const fixtureTiprack10ul = _fixtureTiprack10ul as LabwareDefinition2 @@ -157,7 +151,7 @@ export function makeContext(): InvariantContext { tiprackDefURI: getLabwareDefURI(fixtureTiprack10ul), tiprackLabwareDef: fixtureTiprack10ul, - spec: fixtureP10Single, + spec: fixtureP10SingleV2Specs, }, p10MultiId: { name: 'p10_multi', @@ -165,7 +159,7 @@ export function makeContext(): InvariantContext { tiprackDefURI: getLabwareDefURI(fixtureTiprack10ul), tiprackLabwareDef: fixtureTiprack10ul, - spec: fixtureP10Multi, + spec: fixtureP10MultiV2Specs, }, [DEFAULT_PIPETTE]: { name: 'p300_single', @@ -173,7 +167,7 @@ export function makeContext(): InvariantContext { tiprackDefURI: getLabwareDefURI(fixtureTiprack300ul), tiprackLabwareDef: fixtureTiprack300ul, - spec: fixtureP300Single, + spec: fixtureP300SingleV2Specs, }, [MULTI_PIPETTE]: { name: 'p300_multi', @@ -181,7 +175,7 @@ export function makeContext(): InvariantContext { tiprackDefURI: getLabwareDefURI(fixtureTiprack300ul), tiprackLabwareDef: fixtureTiprack300ul, - spec: fixtureP300Multi, + spec: fixtureP300MultiV2Specs, }, [PIPETTE_96]: { name: 'p1000_96', @@ -189,7 +183,7 @@ export function makeContext(): InvariantContext { tiprackDefURI: getLabwareDefURI(fixtureTiprack1000ul), tiprackLabwareDef: fixtureTiprack1000ul, - spec: fixtureP100096, + spec: fixtureP100096V2Specs, }, } return { diff --git a/step-generation/src/robotStateSelectors.ts b/step-generation/src/robotStateSelectors.ts index 0fcf26e66753..397d527ed70a 100644 --- a/step-generation/src/robotStateSelectors.ts +++ b/step-generation/src/robotStateSelectors.ts @@ -186,7 +186,7 @@ export function getPipetteWithTipMaxVol( // NOTE: this fn assumes each pipette is assigned to exactly one tiprack type, // across the entire timeline const pipetteEntity = invariantContext.pipetteEntities[pipetteId] - const pipetteMaxVol = pipetteEntity.spec.maxVolume + const pipetteMaxVol = pipetteEntity.spec.liquids.default.maxVolume const tiprackDef = pipetteEntity.tiprackLabwareDef const tiprackTipVol = getTiprackVolume(tiprackDef) diff --git a/step-generation/src/types.ts b/step-generation/src/types.ts index d9639c2e8e77..34d1d01a215b 100644 --- a/step-generation/src/types.ts +++ b/step-generation/src/types.ts @@ -10,11 +10,11 @@ import type { LabwareDefinition2, ModuleType, ModuleModel, - PipetteNameSpecs, PipetteName, NozzleConfigurationStyle, LabwareLocation, PipetteMount as Mount, + PipetteV2Specs, } from '@opentrons/shared-data' import type { AtomicProfileStep, @@ -132,7 +132,7 @@ export type NormalizedPipette = NormalizedPipetteById[keyof NormalizedPipetteByI // =========== PIPETTES ======== export type PipetteEntity = NormalizedPipette & { tiprackLabwareDef: LabwareDefinition2 - spec: PipetteNameSpecs + spec: PipetteV2Specs } export interface PipetteEntities { diff --git a/step-generation/src/utils/heaterShakerCollision.ts b/step-generation/src/utils/heaterShakerCollision.ts index cdd03c48b063..ac329a5dad3f 100644 --- a/step-generation/src/utils/heaterShakerCollision.ts +++ b/step-generation/src/utils/heaterShakerCollision.ts @@ -8,7 +8,7 @@ import { MAX_LABWARE_HEIGHT_EAST_WEST_HEATER_SHAKER_MM, } from '@opentrons/shared-data' -import type { PipetteNameSpecs } from '@opentrons/shared-data' +import type { PipetteV2Specs } from '@opentrons/shared-data' import type { LabwareEntities, @@ -32,7 +32,7 @@ export const getIsHeaterShakerEastWestWithLatchOpen = ( export const getIsHeaterShakerEastWestMultiChannelPipette = ( hwModules: RobotState['modules'], slot: DeckSlot, - pipetteSpecs: PipetteNameSpecs + pipetteSpecs: PipetteV2Specs ): boolean => pipetteSpecs.channels !== 1 && some( @@ -45,7 +45,7 @@ export const getIsHeaterShakerEastWestMultiChannelPipette = ( export const getIsHeaterShakerNorthSouthOfNonTiprackWithMultiChannelPipette = ( hwModules: RobotState['modules'], slot: DeckSlot, - pipetteSpecs: PipetteNameSpecs, + pipetteSpecs: PipetteV2Specs, labwareEntity: LabwareEntity ): boolean => pipetteSpecs.channels !== 1 && From 1b28bab0da38417390da00b438b2012ccd655c2d Mon Sep 17 00:00:00 2001 From: Jethary Rader <66035149+jerader@users.noreply.github.com> Date: Tue, 26 Mar 2024 14:54:28 -0400 Subject: [PATCH 8/8] refactor(app, components): parametersTable moved to Components dir for PL (#14734) closes AUTH-240 --- .../ProtocolRunRunTimeParameters.tsx | 6 +- .../ProtocolRunRuntimeParameters.test.tsx | 12 +- .../__tests__/ProtocolParameters.test.tsx | 6 +- .../ProtocolParameters/index.tsx | 111 +----------- .../ViewOnlyParameters.tsx | 2 +- .../ProtocolSetupParameters/index.tsx | 2 +- app/src/pages/ProtocolDetails/Parameters.tsx | 2 +- .../ParametersTable/NoParameters.tsx | 29 ++-- .../ParametersTable.stories.tsx | 159 ++++++++++++++++++ .../__tests__/NoParameters.test.tsx | 30 ++-- .../__tests__/ParametersTable.test.tsx | 119 +++++++++++++ .../src/molecules/ParametersTable/index.tsx | 117 +++++++++++++ components/src/molecules/index.tsx | 2 + .../formatRunTimeParameterValue.test.ts | 13 +- .../js/helpers/formatRunTimeParameterValue.ts | 11 +- shared-data/js/helpers/index.ts | 1 + 16 files changed, 457 insertions(+), 165 deletions(-) rename app/src/organisms/ProtocolDetails/ProtocolParameters/NoParameter.tsx => components/src/molecules/ParametersTable/NoParameters.tsx (52%) create mode 100644 components/src/molecules/ParametersTable/ParametersTable.stories.tsx rename app/src/organisms/ProtocolDetails/ProtocolParameters/__tests__/NoParameter.test.tsx => components/src/molecules/ParametersTable/__tests__/NoParameters.test.tsx (55%) create mode 100644 components/src/molecules/ParametersTable/__tests__/ParametersTable.test.tsx create mode 100644 components/src/molecules/ParametersTable/index.tsx rename app/src/organisms/ProtocolDetails/ProtocolParameters/__tests__/utils.test.ts => shared-data/js/helpers/__tests__/formatRunTimeParameterValue.test.ts (88%) rename app/src/organisms/ProtocolDetails/ProtocolParameters/utils.ts => shared-data/js/helpers/formatRunTimeParameterValue.ts (79%) diff --git a/app/src/organisms/Devices/ProtocolRun/ProtocolRunRunTimeParameters.tsx b/app/src/organisms/Devices/ProtocolRun/ProtocolRunRunTimeParameters.tsx index 7a6b07f9ae5e..0b3ccb5c141a 100644 --- a/app/src/organisms/Devices/ProtocolRun/ProtocolRunRunTimeParameters.tsx +++ b/app/src/organisms/Devices/ProtocolRun/ProtocolRunRunTimeParameters.tsx @@ -2,6 +2,7 @@ import * as React from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' +import { formatRunTimeParameterValue } from '@opentrons/shared-data' import { ALIGN_CENTER, BORDERS, @@ -12,14 +13,13 @@ import { SPACING, StyledText, TYPOGRAPHY, + NoParameters, } from '@opentrons/components' import { Banner } from '../../../atoms/Banner' import { Divider } from '../../../atoms/structure' // import { Chip } from '../../../atoms/Chip' -import { NoParameter } from '../../ProtocolDetails/ProtocolParameters/NoParameter' import { useMostRecentCompletedAnalysis } from '../../LabwarePositionCheck/useMostRecentCompletedAnalysis' -import { formatRunTimeParameterValue } from '../../ProtocolDetails/ProtocolParameters/utils' import type { RunTimeParameter } from '@opentrons/shared-data' @@ -221,7 +221,7 @@ export function ProtocolRunRuntimeParameters({ {!hasParameter ? ( - + ) : ( <> diff --git a/app/src/organisms/Devices/ProtocolRun/__tests__/ProtocolRunRuntimeParameters.test.tsx b/app/src/organisms/Devices/ProtocolRun/__tests__/ProtocolRunRuntimeParameters.test.tsx index 368c666d33f8..8844f551d08b 100644 --- a/app/src/organisms/Devices/ProtocolRun/__tests__/ProtocolRunRuntimeParameters.test.tsx +++ b/app/src/organisms/Devices/ProtocolRun/__tests__/ProtocolRunRuntimeParameters.test.tsx @@ -3,9 +3,9 @@ import { describe, it, vi, beforeEach, afterEach, expect } from 'vitest' import { screen } from '@testing-library/react' import { when } from 'vitest-when' +import { NoParameters } from '@opentrons/components' import { renderWithProviders } from '../../../../__testing-utils__' import { i18n } from '../../../../i18n' -import { NoParameter } from '../../../ProtocolDetails/ProtocolParameters/NoParameter' import { useMostRecentCompletedAnalysis } from '../../../LabwarePositionCheck/useMostRecentCompletedAnalysis' import { ProtocolRunRuntimeParameters } from '../ProtocolRunRunTimeParameters' @@ -15,7 +15,13 @@ import type { RunTimeParameter, } from '@opentrons/shared-data' -vi.mock('../../../ProtocolDetails/ProtocolParameters/NoParameter') +vi.mock('@opentrons/components', async importOriginal => { + const actual = await importOriginal() + return { + ...actual, + NoParameters: vi.fn(), + } +}) vi.mock('../../../LabwarePositionCheck/useMostRecentCompletedAnalysis') const RUN_ID = 'mockId' @@ -88,7 +94,7 @@ describe('ProtocolRunRuntimeParameters', () => { props = { runId: RUN_ID, } - vi.mocked(NoParameter).mockReturnValue(
mock NoParameter
) + vi.mocked(NoParameters).mockReturnValue(
mock NoParameter
) when(vi.mocked(useMostRecentCompletedAnalysis)) .calledWith(RUN_ID) .thenReturn({ diff --git a/app/src/organisms/ProtocolDetails/ProtocolParameters/__tests__/ProtocolParameters.test.tsx b/app/src/organisms/ProtocolDetails/ProtocolParameters/__tests__/ProtocolParameters.test.tsx index 5e3574200b65..707aa5256cfb 100644 --- a/app/src/organisms/ProtocolDetails/ProtocolParameters/__tests__/ProtocolParameters.test.tsx +++ b/app/src/organisms/ProtocolDetails/ProtocolParameters/__tests__/ProtocolParameters.test.tsx @@ -4,13 +4,10 @@ import { screen } from '@testing-library/react' import { renderWithProviders } from '../../../../__testing-utils__' import { i18n } from '../../../../i18n' -import { NoParameter } from '../NoParameter' import { ProtocolParameters } from '..' import type { RunTimeParameter } from '@opentrons/shared-data' -vi.mock('../NoParameter') - const mockRunTimeParameter: RunTimeParameter[] = [ { displayName: 'Trash Tips', @@ -87,7 +84,6 @@ describe('ProtocolParameters', () => { props = { runTimeParameters: mockRunTimeParameter, } - vi.mocked(NoParameter).mockReturnValue(
mock NoParameter
) }) afterEach(() => { @@ -131,6 +127,6 @@ describe('ProtocolParameters', () => { runTimeParameters: [], } render(props) - screen.getByText('mock NoParameter') + screen.getByText('No parameters specified in this protocol') }) }) diff --git a/app/src/organisms/ProtocolDetails/ProtocolParameters/index.tsx b/app/src/organisms/ProtocolDetails/ProtocolParameters/index.tsx index 00dc73793d49..d7a64fd2396e 100644 --- a/app/src/organisms/ProtocolDetails/ProtocolParameters/index.tsx +++ b/app/src/organisms/ProtocolDetails/ProtocolParameters/index.tsx @@ -1,18 +1,16 @@ import * as React from 'react' import { useTranslation } from 'react-i18next' -import styled from 'styled-components' import { - BORDERS, DIRECTION_COLUMN, Flex, SPACING, StyledText, TYPOGRAPHY, + ParametersTable, + NoParameters, } from '@opentrons/components' import { Banner } from '../../../atoms/Banner' -import { NoParameter } from './NoParameter' -import { formatRunTimeParameterValue } from './utils' import type { RunTimeParameter } from '@opentrons/shared-data' @@ -47,112 +45,11 @@ export function ProtocolParameters({ - + ) : ( - + )} ) } - -interface ProtocolParameterItemsProps { - runTimeParameters: RunTimeParameter[] -} - -function ProtocolParameterItems({ - runTimeParameters, -}: ProtocolParameterItemsProps): JSX.Element { - const { t } = useTranslation('protocol_details') - const formatRange = ( - runTimeParameter: RunTimeParameter, - minMax: string - ): string => { - const { type } = runTimeParameter - const choices = - 'choices' in runTimeParameter ? runTimeParameter.choices : [] - const count = choices.length - - switch (type) { - case 'int': - case 'float': - return minMax - case 'boolean': - return t('on_off') - case 'str': - if (count > 2) { - return t('choices', { count }) - } else { - return choices.map(choice => choice.displayName).join(', ') - } - } - return '' - } - - return ( - - - {t('name')} - {t('default_value')} - {t('range')} - - - {runTimeParameters.map((parameter: RunTimeParameter, index: number) => { - const min = 'min' in parameter ? parameter.min : 0 - const max = 'max' in parameter ? parameter.max : 0 - return ( - - - {parameter.displayName} - - - - {formatRunTimeParameterValue(parameter, t)} - - - - - {formatRange(parameter, `${min}-${max}`)} - - - - ) - })} - - - ) -} - -const StyledTable = styled.table` - width: 100%; - border-collapse: collapse; - text-align: left; -` - -const StyledTableHeader = styled.th` - ${TYPOGRAPHY.labelSemiBold} - padding: ${SPACING.spacing8}; - border-bottom: ${BORDERS.lineBorder}; -` - -interface StyledTableRowProps { - isLast: boolean -} - -const StyledTableRow = styled.tr` - padding: ${SPACING.spacing8}; - border-bottom: ${props => (props.isLast ? 'none' : BORDERS.lineBorder)}; -` - -interface StyledTableCellProps { - isLast: boolean -} - -const StyledTableCell = styled.td` - padding-left: ${SPACING.spacing8}; - padding-top: ${SPACING.spacing12}; - padding-bottom: ${props => (props.isLast ? 0 : SPACING.spacing12)}; -` diff --git a/app/src/organisms/ProtocolSetupParameters/ViewOnlyParameters.tsx b/app/src/organisms/ProtocolSetupParameters/ViewOnlyParameters.tsx index 9fac5f99c562..8eea44ba0cdd 100644 --- a/app/src/organisms/ProtocolSetupParameters/ViewOnlyParameters.tsx +++ b/app/src/organisms/ProtocolSetupParameters/ViewOnlyParameters.tsx @@ -1,5 +1,6 @@ import * as React from 'react' import { useTranslation } from 'react-i18next' +import { formatRunTimeParameterValue } from '@opentrons/shared-data' import { ALIGN_CENTER, BORDERS, @@ -16,7 +17,6 @@ import { ChildNavigation } from '../ChildNavigation' import { Chip } from '../../atoms/Chip' import { useToaster } from '../ToasterOven' import { mockData } from './index' -import { formatRunTimeParameterValue } from '../ProtocolDetails/ProtocolParameters/utils' import type { SetupScreens } from '../../pages/ProtocolSetup' diff --git a/app/src/organisms/ProtocolSetupParameters/index.tsx b/app/src/organisms/ProtocolSetupParameters/index.tsx index d92e54a6234e..c99c4ebeff60 100644 --- a/app/src/organisms/ProtocolSetupParameters/index.tsx +++ b/app/src/organisms/ProtocolSetupParameters/index.tsx @@ -3,6 +3,7 @@ import { useTranslation } from 'react-i18next' import { useHistory } from 'react-router-dom' import { useCreateRunMutation, useHost } from '@opentrons/react-api-client' import { useQueryClient } from 'react-query' +import { formatRunTimeParameterValue } from '@opentrons/shared-data' import { ALIGN_CENTER, DIRECTION_COLUMN, @@ -13,7 +14,6 @@ import { import { ProtocolSetupStep } from '../../pages/ProtocolSetup' import { ChildNavigation } from '../ChildNavigation' import { ResetValuesModal } from './ResetValuesModal' -import { formatRunTimeParameterValue } from '../ProtocolDetails/ProtocolParameters/utils' import type { RunTimeParameter } from '@opentrons/shared-data' import type { LabwareOffsetCreateData } from '@opentrons/api-client' diff --git a/app/src/pages/ProtocolDetails/Parameters.tsx b/app/src/pages/ProtocolDetails/Parameters.tsx index f2304893374e..0e12e8d7997d 100644 --- a/app/src/pages/ProtocolDetails/Parameters.tsx +++ b/app/src/pages/ProtocolDetails/Parameters.tsx @@ -1,6 +1,7 @@ import * as React from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' +import { formatRunTimeParameterValue } from '@opentrons/shared-data' import { BORDERS, COLORS, @@ -13,7 +14,6 @@ import { import { useToaster } from '../../organisms/ToasterOven' import { useRunTimeParameters } from '../Protocols/hooks' import { EmptySection } from './EmptySection' -import { formatRunTimeParameterValue } from '../../organisms/ProtocolDetails/ProtocolParameters/utils' import type { RunTimeParameter } from '@opentrons/shared-data' const Table = styled('table')` diff --git a/app/src/organisms/ProtocolDetails/ProtocolParameters/NoParameter.tsx b/components/src/molecules/ParametersTable/NoParameters.tsx similarity index 52% rename from app/src/organisms/ProtocolDetails/ProtocolParameters/NoParameter.tsx rename to components/src/molecules/ParametersTable/NoParameters.tsx index 2dd3f2d14412..b0afb82530f8 100644 --- a/app/src/organisms/ProtocolDetails/ProtocolParameters/NoParameter.tsx +++ b/components/src/molecules/ParametersTable/NoParameters.tsx @@ -1,21 +1,16 @@ import * as React from 'react' -import { useTranslation } from 'react-i18next' -import { - ALIGN_CENTER, - BORDERS, - COLORS, - DIRECTION_COLUMN, - Flex, - Icon, - SPACING, - StyledText, - TYPOGRAPHY, -} from '@opentrons/components' - -export function NoParameter(): JSX.Element { - const { t } = useTranslation('protocol_details') +import { BORDERS, COLORS } from '../../helix-design-system' +import { SPACING, TYPOGRAPHY } from '../../ui-style-constants/index' +import { StyledText } from '../../atoms/StyledText' +import { Icon } from '../../icons' +import { Flex } from '../../primitives' +import { ALIGN_CENTER, DIRECTION_COLUMN } from '../../styles' +interface NoParametersProps { + t?: any +} +export function NoParameters({ t }: NoParametersProps): JSX.Element { return ( - {t('no_parameters')} + {t != null + ? t('no_parameters') + : 'No parameters specified in this protocol'} ) diff --git a/components/src/molecules/ParametersTable/ParametersTable.stories.tsx b/components/src/molecules/ParametersTable/ParametersTable.stories.tsx new file mode 100644 index 000000000000..ce55f700dc3b --- /dev/null +++ b/components/src/molecules/ParametersTable/ParametersTable.stories.tsx @@ -0,0 +1,159 @@ +import * as React from 'react' +import { ParametersTable } from '@opentrons/components' +import type { Story, Meta } from '@storybook/react' +import type { RunTimeParameter } from '@opentrons/shared-data' + +export default { + title: 'Library/Molecules/ParametersTable', +} as Meta + +const Template: Story> = args => ( + +) + +const runTimeParameters: RunTimeParameter[] = [ + { + value: false, + displayName: 'Dry Run', + variableName: 'DRYRUN', + description: 'Is this a dry or wet run? Wet is true, dry is false', + type: 'boolean', + default: false, + }, + { + value: true, + displayName: 'Use Gripper', + variableName: 'USE_GRIPPER', + description: 'For using the gripper.', + type: 'boolean', + default: true, + }, + { + value: true, + displayName: 'Trash Tips', + variableName: 'TIP_TRASH', + description: + 'to throw tip into the trash or to not throw tip into the trash', + type: 'boolean', + default: true, + }, + { + value: true, + displayName: 'Deactivate Temperatures', + variableName: 'DEACTIVATE_TEMP', + description: 'deactivate temperature on the module', + type: 'boolean', + default: true, + }, + { + value: 4, + displayName: 'Columns of Samples', + variableName: 'COLUMNS', + description: 'How many columns do you want?', + type: 'int', + min: 1, + max: 14, + default: 4, + }, + { + value: 6, + displayName: 'PCR Cycles', + variableName: 'PCR_CYCLES', + description: 'number of PCR cycles on a thermocycler', + type: 'int', + min: 1, + max: 10, + default: 6, + }, + { + value: 6.5, + displayName: 'EtoH Volume', + variableName: 'ETOH_VOLUME', + description: '70% ethanol volume', + type: 'float', + suffix: 'mL', + min: 1.5, + max: 10.0, + default: 6.5, + }, + { + value: 'none', + displayName: 'Default Module Offsets', + variableName: 'DEFAULT_OFFSETS', + description: 'default module offsets for temp, H-S, and none', + type: 'str', + choices: [ + { + displayName: 'No offsets', + value: 'none', + }, + { + displayName: 'temp offset', + value: '1', + }, + { + displayName: 'heater-shaker offset', + value: '2', + }, + ], + default: 'none', + }, + { + value: 'left', + displayName: 'pipette mount', + variableName: 'mont', + description: 'pipette mount', + type: 'str', + choices: [ + { + displayName: 'Left', + value: 'left', + }, + { + displayName: 'Right', + value: 'right', + }, + ], + default: 'left', + }, + { + value: 'flex', + displayName: 'short test case', + variableName: 'short 2 options', + description: 'this play 2 short options', + type: 'str', + choices: [ + { + displayName: 'OT-2', + value: 'ot2', + }, + { + displayName: 'Flex', + value: 'flex', + }, + ], + default: 'flex', + }, + { + value: 'flex', + displayName: 'long test case', + variableName: 'long 2 options', + description: 'this play 2 long options', + type: 'str', + choices: [ + { + displayName: 'I am kind of long text version', + value: 'ot2', + }, + { + displayName: 'I am kind of long text version. Today is 3/15', + value: 'flex', + }, + ], + default: 'flex', + }, +] +export const Default = Template.bind({}) +Default.args = { + runTimeParameters: runTimeParameters, +} diff --git a/app/src/organisms/ProtocolDetails/ProtocolParameters/__tests__/NoParameter.test.tsx b/components/src/molecules/ParametersTable/__tests__/NoParameters.test.tsx similarity index 55% rename from app/src/organisms/ProtocolDetails/ProtocolParameters/__tests__/NoParameter.test.tsx rename to components/src/molecules/ParametersTable/__tests__/NoParameters.test.tsx index 40cfb8f48ded..5b2e7f2927d5 100644 --- a/app/src/organisms/ProtocolDetails/ProtocolParameters/__tests__/NoParameter.test.tsx +++ b/components/src/molecules/ParametersTable/__tests__/NoParameters.test.tsx @@ -2,28 +2,25 @@ import * as React from 'react' import { screen } from '@testing-library/react' import { describe, it, expect } from 'vitest' -import { BORDERS, COLORS } from '@opentrons/components' +import { renderWithProviders } from '../../../testing/utils' +import { BORDERS, COLORS } from '../../../helix-design-system' +import { NoParameters } from '../NoParameters' -import { renderWithProviders } from '../../../../__testing-utils__' -import { i18n } from '../../../../i18n' - -import { NoParameter } from '../NoParameter' - -const render = () => { - return renderWithProviders(, { - i18nInstance: i18n, - }) +const render = (props: React.ComponentProps) => { + return renderWithProviders() } -describe('NoParameter', () => { +const tMock = (key: string) => key + +describe('NoParameters', () => { it('should render text and icon with proper color', () => { - render() + render({}) screen.getByLabelText('alert') screen.getByText('No parameters specified in this protocol') }) it('should have proper styles', () => { - render() + render({}) expect(screen.getByTestId('NoRunTimeParameter')).toHaveStyle( `background-color: ${COLORS.grey30}` ) @@ -34,4 +31,11 @@ describe('NoParameter', () => { `color: ${COLORS.grey60}` ) }) + + it('should render the raw i18n value if a t is provided', () => { + render({ + t: tMock, + }) + screen.getByText('no_parameters') + }) }) diff --git a/components/src/molecules/ParametersTable/__tests__/ParametersTable.test.tsx b/components/src/molecules/ParametersTable/__tests__/ParametersTable.test.tsx new file mode 100644 index 000000000000..1c9cd2d571ca --- /dev/null +++ b/components/src/molecules/ParametersTable/__tests__/ParametersTable.test.tsx @@ -0,0 +1,119 @@ +import * as React from 'react' +import { renderWithProviders } from '../../../testing/utils' +import { describe, it, beforeEach } from 'vitest' +import { screen } from '@testing-library/react' +import { ParametersTable } from '../index' + +import type { RunTimeParameter } from '@opentrons/shared-data' + +const tMock = (key: string) => key +const mockRunTimeParameter: RunTimeParameter[] = [ + { + displayName: 'Trash Tips', + variableName: 'TIP_TRASH', + description: + 'to throw tip into the trash or to not throw tip into the trash', + type: 'boolean', + default: true, + value: true, + }, + { + displayName: 'EtoH Volume', + variableName: 'ETOH_VOLUME', + description: '70% ethanol volume', + type: 'float', + suffix: 'mL', + min: 1.5, + max: 10.0, + default: 6.5, + value: 6.5, + }, + { + displayName: 'Default Module Offsets', + variableName: 'DEFAULT_OFFSETS', + description: 'default module offsets for temp, H-S, and none', + type: 'str', + value: 'none', + choices: [ + { + displayName: 'No offsets', + value: 'none', + }, + { + displayName: 'temp offset', + value: '1', + }, + { + displayName: 'heater-shaker offset', + value: '2', + }, + ], + default: 'none', + }, + { + displayName: 'pipette mount', + variableName: 'mont', + description: 'pipette mount', + type: 'str', + value: 'left', + choices: [ + { + displayName: 'Left', + value: 'left', + }, + { + displayName: 'Right', + value: 'right', + }, + ], + default: 'left', + }, +] + +const render = (props: React.ComponentProps) => { + return renderWithProviders() +} + +describe('ParametersTabl', () => { + let props: React.ComponentProps + + beforeEach(() => { + props = { + runTimeParameters: mockRunTimeParameter, + } + }) + + it('should render table header', () => { + render(props) + screen.getByText('Name') + screen.getByText('Default Value') + screen.getByText('Range') + }) + + it('should render parameters default information', () => { + render(props) + screen.getByText('Trash Tips') + screen.getByText('On') + screen.getByText('On, off') + + screen.getByText('EtoH Volume') + screen.getByText('6.5 mL') + screen.getByText('1.5-10') + + screen.getByText('Default Module Offsets') + screen.getByText('No offsets') + screen.getByText('3 choices') + + screen.getByText('pipette mount') + screen.getByText('Left') + screen.getByText('Left, Right') + }) + + it('should render the raw i18n values if a t prop is provided', () => { + props.t = tMock + render(props) + screen.getByText('name') + screen.getByText('default_value') + screen.getByText('range') + }) +}) diff --git a/components/src/molecules/ParametersTable/index.tsx b/components/src/molecules/ParametersTable/index.tsx new file mode 100644 index 000000000000..4ff5cdeeb18a --- /dev/null +++ b/components/src/molecules/ParametersTable/index.tsx @@ -0,0 +1,117 @@ +import * as React from 'react' +import styled from 'styled-components' +import { formatRunTimeParameterValue } from '@opentrons/shared-data' +import { BORDERS } from '../../helix-design-system' +import { SPACING, TYPOGRAPHY } from '../../ui-style-constants/index' +import { StyledText } from '../../atoms/StyledText' + +import type { RunTimeParameter } from '@opentrons/shared-data' + +interface ProtocolParameterItemsProps { + runTimeParameters: RunTimeParameter[] + t?: any +} + +/** used in both the desktop app and Protocol Library + * to display the run time parameters table + */ +export function ParametersTable({ + runTimeParameters, + t, +}: ProtocolParameterItemsProps): JSX.Element { + const formatRange = ( + runTimeParameter: RunTimeParameter, + minMax: string + ): string => { + const { type } = runTimeParameter + const choices = + 'choices' in runTimeParameter ? runTimeParameter.choices : [] + const count = choices.length + + switch (type) { + case 'int': + case 'float': + return minMax + case 'boolean': + return t != null ? t('on_off') : 'On, off' + case 'str': + if (count > 2) { + return t != null ? t('choices', { count }) : `${count} choices` + } else { + return choices.map(choice => choice.displayName).join(', ') + } + } + return '' + } + + return ( + + + {t != null ? t('name') : 'Name'} + + {t != null ? t('default_value') : 'Default Value'} + + + {t != null ? t('range') : 'Range'} + + + + {runTimeParameters.map((parameter: RunTimeParameter, index: number) => { + const min = 'min' in parameter ? parameter.min : 0 + const max = 'max' in parameter ? parameter.max : 0 + return ( + + + {parameter.displayName} + + + + {formatRunTimeParameterValue(parameter, t)} + + + + + {formatRange(parameter, `${min}-${max}`)} + + + + ) + })} + + + ) +} + +const StyledTable = styled.table` + width: 100%; + border-collapse: collapse; + text-align: left; +` + +const StyledTableHeader = styled.th` + ${TYPOGRAPHY.labelSemiBold} + padding: ${SPACING.spacing8}; + border-bottom: ${BORDERS.lineBorder}; +` + +interface StyledTableRowProps { + isLast: boolean +} + +const StyledTableRow = styled.tr` + padding: ${SPACING.spacing8}; + border-bottom: ${props => (props.isLast ? 'none' : BORDERS.lineBorder)}; +` + +interface StyledTableCellProps { + isLast: boolean +} + +const StyledTableCell = styled.td` + padding-left: ${SPACING.spacing8}; + padding-top: ${SPACING.spacing12}; + padding-bottom: ${props => (props.isLast ? 0 : SPACING.spacing12)}; +` diff --git a/components/src/molecules/index.tsx b/components/src/molecules/index.tsx index ce1c0c63e31d..3231c2f93a97 100644 --- a/components/src/molecules/index.tsx +++ b/components/src/molecules/index.tsx @@ -1,2 +1,4 @@ export * from './LocationIcon' export * from './RoundTab' +export * from './ParametersTable' +export * from './ParametersTable/NoParameters' diff --git a/app/src/organisms/ProtocolDetails/ProtocolParameters/__tests__/utils.test.ts b/shared-data/js/helpers/__tests__/formatRunTimeParameterValue.test.ts similarity index 88% rename from app/src/organisms/ProtocolDetails/ProtocolParameters/__tests__/utils.test.ts rename to shared-data/js/helpers/__tests__/formatRunTimeParameterValue.test.ts index 66eddcc0efda..bfdad4939137 100644 --- a/app/src/organisms/ProtocolDetails/ProtocolParameters/__tests__/utils.test.ts +++ b/shared-data/js/helpers/__tests__/formatRunTimeParameterValue.test.ts @@ -1,8 +1,7 @@ -import { useTranslation } from 'react-i18next' import { describe, it, expect, vi } from 'vitest' -import { formatRunTimeParameterValue } from '../utils' +import { formatRunTimeParameterValue } from '../formatRunTimeParameterValue' -import type { RunTimeParameter } from '@opentrons/shared-data' +import type { RunTimeParameter } from '../../types' const capitalizeFirstLetter = (str: string): string => { return str.charAt(0).toUpperCase() + str.slice(1) @@ -10,14 +9,6 @@ const capitalizeFirstLetter = (str: string): string => { const mockTFunction = vi.fn(str => capitalizeFirstLetter(str)) -vi.mock('react-i18next', async importOriginal => { - const actual = await importOriginal() - return { - ...actual, - t: mockTFunction, - } -}) - describe('utils-formatRunTimeParameterValue', () => { it('should return value with suffix when type is int', () => { const mockData = { diff --git a/app/src/organisms/ProtocolDetails/ProtocolParameters/utils.ts b/shared-data/js/helpers/formatRunTimeParameterValue.ts similarity index 79% rename from app/src/organisms/ProtocolDetails/ProtocolParameters/utils.ts rename to shared-data/js/helpers/formatRunTimeParameterValue.ts index b21b3eaf3c75..ffbab087849f 100644 --- a/app/src/organisms/ProtocolDetails/ProtocolParameters/utils.ts +++ b/shared-data/js/helpers/formatRunTimeParameterValue.ts @@ -1,9 +1,8 @@ -import { useTranslation } from 'react-i18next' -import type { RunTimeParameter } from '@opentrons/shared-data' +import { RunTimeParameter } from '../types' export const formatRunTimeParameterValue = ( runTimeParameter: RunTimeParameter, - t: ReturnType['t'] + t?: any ): string => { const { type, default: defaultValue } = runTimeParameter const suffix = @@ -17,7 +16,11 @@ export const formatRunTimeParameterValue = ( ? `${defaultValue.toString()} ${suffix}` : defaultValue.toString() case 'boolean': - return Boolean(defaultValue) ? t('on') : t('off') + if (t != null) { + return Boolean(defaultValue) ? t('on') : t('off') + } else { + return Boolean(defaultValue) ? 'On' : 'Off' + } case 'str': if ('choices' in runTimeParameter && runTimeParameter.choices != null) { const choice = runTimeParameter.choices.find( diff --git a/shared-data/js/helpers/index.ts b/shared-data/js/helpers/index.ts index 5cddd22336e9..2d78f16ca1f0 100644 --- a/shared-data/js/helpers/index.ts +++ b/shared-data/js/helpers/index.ts @@ -28,6 +28,7 @@ export * from './getOccludedSlotCountForModule' export * from './labwareInference' export * from './getAddressableAreasInProtocol' export * from './getSimplestFlexDeckConfig' +export * from './formatRunTimeParameterValue' export const getLabwareDefIsStandard = (def: LabwareDefinition2): boolean => def?.namespace === OPENTRONS_LABWARE_NAMESPACE