From bc8b48dbb8a2065091f0eaf120c36536033bd4ab Mon Sep 17 00:00:00 2001 From: Jethary Rader <66035149+jerader@users.noreply.github.com> Date: Thu, 28 Mar 2024 10:50:01 -0400 Subject: [PATCH] feat(protocol-designer, step-generation): support for selecting multi tipracks per pipette (#14601) closes AUTH-11, AUTH-13, AUTH-50 --- components/src/instrument/InfoItem.tsx | 4 +- components/src/instrument/InstrumentInfo.tsx | 16 +- .../cypress/integration/migrations.spec.js | 14 +- .../protocol/8/doItAllV3MigratedToV8.json | 112 +- .../protocol/8/doItAllV4MigratedToV8.json | 63 +- .../protocol/8/doItAllV7MigratedToV8.json | 14 +- .../fixtures/protocol/8/doItAllV8.json | 7 +- .../protocol/8/example_1_1_0MigratedToV8.json | 404 +- .../fixtures/protocol/8/mix_8_0_0.json | 21 +- .../8/ninetySixChannelFullAndColumn.json | 62 +- .../components/BatchEditForm/BatchEditMix.tsx | 6 +- .../BatchEditForm/BatchEditMoveLiquid.tsx | 3 +- .../__tests__/LabwareSelectionModal.test.tsx | 2 +- .../fields/DisposalVolumeField.tsx | 7 +- .../fields/FlowRateField/index.tsx | 12 +- .../fields/PathField/PathField.tsx | 4 + .../fields/PathField/getDisabledPathMap.ts | 14 +- .../StepEditForm/fields/TiprackField.tsx | 32 + .../components/StepEditForm/forms/MixForm.tsx | 8 +- .../forms/MoveLiquidForm/SourceDestFields.tsx | 3 +- .../forms/MoveLiquidForm/index.tsx | 3 + .../CreateFileWizard/PipetteTipsTile.tsx | 35 +- .../__tests__/ModulesAndOtherTile.test.tsx | 4 +- .../__tests__/PipetteTipsTile.test.tsx | 4 +- .../CreateFileWizard/__tests__/utils.test.tsx | 2 +- .../modals/CreateFileWizard/index.tsx | 5 +- .../FilePipettesModal/PipetteFields.tsx | 55 +- .../FilePipettesModal/TiprackOption.tsx | 41 + .../FilePipettesModal/TiprackSelect.tsx | 51 + .../__tests__/TiprackOptions.test.tsx | 36 + .../__tests__/TiprackSelect.test.tsx | 39 + .../modals/FilePipettesModal/index.tsx | 22 +- .../__fixtures__/createFile/commonFields.ts | 4 +- .../file-data/__tests__/createFile.test.ts | 10 +- .../src/file-data/selectors/fileCreator.ts | 7 +- protocol-designer/src/file-types.ts | 2 +- protocol-designer/src/form-types.ts | 2 + .../src/load-file/migration/8_1_0.ts | 91 + .../src/load-file/migration/index.ts | 3 + .../migration/utils/getLoadLiquidCommands.ts | 1 + .../src/localization/en/alert.json | 4 + .../src/localization/en/form.json | 1 + protocol-designer/src/pipettes/pipetteData.ts | 36 +- .../src/step-forms/selectors/index.ts | 17 +- .../test/createPresavedStepForm.test.ts | 13 +- protocol-designer/src/step-forms/types.ts | 4 +- .../utils/createPresavedStepForm.ts | 56 + .../src/step-forms/utils/index.ts | 2 +- .../src/steplist/fieldLevel/index.ts | 3 + .../src/steplist/formLevel/errors.ts | 20 +- .../formLevel/getDefaultsForStepType.ts | 2 + .../dependentFieldsUpdateMoveLiquid.ts | 47 +- .../handleFormChange/test/moveLiquid.test.ts | 8 +- .../handleFormChange/test/utils.test.ts | 21 +- .../formLevel/handleFormChange/utils.ts | 17 +- .../formLevel/stepFormToArgs/mixFormToArgs.ts | 4 +- .../stepFormToArgs/moveLiquidFormToArgs.ts | 5 +- .../stepFormToArgs/test/mixFormToArgs.test.ts | 18 +- .../test/moveLiquidFormToArgs.test.ts | 18 +- .../steplist/formLevel/test/errors.test.ts | 5 +- .../test/getDefaultsForStepType.test.ts | 2 + .../src/steplist/generateSubstepItem.ts | 3 + .../steplist/test/generateSubsteps.test.ts | 3 + .../generateRobotStateTimeline.test.ts | 3 + protocol-designer/src/ui/labware/selectors.ts | 35 + .../src/ui/steps/test/selectors.test.ts | 10 + protocol-designer/src/utils/index.ts | 22 +- .../fixtureGeneration.test.ts.snap | 13438 ++++++++-------- .../src/__tests__/aspirate.test.ts | 287 +- .../src/__tests__/consolidate.test.ts | 2 + .../src/__tests__/distribute.test.ts | 3 +- step-generation/src/__tests__/mix.test.ts | 2 +- .../ninetySixChannelCollision.test.ts | 20 +- .../src/__tests__/replaceTip.test.ts | 10 + .../src/__tests__/robotStateSelectors.test.ts | 85 +- .../src/__tests__/transfer.test.ts | 3 +- step-generation/src/__tests__/utils.test.ts | 8 +- .../src/commandCreators/atomic/aspirate.ts | 13 +- .../src/commandCreators/atomic/replaceTip.ts | 13 +- .../commandCreators/compound/consolidate.ts | 15 +- .../commandCreators/compound/distribute.ts | 13 +- .../src/commandCreators/compound/mix.ts | 9 +- .../src/commandCreators/compound/transfer.ts | 16 +- step-generation/src/errorCreators.ts | 7 + .../src/fixtures/robotStateFixtures.ts | 20 +- step-generation/src/robotStateSelectors.ts | 25 +- step-generation/src/types.ts | 7 +- step-generation/src/utils/misc.ts | 4 + .../src/utils/ninetySixChannelCollision.ts | 11 +- 89 files changed, 8198 insertions(+), 7417 deletions(-) create mode 100644 protocol-designer/src/components/StepEditForm/fields/TiprackField.tsx create mode 100644 protocol-designer/src/components/modals/FilePipettesModal/TiprackOption.tsx create mode 100644 protocol-designer/src/components/modals/FilePipettesModal/TiprackSelect.tsx create mode 100644 protocol-designer/src/components/modals/FilePipettesModal/__tests__/TiprackOptions.test.tsx create mode 100644 protocol-designer/src/components/modals/FilePipettesModal/__tests__/TiprackSelect.test.tsx create mode 100644 protocol-designer/src/load-file/migration/8_1_0.ts diff --git a/components/src/instrument/InfoItem.tsx b/components/src/instrument/InfoItem.tsx index c43ee686c14..82b5a491a37 100644 --- a/components/src/instrument/InfoItem.tsx +++ b/components/src/instrument/InfoItem.tsx @@ -3,7 +3,7 @@ import * as React from 'react' import styles from './instrument.module.css' export interface InfoItemProps { - title: string + title: string | null value: string className?: string } @@ -17,7 +17,7 @@ export function InfoItem(props: InfoItemProps): JSX.Element { return (
-

{title}

+ {title != null ?

{title}

: null} {value}
) diff --git a/components/src/instrument/InstrumentInfo.tsx b/components/src/instrument/InstrumentInfo.tsx index 7085edc3344..d5d26a3b4b4 100644 --- a/components/src/instrument/InstrumentInfo.tsx +++ b/components/src/instrument/InstrumentInfo.tsx @@ -18,8 +18,8 @@ export interface InstrumentInfoProps { showMountLabel?: boolean | null /** human-readable description, eg 'p300 Single-channel' */ description: string - /** paired tiprack model */ - tiprackModel?: string + /** paired tiprack models */ + tiprackModels?: string[] /** if disabled, pipette & its info are grayed out */ isDisabled: boolean /** specs of mounted pipette */ @@ -53,9 +53,15 @@ export function InstrumentInfo(props: InstrumentInfoProps): JSX.Element { } value={props.description} /> - {props.tiprackModel && ( - - )} + {props.tiprackModels != null + ? props.tiprackModels.map((model, index) => ( + + )) + : null} {props.children} diff --git a/protocol-designer/cypress/integration/migrations.spec.js b/protocol-designer/cypress/integration/migrations.spec.js index 6bc1036477a..6c1d01a0ee7 100644 --- a/protocol-designer/cypress/integration/migrations.spec.js +++ b/protocol-designer/cypress/integration/migrations.spec.js @@ -13,7 +13,7 @@ describe('Protocol fixtures migrate and match snapshots', () => { const testCases = [ { - title: 'example_1_1_0 (schema 1, PD version 1.1.1) -> PD 8.0.x, schema 8', + title: 'example_1_1_0 (schema 1, PD version 1.1.1) -> PD 8.1.x, schema 8', importFixture: '../../fixtures/protocol/1/example_1_1_0.json', expectedExportFixture: '../../fixtures/protocol/8/example_1_1_0MigratedToV8.json', @@ -21,7 +21,7 @@ describe('Protocol fixtures migrate and match snapshots', () => { migrationModal: 'newLabwareDefs', }, { - title: 'doItAllV3 (schema 3, PD version 4.0.0) -> PD 8.0.x, schema 8', + title: 'doItAllV3 (schema 3, PD version 4.0.0) -> PD 8.1.x, schema 8', importFixture: '../../fixtures/protocol/4/doItAllV3.json', expectedExportFixture: '../../fixtures/protocol/8/doItAllV3MigratedToV8.json', @@ -29,7 +29,7 @@ describe('Protocol fixtures migrate and match snapshots', () => { migrationModal: 'v8', }, { - title: 'doItAllV4 (schema 4, PD version 4.0.0) -> PD 8.0.x, schema 8', + title: 'doItAllV4 (schema 4, PD version 4.0.0) -> PD 8.1.x, schema 8', importFixture: '../../fixtures/protocol/4/doItAllV4.json', expectedExportFixture: '../../fixtures/protocol/8/doItAllV4MigratedToV8.json', @@ -38,7 +38,7 @@ describe('Protocol fixtures migrate and match snapshots', () => { }, { title: - 'doItAll78MigratedToV8 (schema 7, PD version 8.0.0) -> should migrate to 8.0.x, schema 8', + 'doItAll78MigratedToV8 (schema 7, PD version 8.0.0) -> should migrate to 8.1.x, schema 8', importFixture: '../../fixtures/protocol/7/doItAllV7.json', expectedExportFixture: '../../fixtures/protocol/8/doItAllV7MigratedToV8.json', @@ -46,7 +46,8 @@ describe('Protocol fixtures migrate and match snapshots', () => { migrationModal: 'v8', }, { - title: '96-channel full and column schema 8 -> reimported as schema 8', + title: + '96-channel full and column schema 8 -> should migrate to 8.1.x, schema 8', importFixture: '../../fixtures/protocol/8/ninetySixChannelFullAndColumn.json', expectedExportFixture: @@ -55,7 +56,8 @@ describe('Protocol fixtures migrate and match snapshots', () => { unusedPipettes: false, }, { - title: 'doItAllV8 flex robot -> reimported, should not migrate', + title: + 'doItAllV8 flex robot -> reimported, should migrate to 8.1.x, schema 8', importFixture: '../../fixtures/protocol/8/doItAllV8.json', expectedExportFixture: '../../fixtures/protocol/8/doItAllV8.json', migrationModal: null, diff --git a/protocol-designer/fixtures/protocol/8/doItAllV3MigratedToV8.json b/protocol-designer/fixtures/protocol/8/doItAllV3MigratedToV8.json index f2624265424..9bc7b9e44ed 100644 --- a/protocol-designer/fixtures/protocol/8/doItAllV3MigratedToV8.json +++ b/protocol-designer/fixtures/protocol/8/doItAllV3MigratedToV8.json @@ -6,16 +6,16 @@ "author": "Fixture", "description": "Test all v3 commands", "created": 1585930833548, - "lastModified": 1701370588110, + "lastModified": 1709303240330, "category": null, "subcategory": null, "tags": [] }, "designerApplication": { "name": "opentrons/protocol-designer", - "version": "8.0.0", + "version": "8.1.0", "data": { - "_internalAppBuildDate": "Thu, 30 Nov 2023 18:54:38 GMT", + "_internalAppBuildDate": "Fri, 01 Mar 2024 14:22:27 GMT", "defaultValues": { "aspirate_mmFromBottom": 1, "dispense_mmFromBottom": 0.5, @@ -23,7 +23,9 @@ "blowout_mmFromTop": 0 }, "pipetteTiprackAssignments": { - "0b3f2210-75c7-11ea-b42f-4b64e50f43e5": "opentrons/opentrons_96_tiprack_300ul/1" + "0b3f2210-75c7-11ea-b42f-4b64e50f43e5": [ + "opentrons/opentrons_96_tiprack_300ul/1" + ] }, "dismissedWarnings": { "form": {}, "timeline": {} }, "ingredients": { @@ -71,6 +73,7 @@ "3961e4c0-75c7-11ea-b42f-4b64e50f43e5": { "pipette": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": "40", + "tipRack": "0b44c760-75c7-11ea-b42f-4b64e50f43e5:opentrons/opentrons_96_tiprack_300ul/1", "changeTip": "always", "path": "multiDispense", "aspirate_wells_grouped": false, @@ -112,11 +115,11 @@ "dispense_delay_seconds": "1", "dispense_delay_mmFromBottom": "0.5", "dropTip_location": "8053a205-f2dc-4b1d-8d05-bf8233949e2e:trashBin", + "nozzles": null, "id": "3961e4c0-75c7-11ea-b42f-4b64e50f43e5", "stepType": "moveLiquid", "stepName": "transfer", - "stepDetails": "", - "nozzles": null + "stepDetails": "" }, "54dc3200-75c7-11ea-b42f-4b64e50f43e5": { "pauseAction": "untilResume", @@ -165,11 +168,12 @@ "mix_touchTip_checkbox": true, "mix_touchTip_mmFromBottom": 11.8, "dropTip_location": "8053a205-f2dc-4b1d-8d05-bf8233949e2e:trashBin", + "nozzles": null, + "tipRack": "0b44c760-75c7-11ea-b42f-4b64e50f43e5:opentrons/opentrons_96_tiprack_300ul/1", "id": "a4cee9a0-75dc-11ea-b42f-4b64e50f43e5", "stepType": "mix", "stepName": "mix", - "stepDetails": "", - "nozzles": null + "stepDetails": "" } }, "orderedStepIds": [ @@ -2514,7 +2518,7 @@ "commandSchemaId": "opentronsCommandSchemaV8", "commands": [ { - "key": "294752a1-9356-4fba-a427-a20def107faf", + "key": "db2d2973-9059-41a8-a6f7-3b70b747cb2d", "commandType": "loadPipette", "params": { "pipetteName": "p300_single_gen2", @@ -2523,7 +2527,7 @@ } }, { - "key": "d497b90e-2eaa-40ae-92ed-aa688f2b0eb5", + "key": "d9bb5f59-77e8-4794-af52-5ac18181a1c9", "commandType": "loadLabware", "params": { "displayName": "Opentrons 96 Tip Rack 300 µL", @@ -2535,7 +2539,7 @@ } }, { - "key": "b86eb638-6516-4df6-a452-ff51952d9782", + "key": "e375681d-7284-4f0c-9921-d16e4ce0649e", "commandType": "loadLabware", "params": { "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", @@ -2547,7 +2551,7 @@ } }, { - "key": "800af80a-e8e7-46ac-bb0d-682c61ab0930", + "key": "9455cd08-4d3a-45e4-8614-7485193e824e", "commandType": "loadLabware", "params": { "displayName": "Opentrons 24 Well Aluminum Block with Generic 2 mL Screwcap", @@ -2560,7 +2564,7 @@ }, { "commandType": "loadLiquid", - "key": "04b3689b-ae7d-48a6-9b76-fd5ba9c2b2d1", + "key": "27c67940-a745-41b9-b4d8-01a8dba8b4e9", "params": { "liquidId": "0", "labwareId": "1e610d40-75c7-11ea-b42f-4b64e50f43e5:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1", @@ -2586,12 +2590,12 @@ }, { "commandType": "waitForDuration", - "key": "dabea071-6e43-4922-b71a-94b708e7fbc2", + "key": "b7c8d36b-c9d6-4fa3-a696-da35a3cc5981", "params": { "seconds": 62, "message": "" } }, { "commandType": "pickUpTip", - "key": "910b8d8f-b2d7-485b-8a2e-cad73d3ec3ae", + "key": "d97988e7-e386-4965-a915-f4776a0d7720", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "labwareId": "0b44c760-75c7-11ea-b42f-4b64e50f43e5:opentrons/opentrons_96_tiprack_300ul/1", @@ -2600,7 +2604,7 @@ }, { "commandType": "aspirate", - "key": "dec88c2c-c4bb-426e-b08e-08a190c0587c", + "key": "a60e86c1-8bf0-477f-8748-24ce798eb1de", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 30, @@ -2612,7 +2616,7 @@ }, { "commandType": "dispense", - "key": "c43f05ea-8c51-4a97-a5ad-263ce897ea17", + "key": "61afaad0-0566-4435-b03a-94498d2fc2aa", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 30, @@ -2624,7 +2628,7 @@ }, { "commandType": "aspirate", - "key": "16471157-c06e-4d7c-b3ac-c2a3e1c28784", + "key": "4ccf6427-d404-4b4b-9974-935a6676d8d2", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 30, @@ -2636,7 +2640,7 @@ }, { "commandType": "dispense", - "key": "6151a6a7-cc7c-4e6f-b047-ad96f6d1a06a", + "key": "bcdd9d53-ff68-4264-bd61-e11422149144", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 30, @@ -2648,7 +2652,7 @@ }, { "commandType": "aspirate", - "key": "5906c8f8-a5a8-4c20-bf17-958fedc25e05", + "key": "ce51dbac-b2ed-4edd-9657-33c106288844", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 100, @@ -2660,7 +2664,7 @@ }, { "commandType": "touchTip", - "key": "78708f4d-f4e5-4c7d-8507-dfda9f86b664", + "key": "a1993756-c789-4804-8ff0-f3f9577d68f4", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "labwareId": "1e610d40-75c7-11ea-b42f-4b64e50f43e5:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1", @@ -2670,7 +2674,7 @@ }, { "commandType": "dispense", - "key": "8078ffa5-1fe7-40bc-93cf-a3234344ae06", + "key": "270e73e1-719a-4338-9a8d-7ef8cdab558e", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 40, @@ -2682,7 +2686,7 @@ }, { "commandType": "touchTip", - "key": "f962af81-b22f-4302-b0ee-e91c920465ca", + "key": "45fd9725-1bef-4333-bce3-e4e81fc94fd4", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "labwareId": "21ed8f60-75c7-11ea-b42f-4b64e50f43e5:opentrons/opentrons_24_aluminumblock_generic_2ml_screwcap/1", @@ -2692,7 +2696,7 @@ }, { "commandType": "dispense", - "key": "2e80e425-a1ed-41fc-901e-ef0c004f6435", + "key": "ede9c8e0-ced4-4a60-841e-c28476d28ab8", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 40, @@ -2704,7 +2708,7 @@ }, { "commandType": "touchTip", - "key": "97be8e19-a825-4bbb-b481-6bf2e7c24e21", + "key": "d7fb1df9-ee04-4a6d-98e0-1ded591260bc", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "labwareId": "21ed8f60-75c7-11ea-b42f-4b64e50f43e5:opentrons/opentrons_24_aluminumblock_generic_2ml_screwcap/1", @@ -2714,7 +2718,7 @@ }, { "commandType": "moveToAddressableArea", - "key": "7d401e35-11e6-4291-a1cd-4e87ebc5b39d", + "key": "35f1f9b9-78f2-4a1a-9b7b-3c488881db2b", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "addressableAreaName": "fixedTrash", @@ -2723,7 +2727,7 @@ }, { "commandType": "blowOutInPlace", - "key": "c922e621-0fd3-49fa-a090-6ae155e310a2", + "key": "7dbec34d-5da6-41aa-9ff9-9368efa23407", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "flowRate": 46.43 @@ -2731,7 +2735,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "60e642d1-d985-4411-beca-0e5e28628a27", + "key": "7c10381b-bee1-4908-94c5-11d76a966a12", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "addressableAreaName": "fixedTrash", @@ -2741,17 +2745,17 @@ }, { "commandType": "dropTipInPlace", - "key": "814036fd-ea55-40d0-932b-d13f6113a77f", + "key": "fb84a594-b8b9-4950-81f0-cc2be260346e", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5" } }, { "commandType": "waitForResume", - "key": "00cedccd-f5dc-4b12-9142-979758ba0dd9", + "key": "340df2fa-adf0-4b43-90d7-2e1d8f09ba71", "params": { "message": "Wait until user intervention" } }, { "commandType": "pickUpTip", - "key": "583c26b9-f157-45a7-925c-d1cc332dddca", + "key": "9ff49b09-2860-4955-bd6f-a68ab3797208", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "labwareId": "0b44c760-75c7-11ea-b42f-4b64e50f43e5:opentrons/opentrons_96_tiprack_300ul/1", @@ -2760,7 +2764,7 @@ }, { "commandType": "aspirate", - "key": "93571571-cd41-42b9-b525-f75556f380c0", + "key": "249a56b1-e68b-449d-aad1-9a4bd9113a34", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 35, @@ -2772,7 +2776,7 @@ }, { "commandType": "dispense", - "key": "ea27c3ec-9131-4d52-bbab-e8ca7fb54786", + "key": "5503460e-fc28-4ebf-b476-88d2517ec4c5", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 35, @@ -2784,7 +2788,7 @@ }, { "commandType": "aspirate", - "key": "442241ed-358e-460b-a88e-88b6b8d5004e", + "key": "75c377d3-a93f-4310-9c06-1ee6e1d2fdb1", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 35, @@ -2796,7 +2800,7 @@ }, { "commandType": "dispense", - "key": "d89bc459-faf0-4331-a899-f27ae1516599", + "key": "c0ad7408-1f69-4092-8de0-524a0c3991e4", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 35, @@ -2808,7 +2812,7 @@ }, { "commandType": "aspirate", - "key": "9d52414b-47cc-4f7a-8024-1f65a522b9b6", + "key": "2c04b095-4f0c-4cd7-a1bc-8daee4e05f38", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 35, @@ -2820,7 +2824,7 @@ }, { "commandType": "dispense", - "key": "206e0579-45eb-4936-97fa-f59eb5548be6", + "key": "8ead30e3-b057-4994-b00c-c18a838d86ad", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 35, @@ -2832,7 +2836,7 @@ }, { "commandType": "moveToAddressableArea", - "key": "262b2f19-d01c-4366-855d-cc16b169cfca", + "key": "41dc50be-94fb-49f6-9ac6-9c8948622640", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "addressableAreaName": "fixedTrash", @@ -2841,7 +2845,7 @@ }, { "commandType": "blowOutInPlace", - "key": "8c0d4fca-9b06-4384-bfbe-112b3a537807", + "key": "4147917f-bca1-4ef4-b055-0610002a3572", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "flowRate": 35 @@ -2849,7 +2853,7 @@ }, { "commandType": "touchTip", - "key": "4c49f444-a606-4615-9d6d-dadaf4b963d7", + "key": "5692383d-d3c3-4969-9b76-c5dfd265e4c5", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "labwareId": "1e610d40-75c7-11ea-b42f-4b64e50f43e5:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1", @@ -2859,7 +2863,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "2a4ddf23-7272-4d1c-8dbc-f4db9a931715", + "key": "e389e5ae-8109-4a68-a8e5-58d96f453a85", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "addressableAreaName": "fixedTrash", @@ -2869,12 +2873,12 @@ }, { "commandType": "dropTipInPlace", - "key": "c55edd6b-b323-4d72-81d3-39e08ec71a88", + "key": "82048ca4-6ad6-4de9-ad94-4fc698e3aaff", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5" } }, { "commandType": "pickUpTip", - "key": "d83c457e-4183-4bac-a9cc-f58ece48e808", + "key": "b868a416-8074-4e21-8483-39b0bbc89ba2", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "labwareId": "0b44c760-75c7-11ea-b42f-4b64e50f43e5:opentrons/opentrons_96_tiprack_300ul/1", @@ -2883,7 +2887,7 @@ }, { "commandType": "aspirate", - "key": "6cf9204d-2ca7-4c96-9e5c-64efb0e95cd4", + "key": "677f3413-0fb0-428d-875a-32d3c8971ca1", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 35, @@ -2895,7 +2899,7 @@ }, { "commandType": "dispense", - "key": "69b4bcae-26c1-421e-a522-21a25ef94255", + "key": "6cafa525-b6f6-4ab4-8919-6398ecdcad50", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 35, @@ -2907,7 +2911,7 @@ }, { "commandType": "aspirate", - "key": "792b21de-bccf-4e81-8f59-e3d4eb72204c", + "key": "ef66610b-0d69-405b-91e9-9d46ef6f9e49", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 35, @@ -2919,7 +2923,7 @@ }, { "commandType": "dispense", - "key": "a0ef8fad-205e-4fb0-9817-1404c3f2b2d9", + "key": "88fbf912-ebaf-4148-9339-2b8fe5d8381d", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 35, @@ -2931,7 +2935,7 @@ }, { "commandType": "aspirate", - "key": "8d37fb0f-1d12-4d6b-965f-5a8bfd190cb7", + "key": "86107fa6-c935-4123-bf58-76643dc888d5", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 35, @@ -2943,7 +2947,7 @@ }, { "commandType": "dispense", - "key": "a59cce74-5f08-42b4-b6b8-9e7017066a20", + "key": "2c8d07b1-3f65-4554-99aa-3bc8899a5bd6", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 35, @@ -2955,7 +2959,7 @@ }, { "commandType": "moveToAddressableArea", - "key": "efdb0da0-97b4-4658-bc50-79a1b86550bb", + "key": "52740457-0f28-44b5-a053-80a7b8be7932", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "addressableAreaName": "fixedTrash", @@ -2964,7 +2968,7 @@ }, { "commandType": "blowOutInPlace", - "key": "fa5735fa-dbe3-41e8-b356-3f628e9908b0", + "key": "cff38f29-4334-4fe3-a361-465f2ce46be5", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "flowRate": 35 @@ -2972,7 +2976,7 @@ }, { "commandType": "touchTip", - "key": "60183d6a-8c7c-4624-ba58-7e2313d8ad37", + "key": "e9c841a0-f8e2-4f07-9eb6-6d03764259a6", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "labwareId": "1e610d40-75c7-11ea-b42f-4b64e50f43e5:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1", @@ -2982,7 +2986,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "5cc616a3-8b57-446a-a1d6-df13e1a9e4fe", + "key": "f1dc8237-78ef-4116-88f5-42d426086e63", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "addressableAreaName": "fixedTrash", @@ -2992,7 +2996,7 @@ }, { "commandType": "dropTipInPlace", - "key": "3bd0eb5c-3115-4953-aad4-a530dfb962fb", + "key": "c7ebd1ef-9d28-43dc-9fdd-6142a1b22c70", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5" } } ], diff --git a/protocol-designer/fixtures/protocol/8/doItAllV4MigratedToV8.json b/protocol-designer/fixtures/protocol/8/doItAllV4MigratedToV8.json index f37ee3f827b..6a3d3888cba 100644 --- a/protocol-designer/fixtures/protocol/8/doItAllV4MigratedToV8.json +++ b/protocol-designer/fixtures/protocol/8/doItAllV4MigratedToV8.json @@ -6,16 +6,16 @@ "author": "Fixture", "description": "Test all v4 commands", "created": 1585930833548, - "lastModified": 1702421272788, + "lastModified": 1709303209919, "category": null, "subcategory": null, "tags": [] }, "designerApplication": { "name": "opentrons/protocol-designer", - "version": "8.0.0", + "version": "8.1.0", "data": { - "_internalAppBuildDate": "Tue, 12 Dec 2023 22:47:16 GMT", + "_internalAppBuildDate": "Fri, 01 Mar 2024 14:22:27 GMT", "defaultValues": { "aspirate_mmFromBottom": 1, "dispense_mmFromBottom": 0.5, @@ -23,7 +23,9 @@ "blowout_mmFromTop": 0 }, "pipetteTiprackAssignments": { - "0b3f2210-75c7-11ea-b42f-4b64e50f43e5": "opentrons/opentrons_96_tiprack_300ul/1" + "0b3f2210-75c7-11ea-b42f-4b64e50f43e5": [ + "opentrons/opentrons_96_tiprack_300ul/1" + ] }, "dismissedWarnings": { "form": {}, "timeline": {} }, "ingredients": { @@ -105,6 +107,7 @@ "3961e4c0-75c7-11ea-b42f-4b64e50f43e5": { "pipette": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": "30", + "tipRack": "0b44c760-75c7-11ea-b42f-4b64e50f43e5:opentrons/opentrons_96_tiprack_300ul/1", "changeTip": "always", "path": "single", "aspirate_wells_grouped": false, @@ -146,11 +149,11 @@ "dispense_delay_seconds": "1", "dispense_delay_mmFromBottom": "0.5", "dropTip_location": "84882326-9cd3-428e-8352-89f133a1fe5d:trashBin", + "nozzles": null, "id": "3961e4c0-75c7-11ea-b42f-4b64e50f43e5", "stepType": "moveLiquid", "stepName": "transfer", - "stepDetails": "", - "nozzles": null + "stepDetails": "" }, "4f4057e0-75c7-11ea-b42f-4b64e50f43e5": { "moduleId": "0b419310-75c7-11ea-b42f-4b64e50f43e5:magneticModuleType", @@ -2543,7 +2546,7 @@ "commandSchemaId": "opentronsCommandSchemaV8", "commands": [ { - "key": "cf8e4b29-5797-4a3b-9130-f0daff8f0dfe", + "key": "ee3dbe0a-f7b1-4995-8449-dea339f61737", "commandType": "loadPipette", "params": { "pipetteName": "p300_single_gen2", @@ -2552,7 +2555,7 @@ } }, { - "key": "06c4e90b-28b0-402e-a7f0-f2c32ef90a97", + "key": "248415e4-9ae5-4741-9799-9184775c2d31", "commandType": "loadModule", "params": { "model": "magneticModuleV2", @@ -2561,7 +2564,7 @@ } }, { - "key": "64b69b86-de72-447b-a449-e4634465fc18", + "key": "94f5969a-7e98-47bc-aa0b-eea46b0271a8", "commandType": "loadModule", "params": { "model": "temperatureModuleV2", @@ -2570,7 +2573,7 @@ } }, { - "key": "4d3bfc65-5b48-4891-93ba-c2daea854dff", + "key": "2ee5efc8-5c75-4cc6-8bea-0f258478f0af", "commandType": "loadLabware", "params": { "displayName": "Opentrons 96 Tip Rack 300 µL", @@ -2582,7 +2585,7 @@ } }, { - "key": "a1691d39-79db-478b-ad79-ea5efa5525dd", + "key": "352f2e8e-87e1-4658-a86e-153e5307f35c", "commandType": "loadLabware", "params": { "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", @@ -2596,7 +2599,7 @@ } }, { - "key": "e82f5020-dc11-4416-b0f7-cb203164c95f", + "key": "95ee1321-124a-4e78-8b9a-517455c40ab0", "commandType": "loadLabware", "params": { "displayName": "Opentrons 24 Well Aluminum Block with Generic 2 mL Screwcap", @@ -2611,7 +2614,7 @@ }, { "commandType": "loadLiquid", - "key": "b94f1183-3d06-412d-a7e9-3ffa4f81eb19", + "key": "44de4f93-8550-465d-b26b-6a2f95d411c1", "params": { "liquidId": "0", "labwareId": "1e610d40-75c7-11ea-b42f-4b64e50f43e5:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1", @@ -2637,7 +2640,7 @@ }, { "commandType": "magneticModule/engage", - "key": "35c0668c-50af-4f9e-b41e-e91ea746ba66", + "key": "eb54de80-449c-4287-ae26-5fe7cae3fa3a", "params": { "moduleId": "0b419310-75c7-11ea-b42f-4b64e50f43e5:magneticModuleType", "height": 6 @@ -2645,7 +2648,7 @@ }, { "commandType": "temperatureModule/setTargetTemperature", - "key": "23bec5cf-7dcf-4b25-afe1-580505c1f070", + "key": "a0123190-8242-4c09-bb02-6f78d8c5e493", "params": { "moduleId": "0b4319b0-75c7-11ea-b42f-4b64e50f43e5:temperatureModuleType", "celsius": 25 @@ -2653,12 +2656,12 @@ }, { "commandType": "waitForDuration", - "key": "28ddb79a-4ed0-4b44-85be-d73e79eb8546", + "key": "6eb18da1-b4ae-4adc-8384-a06b4c21d898", "params": { "seconds": 62, "message": "" } }, { "commandType": "pickUpTip", - "key": "a6fe1095-05e1-4a7d-8add-c91aaf32d9df", + "key": "ff0fb666-871c-43b8-87d9-9c71fdc0efc9", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "labwareId": "0b44c760-75c7-11ea-b42f-4b64e50f43e5:opentrons/opentrons_96_tiprack_300ul/1", @@ -2667,7 +2670,7 @@ }, { "commandType": "aspirate", - "key": "0f783910-413e-45a0-905d-c246df632cb0", + "key": "398bbf30-90e7-4e50-b630-fb02ddd00160", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 30, @@ -2679,7 +2682,7 @@ }, { "commandType": "dispense", - "key": "dfa9dc2b-ce31-4405-9f1b-8af9bb22ad89", + "key": "0b0ff1c4-0167-4980-b710-794df0799956", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 30, @@ -2691,7 +2694,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "55b9957f-f201-4623-81d1-85bff572008f", + "key": "7c8d4e34-5282-4ee8-bcae-36604b949bde", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "addressableAreaName": "fixedTrash", @@ -2701,12 +2704,12 @@ }, { "commandType": "dropTipInPlace", - "key": "e9745ff2-9404-432f-acb7-0f8400f37821", + "key": "7ba94010-e87e-448b-8535-70ad404a5f19", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5" } }, { "commandType": "pickUpTip", - "key": "9969785e-f71d-4344-9241-c1b2d63845fa", + "key": "ceab71fc-ea60-4cbe-8302-7e38a8d27847", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "labwareId": "0b44c760-75c7-11ea-b42f-4b64e50f43e5:opentrons/opentrons_96_tiprack_300ul/1", @@ -2715,7 +2718,7 @@ }, { "commandType": "aspirate", - "key": "dee64224-7623-4ca2-b5eb-6815b6ccb063", + "key": "eda46364-da03-4582-9998-dd91945f08fc", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 30, @@ -2727,7 +2730,7 @@ }, { "commandType": "dispense", - "key": "785ba9ea-026d-453f-8fb8-63399dc778d6", + "key": "42d98996-7605-4d70-b3be-e6a802022a32", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 30, @@ -2739,7 +2742,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "5fcacbb0-0138-458d-8826-63314d19998e", + "key": "97c7e6ee-b6c5-4708-bc85-e5cba1c93a1b", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "addressableAreaName": "fixedTrash", @@ -2749,12 +2752,12 @@ }, { "commandType": "dropTipInPlace", - "key": "1cf684b0-27e7-48c6-bb66-09ba0acf0630", + "key": "11b30838-4205-4141-9d81-7e2bbde8c7aa", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5" } }, { "commandType": "temperatureModule/waitForTemperature", - "key": "dcaef387-aa66-44b8-9a89-7708303388fb", + "key": "3748a664-b9d8-49fa-9f6b-3ad35eec5c2b", "params": { "moduleId": "0b4319b0-75c7-11ea-b42f-4b64e50f43e5:temperatureModuleType", "celsius": 25 @@ -2762,19 +2765,19 @@ }, { "commandType": "magneticModule/disengage", - "key": "4a1f0937-d118-42ff-bd93-1e56ab961c2e", + "key": "a1c763ef-3712-495f-998b-651566f3e759", "params": { "moduleId": "0b419310-75c7-11ea-b42f-4b64e50f43e5:magneticModuleType" } }, { "commandType": "waitForResume", - "key": "2a974331-df6d-4ca1-be99-9ad706af0845", + "key": "f4c1a79c-d774-4a04-9858-2c58f77c93fd", "params": { "message": "Wait until user intervention" } }, { "commandType": "temperatureModule/deactivate", - "key": "6315be97-809c-4fa1-b4c4-b227c6d26bc5", + "key": "bb2a6fad-2767-45ad-bc5f-bac249004c00", "params": { "moduleId": "0b4319b0-75c7-11ea-b42f-4b64e50f43e5:temperatureModuleType" } diff --git a/protocol-designer/fixtures/protocol/8/doItAllV7MigratedToV8.json b/protocol-designer/fixtures/protocol/8/doItAllV7MigratedToV8.json index 48f284c85af..bddc1313927 100644 --- a/protocol-designer/fixtures/protocol/8/doItAllV7MigratedToV8.json +++ b/protocol-designer/fixtures/protocol/8/doItAllV7MigratedToV8.json @@ -13,9 +13,9 @@ }, "designerApplication": { "name": "opentrons/protocol-designer", - "version": "8.0.2", + "version": "8.1.0", "data": { - "_internalAppBuildDate": "Thu, 21 Mar 2024 18:51:59 GMT", + "_internalAppBuildDate": "Fri, 01 Mar 2024 14:22:27 GMT", "defaultValues": { "aspirate_mmFromBottom": 1, "dispense_mmFromBottom": 0.5, @@ -23,8 +23,12 @@ "blowout_mmFromTop": 0 }, "pipetteTiprackAssignments": { - "2e7c6344-58ab-465c-b542-489883cb63fe": "opentrons/opentrons_flex_96_filtertiprack_50ul/1", - "6d1e53c3-2db3-451b-ad60-3fe13781a193": "opentrons/opentrons_flex_96_filtertiprack_50ul/1" + "2e7c6344-58ab-465c-b542-489883cb63fe": [ + "opentrons/opentrons_flex_96_filtertiprack_50ul/1" + ], + "6d1e53c3-2db3-451b-ad60-3fe13781a193": [ + "opentrons/opentrons_flex_96_filtertiprack_50ul/1" + ] }, "dismissedWarnings": { "form": {}, "timeline": {} }, "ingredients": { @@ -147,6 +151,7 @@ "f9a294f1-f42b-4cae-893a-592405349d56": { "pipette": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": "100", + "tipRack": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", "changeTip": "always", "path": "single", "aspirate_wells_grouped": false, @@ -216,6 +221,7 @@ "mix_touchTip_mmFromBottom": null, "dropTip_location": "4824b094-5999-4549-9e6b-7098a9b30a8b:trashBin", "nozzles": null, + "tipRack": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", "id": "5fdb9a12-fab4-42fd-886f-40af107b15d6", "stepType": "mix", "stepName": "mix", diff --git a/protocol-designer/fixtures/protocol/8/doItAllV8.json b/protocol-designer/fixtures/protocol/8/doItAllV8.json index 9848033ccd0..79c866f5399 100644 --- a/protocol-designer/fixtures/protocol/8/doItAllV8.json +++ b/protocol-designer/fixtures/protocol/8/doItAllV8.json @@ -13,7 +13,7 @@ }, "designerApplication": { "name": "opentrons/protocol-designer", - "version": "8.0.0", + "version": "8.1.0", "data": { "_internalAppBuildDate": "Thu, 21 Mar 2024 18:51:59 GMT", "defaultValues": { @@ -23,7 +23,9 @@ "blowout_mmFromTop": 0 }, "pipetteTiprackAssignments": { - "9fcd50d9-92b2-45ac-acf1-e2cf773feffc": "opentrons/opentrons_flex_96_tiprack_1000ul/1" + "9fcd50d9-92b2-45ac-acf1-e2cf773feffc": [ + "opentrons/opentrons_flex_96_tiprack_1000ul/1" + ] }, "dismissedWarnings": { "form": {}, "timeline": {} }, "ingredients": { @@ -109,6 +111,7 @@ "d2f74144-a7bf-4ba2-aaab-30d70b2b62c7": { "pipette": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": "100", + "tipRack": "f2d371ea-5146-4c89-8200-9c056a7f321a:opentrons/opentrons_flex_96_tiprack_1000ul/1", "changeTip": "always", "path": "single", "aspirate_wells_grouped": false, diff --git a/protocol-designer/fixtures/protocol/8/example_1_1_0MigratedToV8.json b/protocol-designer/fixtures/protocol/8/example_1_1_0MigratedToV8.json index f68ac505577..1beae49e74e 100644 --- a/protocol-designer/fixtures/protocol/8/example_1_1_0MigratedToV8.json +++ b/protocol-designer/fixtures/protocol/8/example_1_1_0MigratedToV8.json @@ -6,16 +6,16 @@ "author": "Author name", "description": "Description here", "created": 1560957631666, - "lastModified": 1702420886806, + "lastModified": 1709309281554, "category": null, "subcategory": null, "tags": [] }, "designerApplication": { "name": "opentrons/protocol-designer", - "version": "8.0.0", + "version": "8.1.0", "data": { - "_internalAppBuildDate": "Tue, 12 Dec 2023 22:33:57 GMT", + "_internalAppBuildDate": "Fri, 01 Mar 2024 16:07:10 GMT", "defaultValues": { "aspirate_mmFromBottom": 1, "dispense_mmFromBottom": 0.5, @@ -23,8 +23,12 @@ "blowout_mmFromTop": 0 }, "pipetteTiprackAssignments": { - "c6f45030-92a5-11e9-ac62-1b173f839d9e": "opentrons/opentrons_96_tiprack_10ul/1", - "c6f47740-92a5-11e9-ac62-1b173f839d9e": "opentrons/tipone_96_tiprack_200ul/1" + "c6f45030-92a5-11e9-ac62-1b173f839d9e": [ + "opentrons/opentrons_96_tiprack_10ul/1" + ], + "c6f47740-92a5-11e9-ac62-1b173f839d9e": [ + "opentrons/tipone_96_tiprack_200ul/1" + ] }, "dismissedWarnings": { "form": {}, "timeline": {} }, "ingredients": { @@ -71,6 +75,7 @@ "e7d36200-92a5-11e9-ac62-1b173f839d9e": { "pipette": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": "6", + "tipRack": "c6f4ec70-92a5-11e9-ac62-1b173f839d9e:tiprack-10ul", "changeTip": "always", "path": "single", "aspirate_wells_grouped": false, @@ -122,11 +127,11 @@ "dispense_delay_seconds": "1", "dispense_delay_mmFromBottom": "0.5", "dropTip_location": "d3181bae-ad9c-4c89-9df2-afb2d4ebc94d:trashBin", + "nozzles": null, "id": "e7d36200-92a5-11e9-ac62-1b173f839d9e", "stepType": "moveLiquid", "stepName": "transfer things", - "stepDetails": "yeah notes", - "nozzles": null + "stepDetails": "yeah notes" }, "18113c80-92a6-11e9-ac62-1b173f839d9e": { "times": 3, @@ -149,11 +154,12 @@ "mix_touchTip_checkbox": true, "mix_touchTip_mmFromBottom": 30.5, "dropTip_location": "d3181bae-ad9c-4c89-9df2-afb2d4ebc94d:trashBin", + "nozzles": null, + "tipRack": "c6f4ec70-92a5-11e9-ac62-1b173f839d9e:tiprack-10ul", "id": "18113c80-92a6-11e9-ac62-1b173f839d9e", "stepType": "mix", "stepName": "mix", - "stepDetails": "", - "nozzles": null + "stepDetails": "" }, "2e622080-92a6-11e9-ac62-1b173f839d9e": { "pauseAction": "untilTime", @@ -3330,7 +3336,7 @@ "commandSchemaId": "opentronsCommandSchemaV8", "commands": [ { - "key": "8a5017ff-3d9d-40bc-8da9-7cc001da70ae", + "key": "da14f3fe-db58-4e04-b97e-9d3edc5ab33e", "commandType": "loadPipette", "params": { "pipetteName": "p10_single", @@ -3339,7 +3345,7 @@ } }, { - "key": "c06d0283-843f-4a57-a359-70c6a0d20b46", + "key": "58ea5ab7-32ea-4923-ae20-e0c91f1d8b3e", "commandType": "loadPipette", "params": { "pipetteName": "p50_single", @@ -3348,7 +3354,7 @@ } }, { - "key": "823bb056-dd22-40aa-9c97-89a2e67fcb82", + "key": "8f8828b7-6a4a-4762-873f-96331ea194ba", "commandType": "loadLabware", "params": { "displayName": "tiprack 10ul (1)", @@ -3360,7 +3366,7 @@ } }, { - "key": "8a771523-8f41-4228-9f62-852de34df87e", + "key": "919d5eab-85ee-4129-89e2-5fcc8419c81a", "commandType": "loadLabware", "params": { "displayName": "tiprack 200ul (1)", @@ -3372,7 +3378,7 @@ } }, { - "key": "a545c357-1414-4500-b01b-16bc8dc87fbb", + "key": "4f7eef41-f93b-4a93-ac00-dd533553390b", "commandType": "loadLabware", "params": { "displayName": "96 deep well (1)", @@ -3385,7 +3391,7 @@ }, { "commandType": "loadLiquid", - "key": "d2ee50ae-0ac8-426a-b6ea-53920cda2dfa", + "key": "9713cecc-3e57-49e8-85cf-5122cdaf00c8", "params": { "liquidId": "1", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", @@ -3394,7 +3400,7 @@ }, { "commandType": "loadLiquid", - "key": "648d0601-7f4b-4163-b9be-a4cdde6bfb84", + "key": "edbcfbc3-e074-4df6-b637-245f3b5f9fb6", "params": { "liquidId": "0", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", @@ -3409,7 +3415,7 @@ }, { "commandType": "pickUpTip", - "key": "7ab2802e-c43f-4e96-9b3d-ba49a6a1b8e8", + "key": "6113c2d3-43ef-4412-9800-7659de75d37a", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "c6f4ec70-92a5-11e9-ac62-1b173f839d9e:tiprack-10ul", @@ -3418,7 +3424,7 @@ }, { "commandType": "aspirate", - "key": "04a5f353-1acf-4c03-bd4e-1fe5d2d1ae11", + "key": "06b603b3-104e-454f-83b8-7a3dbcfac8b4", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -3430,7 +3436,7 @@ }, { "commandType": "dispense", - "key": "20d4997c-f383-4f7e-aca3-962909627e25", + "key": "c77041f4-0e07-46ff-81a4-12c40f7396f6", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -3442,7 +3448,7 @@ }, { "commandType": "aspirate", - "key": "fd3cb8fa-f3f4-45f8-bbe7-3c339df7f5b3", + "key": "56101ed9-70d5-4ce3-8380-0559ddc847df", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -3454,7 +3460,7 @@ }, { "commandType": "dispense", - "key": "155ab6b4-f914-4d6c-9afe-a08f003fd3d3", + "key": "86d596a4-4023-4f56-920a-021924edbcfa", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -3466,7 +3472,7 @@ }, { "commandType": "aspirate", - "key": "c84031a3-268b-4a9e-aee6-5398ef859ac9", + "key": "1f34249b-ed7b-498c-9fc3-e8b1e5254fe4", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -3478,7 +3484,7 @@ }, { "commandType": "dispense", - "key": "e96fc627-3bf2-4c0f-b175-7c0c369b307e", + "key": "18cab41b-1f94-4efe-a931-bbc5a1f4d2e8", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -3490,7 +3496,7 @@ }, { "commandType": "aspirate", - "key": "f7f7467b-6770-46e6-a5db-1ee1aa507257", + "key": "249922dd-6e84-481a-9422-0b1f50a83e7c", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, @@ -3502,7 +3508,7 @@ }, { "commandType": "touchTip", - "key": "e0726ad4-f2d9-4937-8716-5ebc0f170d6b", + "key": "3f553815-ec56-43df-bfe7-4fcaa2c51bb9", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", @@ -3512,7 +3518,7 @@ }, { "commandType": "dispense", - "key": "ac156c8b-ebc1-4dfb-898f-da727250bcdd", + "key": "48a46cfd-1569-4580-be11-f1b919e10528", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, @@ -3524,7 +3530,7 @@ }, { "commandType": "aspirate", - "key": "beffadf0-84ca-4bf3-ac41-ecae89e4fa70", + "key": "5772dac8-ab61-44ac-883b-b4a5d97a7c9a", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -3536,7 +3542,7 @@ }, { "commandType": "dispense", - "key": "71e7266e-3196-4b70-9beb-712b6d409a6a", + "key": "2ec5b554-c0ad-498e-b71a-70985440b4d5", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -3548,7 +3554,7 @@ }, { "commandType": "aspirate", - "key": "4720de85-fc33-41df-89c4-0a2ee850ef11", + "key": "116d9aaa-b681-443e-a949-4f272868d031", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -3560,7 +3566,7 @@ }, { "commandType": "dispense", - "key": "2d698dc7-1a0d-41a0-b79f-99c4848b0fa7", + "key": "02729f1d-ed43-4b0a-9dac-548a5d25b7b2", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -3572,7 +3578,7 @@ }, { "commandType": "touchTip", - "key": "1dbb35fc-f203-4494-b74a-8a52e021c12e", + "key": "9e1d3a6f-a85a-47db-8ea9-85a7426687f8", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", @@ -3582,7 +3588,7 @@ }, { "commandType": "moveToAddressableArea", - "key": "6583abe2-4a73-4d5b-9a12-d041fb6b17a7", + "key": "16e37e6c-72d1-4cc9-8d60-967cf40defe3", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -3591,7 +3597,7 @@ }, { "commandType": "blowOutInPlace", - "key": "c28746a8-655a-44c4-81ed-6b2f08f16dfb", + "key": "7a7c4da7-4f95-49d7-b897-e64febe9879c", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "flowRate": 1000 @@ -3599,7 +3605,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "ede3e340-c0be-4f9a-ba21-8d7f7f37ad2a", + "key": "93068973-6f5a-418c-8dbd-819c23cec732", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -3609,12 +3615,12 @@ }, { "commandType": "dropTipInPlace", - "key": "0164aa78-bccf-4a2f-99b7-cdfe57f40010", + "key": "cbff3df7-e4d5-45c6-88bf-1819361578c2", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e" } }, { "commandType": "pickUpTip", - "key": "4eaeeb54-5696-4266-b6e0-0d1ea4e26871", + "key": "96e12b27-5cf4-4cdc-9d6d-6c7cc8e93796", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "c6f4ec70-92a5-11e9-ac62-1b173f839d9e:tiprack-10ul", @@ -3623,7 +3629,7 @@ }, { "commandType": "aspirate", - "key": "bb5460e8-a6b9-474f-a268-5bb394a1721d", + "key": "d1e6016b-4a1f-4728-acef-99b54b6716cb", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -3635,7 +3641,7 @@ }, { "commandType": "dispense", - "key": "8856a9e7-6930-4ff5-86c1-00f41b33e295", + "key": "0f99777e-a204-4011-8f2c-a991440d57b0", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -3647,7 +3653,7 @@ }, { "commandType": "aspirate", - "key": "595682f5-0dc4-4f01-9f0f-835bc94d55c6", + "key": "03a113dc-1617-48d4-8c9e-6e248a748727", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -3659,7 +3665,7 @@ }, { "commandType": "dispense", - "key": "3774c930-1af0-4f84-8231-9df17f373108", + "key": "f1cb2096-a65d-4d00-9558-3d9d0869d9fe", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -3671,7 +3677,7 @@ }, { "commandType": "aspirate", - "key": "a81dd1c9-d6dc-4ebb-a89e-00c4f7de663d", + "key": "1df11cf1-eea7-4789-a177-41fd33acb76a", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -3683,7 +3689,7 @@ }, { "commandType": "dispense", - "key": "7f00552a-10ae-4a04-9b95-6761de952ce3", + "key": "c432ee2b-ff8a-4eb7-a2da-7d58b5b34567", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -3695,7 +3701,7 @@ }, { "commandType": "aspirate", - "key": "c8405cd2-ff5f-48a7-bc02-7d91f0c13963", + "key": "51bc3818-c02f-4904-b501-e4ca399160d8", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, @@ -3707,7 +3713,7 @@ }, { "commandType": "touchTip", - "key": "9ec0212a-11c0-44b5-a915-e30cadcf6c04", + "key": "b57fbe11-7a9d-4e21-8315-bb6d59d7bfd4", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", @@ -3717,7 +3723,7 @@ }, { "commandType": "dispense", - "key": "3a5a0a9e-016b-415c-8958-834efcfd3eda", + "key": "a91f20ef-4880-4a83-8f84-a6da8bdb4950", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, @@ -3729,7 +3735,7 @@ }, { "commandType": "aspirate", - "key": "02127182-f80f-4f1a-9f40-d03e2273d8c6", + "key": "ff8555b1-e3bb-4678-a90b-f5dd5fc3c513", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -3741,7 +3747,7 @@ }, { "commandType": "dispense", - "key": "8ff7ac50-7b99-4c26-84e0-a4200338a06e", + "key": "27068318-99da-452b-9ee8-5698a998b297", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -3753,7 +3759,7 @@ }, { "commandType": "aspirate", - "key": "0300c67a-2c74-4d58-b174-bd455c88b3e8", + "key": "7eb27547-3200-4030-bebb-f367b887ade4", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -3765,7 +3771,7 @@ }, { "commandType": "dispense", - "key": "c1ea4720-8921-41cc-b822-05133d225537", + "key": "377193a3-3f10-4cda-8ea6-b0f32f211017", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -3777,7 +3783,7 @@ }, { "commandType": "touchTip", - "key": "d71513b7-1265-406d-b6a7-514f3a84533e", + "key": "79e72c26-f013-49ff-bf88-7a3831d9bd91", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", @@ -3787,7 +3793,7 @@ }, { "commandType": "moveToAddressableArea", - "key": "bdf15bfa-b7b4-4c49-bfcf-be5c481a7cf2", + "key": "e61cf837-ec5a-4c04-abee-fcc16e429ca4", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -3796,7 +3802,7 @@ }, { "commandType": "blowOutInPlace", - "key": "00d2c247-580b-4057-a7e8-8b6003bc0573", + "key": "5347bceb-47e7-481e-ba78-a049ff87192b", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "flowRate": 1000 @@ -3804,7 +3810,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "6c316649-29b0-4694-9706-2cc756ccb847", + "key": "d59e503f-f61f-474e-b2b2-daf6880ae0cd", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -3814,12 +3820,12 @@ }, { "commandType": "dropTipInPlace", - "key": "0e5e034f-293c-4261-af84-2a1df0c4a8fc", + "key": "31533601-0084-4abe-b9e2-1628b134cd86", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e" } }, { "commandType": "pickUpTip", - "key": "38fea220-e6a3-40fb-9f3f-38db5116b8cf", + "key": "6d29b61d-1df9-4366-8395-04d0a5286e83", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "c6f4ec70-92a5-11e9-ac62-1b173f839d9e:tiprack-10ul", @@ -3828,7 +3834,7 @@ }, { "commandType": "aspirate", - "key": "a48d3960-2fff-4907-b92c-960c516b00cd", + "key": "32095f51-4943-4c29-96b4-f291bed0f26f", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -3840,7 +3846,7 @@ }, { "commandType": "dispense", - "key": "e4edd205-13d8-48e8-9f8d-ef466c1ef340", + "key": "c144dd6b-1dd0-4e9c-a170-09f948d0d6b5", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -3852,7 +3858,7 @@ }, { "commandType": "aspirate", - "key": "162a3d80-adea-4be9-84ba-946529ce2981", + "key": "0c94efb7-d072-4d76-a9d9-2a2b2d79a5e1", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -3864,7 +3870,7 @@ }, { "commandType": "dispense", - "key": "fce4825f-197c-46fb-a4c9-f19ba8fb2b79", + "key": "00390b97-a020-4cf8-afe5-e09556ff5b8b", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -3876,7 +3882,7 @@ }, { "commandType": "aspirate", - "key": "8bd9f57c-a482-4249-b10d-3524f0b47edf", + "key": "15509964-d974-41b5-979c-299295b3ea38", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -3888,7 +3894,7 @@ }, { "commandType": "dispense", - "key": "f53ef1a8-6ccd-4582-8111-1b4ce38a3b15", + "key": "0eb459c1-44e4-4bcc-8089-220e81e81b6d", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -3900,7 +3906,7 @@ }, { "commandType": "aspirate", - "key": "7d03b172-e11c-4bc5-8382-17e03eece228", + "key": "9c736eea-7d18-486c-98f0-377641a33f4d", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, @@ -3912,7 +3918,7 @@ }, { "commandType": "touchTip", - "key": "f107d91d-631f-47b1-8203-b0a760d480cc", + "key": "9a209558-3ee7-4922-a173-c897a79679c3", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", @@ -3922,7 +3928,7 @@ }, { "commandType": "dispense", - "key": "07bc6f53-7102-424c-bc19-7a9cda718636", + "key": "7bf46386-39b4-4a31-82a8-f6433ea11856", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, @@ -3934,7 +3940,7 @@ }, { "commandType": "aspirate", - "key": "a49e7fa4-272b-44ff-ae4a-5bcc6cc874a2", + "key": "3ae51fed-c35f-4a45-843e-b17cfba906e3", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -3946,7 +3952,7 @@ }, { "commandType": "dispense", - "key": "d1c24777-1e22-4c63-a983-63f4cf20a00e", + "key": "eec16e92-d503-4e00-ba67-4f0d0a8ebac1", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -3958,7 +3964,7 @@ }, { "commandType": "aspirate", - "key": "078a0fb2-8011-4dfe-aeb9-d6f439e090c7", + "key": "48546952-3edc-4410-a5ef-fe0689a2780a", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -3970,7 +3976,7 @@ }, { "commandType": "dispense", - "key": "6ef5d63d-1d11-4446-91dd-affbd4c6d602", + "key": "4b9a4e01-514c-4677-b143-08709ac99a6f", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -3982,7 +3988,7 @@ }, { "commandType": "touchTip", - "key": "1cf1e65d-2b5f-425d-9a7c-47349e6cde6d", + "key": "20eb9f79-6e87-4cf7-b0dd-32c19ad43337", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", @@ -3992,7 +3998,7 @@ }, { "commandType": "moveToAddressableArea", - "key": "eac841f3-535c-4a3b-881a-bf0c1da71804", + "key": "dc0e2e7a-b286-483b-80c6-5a6a654013bf", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -4001,7 +4007,7 @@ }, { "commandType": "blowOutInPlace", - "key": "b95637fc-ea1e-4672-baad-0634cf051fea", + "key": "3a789643-0839-492b-a4c8-30a14db14c16", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "flowRate": 1000 @@ -4009,7 +4015,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "87214aed-1d42-41f0-9136-084ff7573ea6", + "key": "11d69a61-0591-4f42-88af-3c74e7da0475", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -4019,12 +4025,12 @@ }, { "commandType": "dropTipInPlace", - "key": "df138c35-ce81-4ecb-a034-0363e2ecaa06", + "key": "ee65d091-f308-420b-9db9-fbcd28d17f4e", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e" } }, { "commandType": "pickUpTip", - "key": "c75fef6e-72d6-4736-ad4c-7c327996dab3", + "key": "995d9fa9-55eb-4fa4-b6de-0131a0402975", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "c6f4ec70-92a5-11e9-ac62-1b173f839d9e:tiprack-10ul", @@ -4033,7 +4039,7 @@ }, { "commandType": "aspirate", - "key": "6ada10ba-5848-4e7c-a64b-e9fe1b182f11", + "key": "aa4c8295-708f-4a5b-b879-505fb559032c", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4045,7 +4051,7 @@ }, { "commandType": "dispense", - "key": "474b146d-07ad-4f4f-8de1-f13ef66ce4b7", + "key": "5d947f6d-15d8-4918-a96c-38aa1198232c", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4057,7 +4063,7 @@ }, { "commandType": "aspirate", - "key": "f7d80622-a7c3-4c03-b2fd-e26b9bc76a87", + "key": "0c8ac8ba-5067-49c1-9d5b-172acf744fe5", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4069,7 +4075,7 @@ }, { "commandType": "dispense", - "key": "51d1d581-456d-499c-a193-b59d15659972", + "key": "a72962af-a3e9-43cd-9c47-7f01b32e9ab0", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4081,7 +4087,7 @@ }, { "commandType": "aspirate", - "key": "49c03c8e-87a5-4142-9da8-a7a1cc764652", + "key": "16815e9f-6894-401b-8f7c-034faa7a92a8", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4093,7 +4099,7 @@ }, { "commandType": "dispense", - "key": "30f3e786-5297-43b7-ab49-05e3502bbeb7", + "key": "e82647e5-24cc-48cf-ac77-b832a4473f5f", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4105,7 +4111,7 @@ }, { "commandType": "aspirate", - "key": "08e4ad34-4cd3-44c5-8ba5-a7312bff62a3", + "key": "b68ec85a-84c2-4e38-98c5-eb1417959b8c", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, @@ -4117,7 +4123,7 @@ }, { "commandType": "touchTip", - "key": "a696c4db-3cd7-4a8e-a511-4606ce66bef8", + "key": "4daf45f1-1952-444e-a702-c951cd34171d", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", @@ -4127,7 +4133,7 @@ }, { "commandType": "dispense", - "key": "18d8144f-26fe-43d3-89c3-00ac2aa4e1c7", + "key": "7fd7054a-5321-47cb-b32e-0b6f6be27269", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, @@ -4139,7 +4145,7 @@ }, { "commandType": "aspirate", - "key": "6c4f2e1a-258f-411c-abf6-01993eac25ea", + "key": "c58c6f6d-89e9-4b89-a5a4-b4fbb5df01e7", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -4151,7 +4157,7 @@ }, { "commandType": "dispense", - "key": "7fefb015-56f5-4210-97df-60615e2ec930", + "key": "d534677b-d743-463e-a3d5-9e665d8c42ee", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -4163,7 +4169,7 @@ }, { "commandType": "aspirate", - "key": "2e1eb15e-69ab-4f7f-8d21-c90c2e9dbd5f", + "key": "a521c336-3377-4474-8ef5-0fe5bcfb9856", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -4175,7 +4181,7 @@ }, { "commandType": "dispense", - "key": "e9f7494c-21a8-424c-8631-de074b0a131e", + "key": "b6eff799-e266-4972-8b74-87acd8ae4b20", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -4187,7 +4193,7 @@ }, { "commandType": "touchTip", - "key": "c2096059-1c60-4cad-924e-f6cd2aa1a539", + "key": "81fe26dd-f249-45f8-81b6-ffe8df296ef3", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", @@ -4197,7 +4203,7 @@ }, { "commandType": "moveToAddressableArea", - "key": "06b64153-3e22-4e2c-931e-423b0a452e86", + "key": "aacbe8ea-f7e7-46ad-bc9a-80e982202e71", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -4206,7 +4212,7 @@ }, { "commandType": "blowOutInPlace", - "key": "f3e31686-b015-45fe-a3b2-07e1e843c191", + "key": "c4e0ef3e-1e4e-463d-a821-8c4864eb4f0e", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "flowRate": 1000 @@ -4214,7 +4220,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "59785ed5-18a8-4fbc-80e0-6459b1a5c9be", + "key": "c3aff53f-c4b4-460d-aca6-e45d8dfb7fd5", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -4224,12 +4230,12 @@ }, { "commandType": "dropTipInPlace", - "key": "3b9ba522-a0a1-4313-b5e4-4b8177042416", + "key": "e779958f-851f-4276-82f6-18879c620bf4", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e" } }, { "commandType": "pickUpTip", - "key": "b941a590-dae3-4cdc-b296-001459a944aa", + "key": "e96e028f-f470-42f4-a1b8-9e155d575fcc", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "c6f4ec70-92a5-11e9-ac62-1b173f839d9e:tiprack-10ul", @@ -4238,7 +4244,7 @@ }, { "commandType": "aspirate", - "key": "dee205e0-ab8e-4376-a76b-d73a18cd8e04", + "key": "1815c794-0370-4460-9a03-fbae6c084404", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4250,7 +4256,7 @@ }, { "commandType": "dispense", - "key": "8ca850ae-6d53-4190-a890-53e692ec25eb", + "key": "1c12be09-a4f5-4844-8fd5-957ceefb2404", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4262,7 +4268,7 @@ }, { "commandType": "aspirate", - "key": "4222a402-63f4-4cd7-b765-372e429d20c5", + "key": "89c92dde-3580-4d90-b7ab-48906a3595b6", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4274,7 +4280,7 @@ }, { "commandType": "dispense", - "key": "9d644a34-5e72-4a4e-8e96-1238c4ab030c", + "key": "981553e8-1c52-4612-bd66-ee532c4a027f", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4286,7 +4292,7 @@ }, { "commandType": "aspirate", - "key": "af6bcd27-f5cc-4581-8f77-008fc8073063", + "key": "dff7548c-c2ae-48fc-8fb4-33a96f2578d0", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4298,7 +4304,7 @@ }, { "commandType": "dispense", - "key": "d97f31c0-065d-4ed8-849a-9e01d0c54851", + "key": "cf1c3f7f-ad9f-453e-ba12-d1be98e49699", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4310,7 +4316,7 @@ }, { "commandType": "aspirate", - "key": "d42635e6-7442-4c75-954e-69052abeb2a6", + "key": "12bf910d-0bde-4a4c-b613-437e873a4078", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, @@ -4322,7 +4328,7 @@ }, { "commandType": "touchTip", - "key": "8e8acb49-0d4d-4ab6-b017-7b869283978f", + "key": "3afb66c3-10ee-437f-b6d4-3bf8783ce9cc", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", @@ -4332,7 +4338,7 @@ }, { "commandType": "dispense", - "key": "4369b1ff-9c64-4f83-878e-1998f4af8481", + "key": "d66cf63b-f856-4293-9140-0b9d0df28f61", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, @@ -4344,7 +4350,7 @@ }, { "commandType": "aspirate", - "key": "bc4d8592-e976-406f-a999-daf8fd260c74", + "key": "b7e62341-466a-4089-96dd-3e33ab8abfac", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -4356,7 +4362,7 @@ }, { "commandType": "dispense", - "key": "228405d7-f1ca-43a9-bdfe-99f106dbd82e", + "key": "706802e5-ecfa-4db8-817f-4cda1d3461fe", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -4368,7 +4374,7 @@ }, { "commandType": "aspirate", - "key": "a458cb13-c923-4969-83b8-2d1157dd5fea", + "key": "fc706917-6d88-4d15-a8dc-f8e533470099", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -4380,7 +4386,7 @@ }, { "commandType": "dispense", - "key": "a9936388-e44c-4f55-ae4a-86ad82811871", + "key": "0c8589ba-0894-4df5-8927-48572ff6c401", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -4392,7 +4398,7 @@ }, { "commandType": "touchTip", - "key": "a9bdca6e-537d-440a-9e64-fdd81cf00b8b", + "key": "00d269b5-7481-4c43-b054-c57e3fbfe605", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", @@ -4402,7 +4408,7 @@ }, { "commandType": "moveToAddressableArea", - "key": "63a25e89-92e8-4229-9b06-e777a0cd8c46", + "key": "e15167b0-1b6c-40cb-bafb-1be42e155529", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -4411,7 +4417,7 @@ }, { "commandType": "blowOutInPlace", - "key": "9488a452-ed46-4c22-b547-15fd9ccaa8fb", + "key": "8ff90ef0-42a8-4300-b1d3-cc894e476029", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "flowRate": 1000 @@ -4419,7 +4425,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "7c5f8dfe-8b59-4b49-bd41-6aafbb340f9a", + "key": "021423f6-e2ed-40ee-8305-7da59c111dc0", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -4429,12 +4435,12 @@ }, { "commandType": "dropTipInPlace", - "key": "56cab34a-a9e5-4226-b443-74d0ee8e0aa6", + "key": "c3883abe-ef2d-42a7-9eb5-a32f7d81ca28", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e" } }, { "commandType": "pickUpTip", - "key": "cee54c07-b439-40e2-ac71-79792b48945d", + "key": "787b0eb7-866d-4230-8932-5683d2db4143", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "c6f4ec70-92a5-11e9-ac62-1b173f839d9e:tiprack-10ul", @@ -4443,7 +4449,7 @@ }, { "commandType": "aspirate", - "key": "f046537f-4d29-4063-a606-17579ac61077", + "key": "d037b353-7b41-4311-a36f-f1aab11d6ac8", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4455,7 +4461,7 @@ }, { "commandType": "dispense", - "key": "9b68f929-c15b-4a37-b4d7-c7a07fd884af", + "key": "10363067-39c5-42b0-a620-3ee6a2774a9b", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4467,7 +4473,7 @@ }, { "commandType": "aspirate", - "key": "a33c0463-1af8-461e-a377-0dc70ffab9d0", + "key": "15eb4102-e34c-4d6e-916f-42ce00375aa7", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4479,7 +4485,7 @@ }, { "commandType": "dispense", - "key": "98a6d812-787a-4ec9-9a0b-dd38addf29e5", + "key": "46711650-9279-4031-b5ea-c0820a32d961", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4491,7 +4497,7 @@ }, { "commandType": "aspirate", - "key": "79e811eb-bf32-4c64-a3f8-7df26b4588a8", + "key": "9e34e43e-89da-4b7e-be2e-a6042b3ef954", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4503,7 +4509,7 @@ }, { "commandType": "dispense", - "key": "2b6bfed8-40e9-4482-9abc-552b2746ae15", + "key": "8114f067-59e2-4011-82da-08c8d2f9aa68", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4515,7 +4521,7 @@ }, { "commandType": "aspirate", - "key": "9a6720d7-5652-4de9-bd38-743e09a91055", + "key": "716278f3-86c2-46c8-96a9-ab31e9b8a8f2", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, @@ -4527,7 +4533,7 @@ }, { "commandType": "touchTip", - "key": "c6745866-efce-4dba-aa02-859cce491a74", + "key": "165b08fc-9663-4e9c-b49f-194a81ba56c4", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", @@ -4537,7 +4543,7 @@ }, { "commandType": "dispense", - "key": "448965ec-be9b-4c1a-9604-373c6d96ce87", + "key": "61113794-7f55-4925-94e4-6ac1e9d0b5c0", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, @@ -4549,7 +4555,7 @@ }, { "commandType": "aspirate", - "key": "00788ffd-cec9-402c-9938-64aeb249cc1b", + "key": "3195d674-6f23-41e7-968f-5978f4423b11", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -4561,7 +4567,7 @@ }, { "commandType": "dispense", - "key": "0eea4043-b8e3-4efc-aa46-223baa5e7205", + "key": "7e2df534-36d9-4c78-8cff-9894b305aa56", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -4573,7 +4579,7 @@ }, { "commandType": "aspirate", - "key": "b41527ee-74c7-4aff-ac2f-9a1d1dec2744", + "key": "2f1d06ba-9586-4e14-8ab7-5747aa14d47c", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -4585,7 +4591,7 @@ }, { "commandType": "dispense", - "key": "4c27c00d-c180-47e4-88a5-3311377018de", + "key": "5358b164-56c2-4042-a8b8-1645e3f8c0c9", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -4597,7 +4603,7 @@ }, { "commandType": "touchTip", - "key": "0fb52dda-222a-49b5-bb75-9b43c1f86b9c", + "key": "2643cf2a-5373-43bd-bd37-dd1e62c4c548", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", @@ -4607,7 +4613,7 @@ }, { "commandType": "moveToAddressableArea", - "key": "136b3f98-79fd-45f0-8c57-6f255e494539", + "key": "97fc08d9-59ee-46ee-99d5-20e33acbb2f2", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -4616,7 +4622,7 @@ }, { "commandType": "blowOutInPlace", - "key": "8f2fe539-a9c9-466e-97be-99a6e356f112", + "key": "4f2e4f39-dea7-444f-b6d5-e7cfd6c1bcb2", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "flowRate": 1000 @@ -4624,7 +4630,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "22297bfb-df80-45d4-a829-02a352c4e016", + "key": "252afdc4-bebe-47fb-ad4f-e10766436a23", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -4634,12 +4640,12 @@ }, { "commandType": "dropTipInPlace", - "key": "abd37ed7-c6d8-46ac-93c1-0f6b8b0bbe7f", + "key": "7a36277b-7c2a-401f-8802-2af031444e22", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e" } }, { "commandType": "pickUpTip", - "key": "6aeb689a-ffe8-4953-80d7-9319746e3b6f", + "key": "e5e61410-a679-4caf-94d0-1234a7337bcc", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "c6f4ec70-92a5-11e9-ac62-1b173f839d9e:tiprack-10ul", @@ -4648,7 +4654,7 @@ }, { "commandType": "aspirate", - "key": "9f0f99a3-02fc-414b-af8a-4052051c683b", + "key": "231f4239-1e72-4f15-b393-5103d62197a8", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4660,7 +4666,7 @@ }, { "commandType": "dispense", - "key": "7d45702f-e936-4fdb-87a7-75b9fac5e0c8", + "key": "91f9fd1e-7690-4ba3-aa5b-24bfadde94f3", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4672,7 +4678,7 @@ }, { "commandType": "aspirate", - "key": "a0d4f793-3f6b-42bd-953a-237426dd76be", + "key": "d329cf02-bb5a-441b-9433-b6ed36e4b16a", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4684,7 +4690,7 @@ }, { "commandType": "dispense", - "key": "1bf809e1-3d07-423c-8881-790e6c48845e", + "key": "61c6428b-d0ad-4aa1-8fba-0983fac42a1e", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4696,7 +4702,7 @@ }, { "commandType": "aspirate", - "key": "9eb4fa89-81de-4d80-9951-7b4db1c52e4a", + "key": "f022bc59-c825-444d-bf31-dbc784e657ba", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4708,7 +4714,7 @@ }, { "commandType": "dispense", - "key": "76bd281b-143f-401c-874e-12cf6bc20e1d", + "key": "b99963d8-d11e-4d4b-bbfe-7d1dd46a385f", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4720,7 +4726,7 @@ }, { "commandType": "aspirate", - "key": "0167ffe4-1a6c-4f78-a77d-24cee795f149", + "key": "032ce0d1-c61e-4a49-bcd6-e05715ea01a1", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, @@ -4732,7 +4738,7 @@ }, { "commandType": "touchTip", - "key": "adbdb732-cc84-4ffd-b3e2-be58d720f69d", + "key": "f507c53d-b959-4d2a-88a4-3d760ec0d5a4", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", @@ -4742,7 +4748,7 @@ }, { "commandType": "dispense", - "key": "c34cd6c5-c0b1-4d64-93ef-6afa02effc6c", + "key": "c4768870-6ea0-47d5-bd01-821f76484851", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, @@ -4754,7 +4760,7 @@ }, { "commandType": "aspirate", - "key": "4bfa62eb-0ebd-4d64-b16f-77ae04d4209c", + "key": "5f0ceccf-c18b-4d38-a67d-227de289baa3", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -4766,7 +4772,7 @@ }, { "commandType": "dispense", - "key": "79e45879-f17f-4f3c-acf2-67b88c422bb4", + "key": "eb34a3a3-2163-4780-a3f9-0c2c27b266fd", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -4778,7 +4784,7 @@ }, { "commandType": "aspirate", - "key": "5c0afb61-5567-47c8-beae-8c39700229d3", + "key": "aa5b4672-0f67-4f1f-af47-f40cf91dc2a6", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -4790,7 +4796,7 @@ }, { "commandType": "dispense", - "key": "8d228faf-b364-4f83-bb24-08ce7fa7cdd2", + "key": "55640978-689e-46d6-8d5f-10ba8e970d00", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -4802,7 +4808,7 @@ }, { "commandType": "touchTip", - "key": "70a33302-1203-41ba-be85-fbede9a011d4", + "key": "213949a7-feed-4fe0-95bb-57495a558334", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", @@ -4812,7 +4818,7 @@ }, { "commandType": "moveToAddressableArea", - "key": "6f94e6e7-f1dd-4941-b797-a6b9c6e60ca3", + "key": "32e64358-369f-4a0f-b7f7-cdac58b9e1a6", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -4821,7 +4827,7 @@ }, { "commandType": "blowOutInPlace", - "key": "1dc029a7-7df6-4d63-9961-5ce081b5d8d0", + "key": "d4358e84-b66b-4f58-917c-87ebf2f804cb", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "flowRate": 1000 @@ -4829,7 +4835,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "a727358b-bbb1-4951-9e82-ec52fed471d7", + "key": "d6bcd44a-459c-40f5-b48b-7f66c056f593", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -4839,12 +4845,12 @@ }, { "commandType": "dropTipInPlace", - "key": "abd37ed7-c6d8-46ac-93c1-0f6b8b0bbe7f", + "key": "afef5a4a-3808-4f78-a62d-daef9b85293f", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e" } }, { "commandType": "pickUpTip", - "key": "b7f37a99-be1d-4da9-bce2-d2b686240fab", + "key": "1fee685b-03b1-4a68-88bf-746d83c1f734", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "c6f4ec70-92a5-11e9-ac62-1b173f839d9e:tiprack-10ul", @@ -4853,7 +4859,7 @@ }, { "commandType": "aspirate", - "key": "5e2de5fb-a2b0-460a-8bd9-ee3f0b66df5c", + "key": "c4ef2258-e356-463a-9f47-50288c93896b", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4865,7 +4871,7 @@ }, { "commandType": "dispense", - "key": "0f9edeba-a43d-4708-9ef0-7f08c69c5f81", + "key": "3645a8be-8872-47af-9a30-07afcb9ae234", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4877,7 +4883,7 @@ }, { "commandType": "aspirate", - "key": "f4610ae4-de91-45fe-9725-97fefccf520f", + "key": "02580ed2-f298-4da2-9ccb-e751d09f3015", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4889,7 +4895,7 @@ }, { "commandType": "dispense", - "key": "c29cf339-c786-4490-9fff-ab63aba116d5", + "key": "988739b0-1ff9-4c51-9d5e-86abaeaf7f09", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4901,7 +4907,7 @@ }, { "commandType": "aspirate", - "key": "10acb30b-5f4e-4525-a865-68e2ab28b98e", + "key": "62e7e213-b5b3-40fb-b3aa-a13d035e44f1", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4913,7 +4919,7 @@ }, { "commandType": "dispense", - "key": "4b25a72c-4945-41c3-b56d-c165440d3160", + "key": "97b34c42-511a-4d68-afee-09c493088796", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -4925,7 +4931,7 @@ }, { "commandType": "aspirate", - "key": "ec3731b2-2940-495e-95c7-e981e18f4de1", + "key": "01ea3e16-49c4-4c23-9123-7f1ade690342", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, @@ -4937,7 +4943,7 @@ }, { "commandType": "touchTip", - "key": "1f5d822e-3b09-4fd2-895c-52e60b2f4628", + "key": "fe523115-3e72-4623-81eb-414836ec000b", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", @@ -4947,7 +4953,7 @@ }, { "commandType": "dispense", - "key": "52cc8d2d-520c-46b3-ad69-90fb5820420d", + "key": "134b1437-05ae-4c9c-ba9e-3a8e87b1b2f3", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, @@ -4959,7 +4965,7 @@ }, { "commandType": "aspirate", - "key": "fda98276-418d-4f03-862f-aaa06b70050c", + "key": "d6167e35-ef8c-4b1a-800f-240c30ac60af", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -4971,7 +4977,7 @@ }, { "commandType": "dispense", - "key": "9073aa58-1f0b-40bf-90db-3bae20507164", + "key": "94d06fc3-2155-423d-bbbe-2702134d0b66", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -4983,7 +4989,7 @@ }, { "commandType": "aspirate", - "key": "2f82c9b5-f897-4b4b-8b46-179abe9246b3", + "key": "a8f19aa5-d7f1-4a3e-9647-1b552cfc39aa", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -4995,7 +5001,7 @@ }, { "commandType": "dispense", - "key": "9fece961-4731-44bd-b9f2-57bc3265cfa0", + "key": "06b8e0be-cc31-46f9-8e82-02b25241bf9b", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -5007,7 +5013,7 @@ }, { "commandType": "touchTip", - "key": "d7796560-c40c-490d-bd29-7e2091a5d6d2", + "key": "e3ed68db-2b25-4ae1-802c-5b4a41f7ee68", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", @@ -5017,7 +5023,7 @@ }, { "commandType": "moveToAddressableArea", - "key": "420781de-6fa1-4bbc-a9d6-72d95f9c4090", + "key": "63cea2eb-fde2-4bca-976e-30df41c074b7", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -5026,7 +5032,7 @@ }, { "commandType": "blowOutInPlace", - "key": "6622c244-4cd4-44de-ab39-77997b69b467", + "key": "24f20d09-4f31-4745-9c13-56294033a7cd", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "flowRate": 1000 @@ -5034,7 +5040,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "a8b37743-eaa1-44e7-af9b-ba0350d652b3", + "key": "ccc5d7fe-9806-484e-b4a4-d9bb456e7c04", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -5044,12 +5050,12 @@ }, { "commandType": "dropTipInPlace", - "key": "09827fd5-e988-45a6-874c-95a35eec10e6", + "key": "9837b26a-92cb-4b2c-928a-09f96213ba44", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e" } }, { "commandType": "pickUpTip", - "key": "c9689672-a40e-4138-82d7-27e6ff4e480c", + "key": "f962386f-842e-454f-ade8-0ef08bbcbd43", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "c6f4ec70-92a5-11e9-ac62-1b173f839d9e:tiprack-10ul", @@ -5058,7 +5064,7 @@ }, { "commandType": "aspirate", - "key": "3d26565d-7a57-4390-b866-523cec9d700d", + "key": "af9c739b-acf9-4db3-ba58-b34a0d90c70e", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -5070,7 +5076,7 @@ }, { "commandType": "dispense", - "key": "541c627a-ce8b-422b-bcde-412a95a27036", + "key": "f872765c-27c0-4507-90f3-4259560ca9a4", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -5082,7 +5088,7 @@ }, { "commandType": "aspirate", - "key": "2c997510-9ba9-4532-85de-9cf1b4c7122f", + "key": "f3025d61-4322-463e-83ec-e47182b2725d", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -5094,7 +5100,7 @@ }, { "commandType": "dispense", - "key": "245d9cbf-7a74-45c5-8ce4-e9fd912d9929", + "key": "7611a735-e1c2-4cc1-82c2-053c63c6ab10", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -5106,7 +5112,7 @@ }, { "commandType": "aspirate", - "key": "cbffa2f1-bb32-4cd8-8153-314ff06a51c0", + "key": "a3074ec0-f736-4837-99d4-3b37f0a7ee22", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -5118,7 +5124,7 @@ }, { "commandType": "dispense", - "key": "e8abcdb6-8d3a-4938-a726-7868987b4107", + "key": "f043597b-a221-4670-9ced-5bda15cd7c4e", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, @@ -5130,7 +5136,7 @@ }, { "commandType": "aspirate", - "key": "feafc3ee-2edd-4b02-bd61-f32987c238fe", + "key": "d02ca9b9-43ef-4826-af1b-5b2f1b668378", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, @@ -5142,7 +5148,7 @@ }, { "commandType": "touchTip", - "key": "2588a2de-a900-4c7a-83c4-4c475c744b31", + "key": "b16f9a78-8c9a-4701-8ce9-a68d549705ff", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", @@ -5152,7 +5158,7 @@ }, { "commandType": "dispense", - "key": "8c7a4eff-77ee-43fd-a609-a953f7676cdc", + "key": "27208993-c49c-4ed2-a58f-fd1c9726da35", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, @@ -5164,7 +5170,7 @@ }, { "commandType": "aspirate", - "key": "d629cecd-8573-4d66-8385-4f578d718b78", + "key": "4e6d7f1b-bf01-4dc8-9804-db5891de458d", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -5176,7 +5182,7 @@ }, { "commandType": "dispense", - "key": "264e5433-9833-4879-bc5b-a09282fccc30", + "key": "0f2634c6-4557-4f70-aeab-aa557d43d63e", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -5188,7 +5194,7 @@ }, { "commandType": "aspirate", - "key": "888cb973-7dcd-41f2-94c8-3e1d5c806b74", + "key": "8df3e7e6-c44f-48d8-98cd-49ae2bdceb74", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -5200,7 +5206,7 @@ }, { "commandType": "dispense", - "key": "cb9614b0-7baf-4822-97ef-403ee7b038b1", + "key": "4cead8f3-508b-49fc-843c-47708304ac93", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, @@ -5212,7 +5218,7 @@ }, { "commandType": "touchTip", - "key": "b0eb403f-8577-44ae-bcf3-6d9259ded116", + "key": "edb37370-7199-459b-a925-17ed47861588", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", @@ -5222,7 +5228,7 @@ }, { "commandType": "moveToAddressableArea", - "key": "2a360da1-a580-4350-a224-1d5ef43636b0", + "key": "7005887b-2511-4f79-aeb3-855150844387", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -5231,7 +5237,7 @@ }, { "commandType": "blowOutInPlace", - "key": "a2729301-e561-41a2-abd7-68b73c6e735d", + "key": "2aeaea31-84e5-4b17-a085-d3eb62c3e89e", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "flowRate": 1000 @@ -5239,7 +5245,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "26ac1bdb-73a4-4d08-9798-be5b6fa88595", + "key": "39262fc1-a0f9-4155-9db8-0628b2e013b7", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -5249,12 +5255,12 @@ }, { "commandType": "dropTipInPlace", - "key": "322a1d13-dde1-4d05-8562-f152bbf78f27", + "key": "4653d001-f682-415e-ae31-c70dca6ce4f7", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e" } }, { "commandType": "pickUpTip", - "key": "d976581b-71a5-460f-b2e0-799777d6ea94", + "key": "686a2200-9d23-4a25-bdb7-fd9a32d1c9ac", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "c6f4ec70-92a5-11e9-ac62-1b173f839d9e:tiprack-10ul", @@ -5263,7 +5269,7 @@ }, { "commandType": "aspirate", - "key": "c477a487-4eb4-4b26-adb7-e494e4681426", + "key": "b9112647-1963-4a42-9d9f-3294d3962fbe", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 5.5, @@ -5275,7 +5281,7 @@ }, { "commandType": "dispense", - "key": "616055c7-143b-4815-98f0-af1c9c85b04d", + "key": "1131307b-8c81-45b6-9395-b1b7f5568708", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 5.5, @@ -5287,7 +5293,7 @@ }, { "commandType": "aspirate", - "key": "96c9db95-0370-4d07-b985-f9dfe2cb1c2d", + "key": "baa2f965-8f3d-41ff-a124-a045a975a9d8", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 5.5, @@ -5299,7 +5305,7 @@ }, { "commandType": "dispense", - "key": "2b751530-273d-4088-9594-f255d998f740", + "key": "ee62e490-95d0-45b5-9e8a-1d810de9759e", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 5.5, @@ -5311,7 +5317,7 @@ }, { "commandType": "aspirate", - "key": "b37a61c5-dfc3-4eb3-af25-33d4b96a784b", + "key": "75129558-a345-4881-95ef-2989836e833d", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 5.5, @@ -5323,7 +5329,7 @@ }, { "commandType": "dispense", - "key": "ca8af3e6-51d4-4784-b907-3d2e9b80a6b6", + "key": "fe55ef54-d044-44cf-890d-6990f8c2c546", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 5.5, @@ -5335,7 +5341,7 @@ }, { "commandType": "blowout", - "key": "2fbc44e6-a0fb-45bb-88fe-3d6ffef522b6", + "key": "ef6a39e5-1820-498e-82ef-1ccf5f8bf183", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", @@ -5346,7 +5352,7 @@ }, { "commandType": "touchTip", - "key": "259ae357-020b-4af5-82df-0e42f13bb6a5", + "key": "c6189400-48b1-42ce-9071-6521503ad70e", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", @@ -5356,7 +5362,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "0323f610-aad8-4abe-b5cb-3b73fd299869", + "key": "a3327fbf-7028-4a4b-adae-90a79f19dcfe", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -5366,12 +5372,12 @@ }, { "commandType": "dropTipInPlace", - "key": "b4edbf18-d092-4668-b18a-99e13e7c7ce2", + "key": "5706a987-1067-4a6f-b0d2-72e4e2efd853", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e" } }, { "commandType": "waitForDuration", - "key": "6afbcb5c-9da8-4028-9413-2d93d48f7eb8", + "key": "3e17b047-d94f-4476-a51d-5a50b40bf65b", "params": { "seconds": 3723, "message": "Delay plz" } } ], diff --git a/protocol-designer/fixtures/protocol/8/mix_8_0_0.json b/protocol-designer/fixtures/protocol/8/mix_8_0_0.json index febf218a0e6..0cf5bc6679f 100644 --- a/protocol-designer/fixtures/protocol/8/mix_8_0_0.json +++ b/protocol-designer/fixtures/protocol/8/mix_8_0_0.json @@ -6,16 +6,16 @@ "author": "", "description": "A test for 5.0.0 -> 5.1.0 migration", "created": 1600714068238, - "lastModified": 1701367385250, + "lastModified": 1709303322125, "category": null, "subcategory": null, "tags": [] }, "designerApplication": { "name": "opentrons/protocol-designer", - "version": "8.0.0", + "version": "8.1.0", "data": { - "_internalAppBuildDate": "Thu, 30 Nov 2023 17:58:01 GMT", + "_internalAppBuildDate": "Fri, 01 Mar 2024 14:22:27 GMT", "defaultValues": { "aspirate_mmFromBottom": 1, "dispense_mmFromBottom": 0.5, @@ -23,7 +23,7 @@ "blowout_mmFromTop": 0 }, "pipetteTiprackAssignments": { - "pipetteId": "opentrons/opentrons_96_tiprack_10ul/1" + "pipetteId": ["opentrons/opentrons_96_tiprack_10ul/1"] }, "dismissedWarnings": { "form": {}, "timeline": {} }, "ingredients": {}, @@ -73,11 +73,12 @@ "mix_touchTip_checkbox": false, "mix_touchTip_mmFromBottom": null, "dropTip_location": "5ba7047d-d3e2-4845-9eaa-1974af796ead:trashBin", + "nozzles": null, + "tipRack": "f1c677c0-fc3a-11ea-8809-e959e7d61d96:opentrons/opentrons_96_tiprack_10ul/1", "id": "fc4dc7c0-fc3a-11ea-8809-e959e7d61d96", "stepType": "mix", "stepName": "mix", - "stepDetails": "", - "nozzles": null + "stepDetails": "" } }, "orderedStepIds": [ @@ -2124,7 +2125,7 @@ "commandSchemaId": "opentronsCommandSchemaV8", "commands": [ { - "key": "b96482a6-a37b-4ac1-85ff-3ef2ee57c6c2", + "key": "87303141-a159-4390-ab9e-c737b5e29d2a", "commandType": "loadPipette", "params": { "pipetteName": "p20_single_gen2", @@ -2133,7 +2134,7 @@ } }, { - "key": "08850284-1d56-49b4-b767-2ec3dfe91651", + "key": "1dbb2e54-da06-4512-b02c-b3a4c2fc539f", "commandType": "loadLabware", "params": { "displayName": "Opentrons OT-2 96 Tip Rack 10 µL", @@ -2145,7 +2146,7 @@ } }, { - "key": "e4e31066-e009-40ef-b828-bbfde7f720f8", + "key": "7c5e3453-255c-4216-a5c3-7787fa4ef106", "commandType": "loadLabware", "params": { "displayName": "Bio-Rad 96 Well Plate 200 µL PCR", @@ -2158,7 +2159,7 @@ }, { "commandType": "waitForDuration", - "key": "7bdcb695-b181-4843-8323-890a8208a8ad", + "key": "929f2a92-418b-411d-aa33-27db0788e1ff", "params": { "seconds": 3723, "message": "" } } ], diff --git a/protocol-designer/fixtures/protocol/8/ninetySixChannelFullAndColumn.json b/protocol-designer/fixtures/protocol/8/ninetySixChannelFullAndColumn.json index f5b3d607027..abc2d223176 100644 --- a/protocol-designer/fixtures/protocol/8/ninetySixChannelFullAndColumn.json +++ b/protocol-designer/fixtures/protocol/8/ninetySixChannelFullAndColumn.json @@ -6,16 +6,16 @@ "author": "", "description": "", "created": 1701805621086, - "lastModified": 1701872458249, + "lastModified": 1709303384383, "category": null, "subcategory": null, "tags": [] }, "designerApplication": { "name": "opentrons/protocol-designer", - "version": "8.0.0", + "version": "8.1.0", "data": { - "_internalAppBuildDate": "Wed, 06 Dec 2023 14:20:10 GMT", + "_internalAppBuildDate": "Fri, 01 Mar 2024 14:22:27 GMT", "defaultValues": { "aspirate_mmFromBottom": 1, "dispense_mmFromBottom": 0.5, @@ -23,7 +23,9 @@ "blowout_mmFromTop": 0 }, "pipetteTiprackAssignments": { - "de7da440-95ec-43e8-8723-851321fbd6f9": "opentrons/opentrons_flex_96_tiprack_50ul/1" + "de7da440-95ec-43e8-8723-851321fbd6f9": [ + "opentrons/opentrons_flex_96_tiprack_50ul/1" + ] }, "dismissedWarnings": { "form": {}, "timeline": {} }, "ingredients": {}, @@ -48,6 +50,7 @@ "83a095fa-b649-4105-99d4-177f1a3f363a": { "pipette": "de7da440-95ec-43e8-8723-851321fbd6f9", "volume": "10", + "tipRack": "75aa666f-98d8-4af9-908e-963ced428580:opentrons/opentrons_flex_96_tiprack_50ul/1", "changeTip": "always", "path": "single", "aspirate_wells_grouped": false, @@ -98,6 +101,7 @@ "f5ea3139-1585-4848-9d5f-832eb88c99ca": { "pipette": "de7da440-95ec-43e8-8723-851321fbd6f9", "volume": "10", + "tipRack": "75aa666f-98d8-4af9-908e-963ced428580:opentrons/opentrons_flex_96_tiprack_50ul/1", "changeTip": "always", "path": "single", "aspirate_wells_grouped": false, @@ -2216,19 +2220,11 @@ "cornerOffsetFromSlot": { "x": 0, "y": 0, "z": 0 }, "stackingOffsetWithLabware": { "opentrons_96_well_aluminum_block": { "x": 0, "y": 0, "z": 15.41 }, - "opentrons_96_pcr_adapter": { - "x": 0, - "y": 0, - "z": 10.16 - } + "opentrons_96_pcr_adapter": { "x": 0, "y": 0, "z": 10.16 } }, "stackingOffsetWithModule": { "thermocyclerModuleV2": { "x": 0, "y": 0, "z": 10.75 }, - "magneticBlockV1": { - "x": 0, - "y": 0, - "z": 3.87 - } + "magneticBlockV1": { "x": 0, "y": 0, "z": 3.87 } } } }, @@ -2237,7 +2233,7 @@ "commandSchemaId": "opentronsCommandSchemaV8", "commands": [ { - "key": "a04d26cb-a689-4dcb-ac27-1cef05d53677", + "key": "e09dc6e2-c0e6-4b28-9460-865c48a3b03f", "commandType": "loadPipette", "params": { "pipetteName": "p1000_96", @@ -2246,7 +2242,7 @@ } }, { - "key": "4f2796ef-1087-4adf-a5fe-005c30dcc6db", + "key": "3dc22b4a-9fa8-4c61-843d-b45a4054490e", "commandType": "loadLabware", "params": { "displayName": "Opentrons Flex 96 Tip Rack Adapter", @@ -2258,7 +2254,7 @@ } }, { - "key": "2047ebfd-1af3-4e05-b50b-8ace628af278", + "key": "0f3b11ad-a015-4ece-9267-0ca57c832bfd", "commandType": "loadLabware", "params": { "displayName": "Opentrons Flex 96 Tip Rack 50 µL", @@ -2272,7 +2268,7 @@ } }, { - "key": "74ac5df9-371f-4f87-b649-e393c8c82c61", + "key": "0194f4bc-e114-4048-af3f-e053db83a79e", "commandType": "loadLabware", "params": { "displayName": "Bio-Rad 96 Well Plate 200 µL PCR", @@ -2284,7 +2280,7 @@ } }, { - "key": "85e1b54e-a32c-41eb-81a2-017f6ca4a143", + "key": "c807c9aa-7300-40be-817f-6d2018cd9d95", "commandType": "loadLabware", "params": { "displayName": "Opentrons Flex 96 Tip Rack 50 µL", @@ -2297,7 +2293,7 @@ }, { "commandType": "configureNozzleLayout", - "key": "b4ce373e-8b48-434a-b96e-ec8fba4fbe19", + "key": "131fd37b-29cb-41f8-8792-b3c210e2db36", "params": { "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9", "configurationParams": { "style": "ALL" } @@ -2305,7 +2301,7 @@ }, { "commandType": "pickUpTip", - "key": "e5c62b8a-efe9-4ba9-bb7d-5973bff58b76", + "key": "d08a4b16-f17e-4146-adff-68d3235f3174", "params": { "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9", "labwareId": "75aa666f-98d8-4af9-908e-963ced428580:opentrons/opentrons_flex_96_tiprack_50ul/1", @@ -2314,7 +2310,7 @@ }, { "commandType": "aspirate", - "key": "868d7c2a-8009-46c6-b5d6-34ccc10f628a", + "key": "79c1655a-54de-4c5d-8b74-3d866244b229", "params": { "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9", "volume": 10, @@ -2326,7 +2322,7 @@ }, { "commandType": "moveToAddressableArea", - "key": "de22e6ff-5989-4820-a8ca-8f39785eb1c6", + "key": "e95fefc8-1738-4e24-89ab-e8b27fbde04b", "params": { "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9", "addressableAreaName": "movableTrashA3", @@ -2335,7 +2331,7 @@ }, { "commandType": "dispenseInPlace", - "key": "e1828ea8-1567-4787-9185-43895b1f50c9", + "key": "432061e5-a407-43cc-b703-25882875ae58", "params": { "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9", "volume": 10, @@ -2344,7 +2340,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "1a094b33-5bef-4371-8968-182f83838f77", + "key": "8e2ba800-c7af-451a-b730-0ef9115b970f", "params": { "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9", "addressableAreaName": "movableTrashA3", @@ -2354,12 +2350,12 @@ }, { "commandType": "dropTipInPlace", - "key": "fafbc2d4-6675-48c7-aff0-04aa4a5f4dcf", + "key": "0cced503-95fa-49fb-8540-2d528819f20d", "params": { "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9" } }, { "commandType": "configureNozzleLayout", - "key": "c0022ba6-ea8f-468e-b3db-3ab1137ac8e6", + "key": "48a2d952-d9ad-4ed7-9021-31c97c43b175", "params": { "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9", "configurationParams": { "primaryNozzle": "A12", "style": "COLUMN" } @@ -2367,7 +2363,7 @@ }, { "commandType": "pickUpTip", - "key": "a9fb93dd-d2bc-4829-a331-6e39b453c5d0", + "key": "474ddf94-384e-4c01-acbd-50e43c005c7c", "params": { "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9", "labwareId": "9bd16b50-4ae9-4cfd-8583-3378087e6a6c:opentrons/opentrons_flex_96_tiprack_50ul/1", @@ -2376,7 +2372,7 @@ }, { "commandType": "aspirate", - "key": "f355e2fb-7045-43df-8dba-5485007eca92", + "key": "1e082d08-89b8-4e5f-b80f-e9190280fad7", "params": { "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9", "volume": 10, @@ -2388,7 +2384,7 @@ }, { "commandType": "moveToAddressableArea", - "key": "edc0b963-b9fb-4ec8-b528-fb1e513e70bc", + "key": "42daf0a1-9c17-4c9a-b8e6-90e68e166d1a", "params": { "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9", "addressableAreaName": "movableTrashA3", @@ -2397,7 +2393,7 @@ }, { "commandType": "dispenseInPlace", - "key": "492bb9b6-6349-4f8e-91a7-cacb310732e0", + "key": "6e36d0e4-e975-4cf6-8dd4-24d74f9d60f7", "params": { "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9", "volume": 10, @@ -2406,7 +2402,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "56906667-0837-4b36-b13f-08903b7a4d8c", + "key": "918fec4b-1947-49c5-8fe1-af24fef2bf3f", "params": { "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9", "addressableAreaName": "movableTrashA3", @@ -2416,7 +2412,7 @@ }, { "commandType": "dropTipInPlace", - "key": "2b6cf6b5-73e6-46db-a52d-be7c1e09f281", + "key": "7b5a5ab4-5dbd-4338-890f-38551bd58c4a", "params": { "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9" } } ], diff --git a/protocol-designer/src/components/BatchEditForm/BatchEditMix.tsx b/protocol-designer/src/components/BatchEditForm/BatchEditMix.tsx index b147d5e59da..062052ea9d6 100644 --- a/protocol-designer/src/components/BatchEditForm/BatchEditMix.tsx +++ b/protocol-designer/src/components/BatchEditForm/BatchEditMix.tsx @@ -84,7 +84,8 @@ export const BatchEditMix = (props: BatchEditMixProps): JSX.Element => { {...propsForFields.aspirate_flowRate} pipetteId={getPipetteIdForForm()} flowRateType="aspirate" - volume={propsForFields.volume.value} + volume={propsForFields.volume?.value ?? 0} + tiprack={propsForFields.tipRack.value} /> { {...propsForFields.dispense_flowRate} pipetteId={getPipetteIdForForm()} flowRateType="dispense" - volume={propsForFields.volume.value} + volume={propsForFields.volume?.value ?? 0} + tiprack={propsForFields.tipRack.value} /> { spec: {} as any, name: 'p1000_single', id: 'mockId', - tiprackDefURI: mockTipUri, + tiprackDefURI: [mockTipUri], }, }) vi.mocked(getCustomLabwareDefsByURI).mockReturnValue({}) diff --git a/protocol-designer/src/components/StepEditForm/fields/DisposalVolumeField.tsx b/protocol-designer/src/components/StepEditForm/fields/DisposalVolumeField.tsx index ab5b1e00185..26a8f810439 100644 --- a/protocol-designer/src/components/StepEditForm/fields/DisposalVolumeField.tsx +++ b/protocol-designer/src/components/StepEditForm/fields/DisposalVolumeField.tsx @@ -44,6 +44,7 @@ interface DisposalVolumeFieldProps { volume: string | null aspirate_airGap_checkbox?: boolean | null aspirate_airGap_volume?: string | null + tipRack?: string | null } export const DisposalVolumeField = ( @@ -57,11 +58,13 @@ export const DisposalVolumeField = ( propsForFields, aspirate_airGap_checkbox, aspirate_airGap_volume, + tipRack, } = props const { t } = useTranslation(['application', 'form']) const disposalOptions = useSelector(uiLabwareSelectors.getDisposalOptions) const pipetteEntities = useSelector(stepFormSelectors.getPipetteEntities) + const labwareEntities = useSelector(stepFormSelectors.getLabwareEntities) const blowoutLocationOptions = getBlowoutLocationOptionsForForm({ path, stepType, @@ -73,8 +76,10 @@ export const DisposalVolumeField = ( path, pipette, volume, + tipRack, }, - pipetteEntities + pipetteEntities, + labwareEntities ) const disposalDestinationOptions = [ ...disposalOptions, diff --git a/protocol-designer/src/components/StepEditForm/fields/FlowRateField/index.tsx b/protocol-designer/src/components/StepEditForm/fields/FlowRateField/index.tsx index 4bcbe8f2f1b..a482450d70e 100644 --- a/protocol-designer/src/components/StepEditForm/fields/FlowRateField/index.tsx +++ b/protocol-designer/src/components/StepEditForm/fields/FlowRateField/index.tsx @@ -8,6 +8,7 @@ import { getMatchingTipLiquidSpecs } from '../../../../utils' interface OP extends FieldProps { flowRateType: FlowRateInputProps['flowRateType'] volume: unknown + tiprack: unknown pipetteId?: string | null className?: FlowRateInputProps['className'] label?: FlowRateInputProps['label'] @@ -15,14 +16,21 @@ interface OP extends FieldProps { // Add a key to force re-constructing component when values change export function FlowRateField(props: OP): JSX.Element { - const { pipetteId, flowRateType, value, volume, ...passThruProps } = props + const { + pipetteId, + flowRateType, + value, + volume, + tiprack, + ...passThruProps + } = props const pipetteEntities = useSelector(stepFormSelectors.getPipetteEntities) const pipette = pipetteId != null ? pipetteEntities[pipetteId] : null const pipetteDisplayName = pipette ? pipette.spec.displayName : 'pipette' const innerKey = `${name}:${String(value || 0)}` const matchingTipLiquidSpecs = pipette != null - ? getMatchingTipLiquidSpecs(pipette, volume as number) + ? getMatchingTipLiquidSpecs(pipette, volume as number, tiprack as string) : null let defaultFlowRate diff --git a/protocol-designer/src/components/StepEditForm/fields/PathField/PathField.tsx b/protocol-designer/src/components/StepEditForm/fields/PathField/PathField.tsx index 8cf3e8e8d0a..81bb79fd02e 100644 --- a/protocol-designer/src/components/StepEditForm/fields/PathField/PathField.tsx +++ b/protocol-designer/src/components/StepEditForm/fields/PathField/PathField.tsx @@ -123,9 +123,11 @@ export const PathField = (props: PathFieldProps): JSX.Element => { volume, value, updateValue, + tipRack, } = props const { t } = useTranslation('form') const pipetteEntities = useSelector(stepFormSelectors.getPipetteEntities) + const labwareEntities = useSelector(stepFormSelectors.getLabwareEntities) const disabledPathMap = getDisabledPathMap( { aspirate_airGap_checkbox, @@ -135,8 +137,10 @@ export const PathField = (props: PathFieldProps): JSX.Element => { dispense_wells, pipette, volume, + tipRack, }, pipetteEntities, + labwareEntities, t ) return ( diff --git a/protocol-designer/src/components/StepEditForm/fields/PathField/getDisabledPathMap.ts b/protocol-designer/src/components/StepEditForm/fields/PathField/getDisabledPathMap.ts index f478e69fbb2..9336b15f6d3 100644 --- a/protocol-designer/src/components/StepEditForm/fields/PathField/getDisabledPathMap.ts +++ b/protocol-designer/src/components/StepEditForm/fields/PathField/getDisabledPathMap.ts @@ -4,8 +4,12 @@ import { volumeInCapacityForMultiDispense, volumeInCapacityForMultiAspirate, } from '../../../../steplist/formLevel/handleFormChange/utils' -import { ChangeTipOptions, PipetteEntities } from '@opentrons/step-generation' -import { PathOption } from '../../../../form-types' +import type { + ChangeTipOptions, + LabwareEntities, + PipetteEntities, +} from '@opentrons/step-generation' +import type { PathOption } from '../../../../form-types' export type DisabledPathMap = Partial> | null export interface ValuesForPath { aspirate_airGap_checkbox?: boolean | null @@ -15,10 +19,12 @@ export interface ValuesForPath { dispense_wells?: string[] | null pipette?: string | null volume?: string | null + tipRack?: string | null } export function getDisabledPathMap( values: ValuesForPath, pipetteEntities: PipetteEntities, + labwareEntities: LabwareEntities, t: any ): DisabledPathMap { const { @@ -27,6 +33,7 @@ export function getDisabledPathMap( changeTip, dispense_wells, pipette, + tipRack, } = values if (!pipette) return null const wellRatio = getWellRatio(aspirate_wells, dispense_wells) @@ -51,7 +58,8 @@ export function getDisabledPathMap( // transfer volume overwrites change tip disable reasoning const pipetteEntity = pipetteEntities[pipette] - const pipetteCapacity = pipetteEntity && getPipetteCapacity(pipetteEntity) + const pipetteCapacity = + pipetteEntity && getPipetteCapacity(pipetteEntity, labwareEntities, tipRack) const volume = Number(values.volume) const airGapChecked = aspirate_airGap_checkbox let airGapVolume = airGapChecked ? Number(values.aspirate_airGap_volume) : 0 diff --git a/protocol-designer/src/components/StepEditForm/fields/TiprackField.tsx b/protocol-designer/src/components/StepEditForm/fields/TiprackField.tsx new file mode 100644 index 00000000000..a9dceb482a2 --- /dev/null +++ b/protocol-designer/src/components/StepEditForm/fields/TiprackField.tsx @@ -0,0 +1,32 @@ +import * as React from 'react' +import { useTranslation } from 'react-i18next' +import { useSelector } from 'react-redux' +import { FormGroup, DropdownField } from '@opentrons/components' +import { selectors as uiLabwareSelectors } from '../../../ui/labware' +import styles from '../StepEditForm.module.css' + +import type { FieldProps } from '../types' + +export function TiprackField(props: FieldProps): JSX.Element { + const { name, value, onFieldBlur, onFieldFocus, updateValue } = props + const { t } = useTranslation('form') + const options = useSelector(uiLabwareSelectors.getTiprackOptions) + + return ( + + ) => { + updateValue(e.currentTarget.value) + }} + /> + + ) +} diff --git a/protocol-designer/src/components/StepEditForm/forms/MixForm.tsx b/protocol-designer/src/components/StepEditForm/forms/MixForm.tsx index 8d43e9a10b2..87cfdbcd49b 100644 --- a/protocol-designer/src/components/StepEditForm/forms/MixForm.tsx +++ b/protocol-designer/src/components/StepEditForm/forms/MixForm.tsx @@ -18,6 +18,7 @@ import { WellOrderField, WellSelectionField, } from '../fields' +import { TiprackField } from '../fields/TiprackField' import { getBlowoutLocationOptionsForForm, getLabwareFieldForPositioningField, @@ -50,6 +51,7 @@ export const MixForm = (props: StepFormProps): JSX.Element => {
+ {is96Channel ? ( ) : null} @@ -111,7 +113,8 @@ export const MixForm = (props: StepFormProps): JSX.Element => { {...propsForFields.aspirate_flowRate} pipetteId={formData.pipette} flowRateType="aspirate" - volume={propsForFields.volume.value} + volume={propsForFields.volume?.value ?? 0} + tiprack={propsForFields.tipRack.value} /> { {...propsForFields.dispense_flowRate} pipetteId={formData.pipette} flowRateType="dispense" - volume={propsForFields.volume.value} + volume={propsForFields.volume?.value ?? 0} + tiprack={propsForFields.tipRack.value} />
diff --git a/protocol-designer/src/components/StepEditForm/forms/MoveLiquidForm/SourceDestFields.tsx b/protocol-designer/src/components/StepEditForm/forms/MoveLiquidForm/SourceDestFields.tsx index 2f0e8bdc3b0..77eaa424f36 100644 --- a/protocol-designer/src/components/StepEditForm/forms/MoveLiquidForm/SourceDestFields.tsx +++ b/protocol-designer/src/components/StepEditForm/forms/MoveLiquidForm/SourceDestFields.tsx @@ -91,7 +91,8 @@ export const SourceDestFields = (props: SourceDestFieldsProps): JSX.Element => { {...propsForFields[addFieldNamePrefix('flowRate')]} pipetteId={formData.pipette} flowRateType={prefix} - volume={propsForFields.volume.value} + volume={propsForFields.volume?.value ?? 0} + tiprack={propsForFields.tipRack.value} /> {
+ {is96Channel ? ( ) : null} @@ -113,6 +115,7 @@ export const MoveLiquidForm = (props: StepFormProps): JSX.Element => { dispense_wells={formData.dispense_wells} pipette={formData.pipette} volume={formData.volume} + tipRack={formData.tipRack} />
diff --git a/protocol-designer/src/components/modals/CreateFileWizard/PipetteTipsTile.tsx b/protocol-designer/src/components/modals/CreateFileWizard/PipetteTipsTile.tsx index 4bc9fcec60e..b6bb1db7394 100644 --- a/protocol-designer/src/components/modals/CreateFileWizard/PipetteTipsTile.tsx +++ b/protocol-designer/src/components/modals/CreateFileWizard/PipetteTipsTile.tsx @@ -178,16 +178,15 @@ function PipetteTipsField(props: PipetteTipsFieldProps): JSX.Element | null { option.value.includes('custom_beta') ) - const currentValue = pipettesByMount[mount].tiprackDefURI + const selectedValues = pipettesByMount[mount].tiprackDefURI ?? [] React.useEffect(() => { - if (currentValue === undefined) { - setValue( - `pipettesByMount.${mount}.tiprackDefURI`, - tiprackOptions[0]?.value ?? '' - ) + if (selectedValues.length === 0) { + setValue(`pipettesByMount.${mount}.tiprackDefURI`, [ + tiprackOptions[0]?.value ?? '', + ]) } - }, [currentValue, setValue, tiprackOptions]) + }, [selectedValues, setValue, tiprackOptions]) return ( ( { - setValue(`pipettesByMount.${mount}.tiprackDefURI`, o.value) + const updatedValues = selectedValues?.includes(o.value) + ? selectedValues.filter(value => value !== o.value) + : [...(selectedValues ?? []), o.value] + setValue( + `pipettesByMount.${mount}.tiprackDefURI`, + updatedValues.slice(0, 3) + ) }} width="21.75rem" minHeight="4rem" + showCheckbox /> ))} @@ -256,13 +262,20 @@ function PipetteTipsField(props: PipetteTipsFieldProps): JSX.Element | null { {customTiprackOptions.map(o => ( { - setValue(`pipettesByMount.${mount}.tiprackDefURI`, o.value) + const updatedValues = selectedValues?.includes(o.value) + ? selectedValues.filter(value => value !== o.value) + : [...(selectedValues ?? []), o.value] + setValue( + `pipettesByMount.${mount}.tiprackDefURI`, + updatedValues.slice(0, 3) + ) }} width="21.75rem" minHeight="4rem" + showCheckbox /> ))} diff --git a/protocol-designer/src/components/modals/CreateFileWizard/__tests__/ModulesAndOtherTile.test.tsx b/protocol-designer/src/components/modals/CreateFileWizard/__tests__/ModulesAndOtherTile.test.tsx index 16f8b1f4fa1..86228712389 100644 --- a/protocol-designer/src/components/modals/CreateFileWizard/__tests__/ModulesAndOtherTile.test.tsx +++ b/protocol-designer/src/components/modals/CreateFileWizard/__tests__/ModulesAndOtherTile.test.tsx @@ -33,7 +33,7 @@ const values = { robotType: FLEX_ROBOT_TYPE, }, pipettesByMount: { - left: { pipetteName: 'mockPipetteName', tiprackDefURI: 'mocktip' }, + left: { pipetteName: 'mockPipetteName', tiprackDefURI: ['mocktip'] }, right: { pipetteName: null, tiprackDefURI: null }, } as FormPipettesByMount, modulesByType: { @@ -106,7 +106,7 @@ describe('ModulesAndOtherTile', () => { robotType: OT2_ROBOT_TYPE, }, pipettesByMount: { - left: { pipetteName: 'p1000_single', tiprackDefURI: 'mocktip' }, + left: { pipetteName: 'p1000_single', tiprackDefURI: ['mocktip'] }, right: { pipetteName: null, tiprackDefURI: null }, } as FormPipettesByMount, modulesByType: { 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 9995dc192e5..deab82c01d8 100644 --- a/protocol-designer/src/components/modals/CreateFileWizard/__tests__/PipetteTipsTile.test.tsx +++ b/protocol-designer/src/components/modals/CreateFileWizard/__tests__/PipetteTipsTile.test.tsx @@ -38,7 +38,7 @@ const values = { pipettesByMount: { left: { pipetteName: 'p1000_single_flex', - tiprackDefURI: 'opentrons/opentrons_flex_96_tiprack_200ul/1', + tiprackDefURI: ['opentrons/opentrons_flex_96_tiprack_200ul/1'], }, right: { pipetteName: null, tiprackDefURI: null }, } as FormPipettesByMount, @@ -150,7 +150,7 @@ describe('PipetteTipsTile', () => { pipettesByMount: { left: { pipetteName: 'p10_single', - tiprackDefURI: 'opentrons/opentrons_96_tiprack_10ul/1', + tiprackDefURI: ['opentrons/opentrons_96_tiprack_10ul/1'], }, right: { pipetteName: null, tiprackDefURI: null }, } as FormPipettesByMount, diff --git a/protocol-designer/src/components/modals/CreateFileWizard/__tests__/utils.test.tsx b/protocol-designer/src/components/modals/CreateFileWizard/__tests__/utils.test.tsx index 5bd5f4f2a04..ed2242f1f87 100644 --- a/protocol-designer/src/components/modals/CreateFileWizard/__tests__/utils.test.tsx +++ b/protocol-designer/src/components/modals/CreateFileWizard/__tests__/utils.test.tsx @@ -22,7 +22,7 @@ let MOCK_FORM_STATE = { robotType: FLEX_ROBOT_TYPE, }, pipettesByMount: { - left: { pipetteName: 'mockPipetteName', tiprackDefURI: 'mocktip' }, + left: { pipetteName: 'mockPipetteName', tiprackDefURI: ['mocktip'] }, right: { pipetteName: null, tiprackDefURI: null }, } as FormPipettesByMount, modulesByType: { diff --git a/protocol-designer/src/components/modals/CreateFileWizard/index.tsx b/protocol-designer/src/components/modals/CreateFileWizard/index.tsx index 5c4bbaed6fd..f569a4f03ce 100644 --- a/protocol-designer/src/components/modals/CreateFileWizard/index.tsx +++ b/protocol-designer/src/components/modals/CreateFileWizard/index.tsx @@ -243,7 +243,7 @@ export function CreateFileWizard(): JSX.Element | null { } // auto-generate tipracks for pipettes const newTiprackModels: string[] = uniq( - pipettes.map(pipette => pipette.tiprackDefURI) + pipettes.flatMap(pipette => pipette.tiprackDefURI) ) newTiprackModels.forEach((tiprackDefURI, index) => { const ot2Slots = index === 0 ? '2' : '5' @@ -353,7 +353,8 @@ const initialFormState: FormState = { const pipetteValidationShape = Yup.object().shape({ pipetteName: Yup.string().nullable(), - tiprackDefURI: Yup.string() + tiprackDefURI: Yup.array() + .of(Yup.string()) .nullable() .when('pipetteName', { is: (val: string | null): boolean => Boolean(val), diff --git a/protocol-designer/src/components/modals/FilePipettesModal/PipetteFields.tsx b/protocol-designer/src/components/modals/FilePipettesModal/PipetteFields.tsx index 81f37a0dd7b..92593996844 100644 --- a/protocol-designer/src/components/modals/FilePipettesModal/PipetteFields.tsx +++ b/protocol-designer/src/components/modals/FilePipettesModal/PipetteFields.tsx @@ -2,7 +2,6 @@ import * as React from 'react' import { useDispatch, useSelector } from 'react-redux' import { Control, - Controller, FormState, UseFormSetValue, UseFormTrigger, @@ -10,7 +9,6 @@ import { import { useTranslation } from 'react-i18next' import isEmpty from 'lodash/isEmpty' import { - DropdownField, FormGroup, PipetteSelect, OutlineButton, @@ -30,6 +28,7 @@ import { FormPipettesByMount } from '../../../step-forms' import { getAllowAllTipracks } from '../../../feature-flags/selectors' import { getTiprackOptions } from '../utils' import { PipetteDiagram } from './PipetteDiagram' +import { TiprackSelect } from './TiprackSelect' import styles from './FilePipettesModal.module.css' import formStyles from '../../forms/forms.module.css' @@ -39,7 +38,7 @@ import type { ThunkDispatch } from 'redux-thunk' import type { BaseState } from '../../../types' import type { FormState as TypeFormState } from './index' -export interface Props { +export interface PipetteFieldsProps { values: FormPipettesByMount setValue: UseFormSetValue trigger: UseFormTrigger @@ -60,8 +59,8 @@ interface TiprackSelectProps { robotType: RobotType } -export function PipetteFields(props: Props): JSX.Element { - const { values, formState, setValue, trigger, control, robotType } = props +export function PipetteFields(props: PipetteFieldsProps): JSX.Element { + const { values, setValue, trigger, robotType } = props const { t } = useTranslation(['modal', 'button']) const allowAllTipracks = useSelector(getAllowAllTipracks) const dispatch = useDispatch>() @@ -73,7 +72,7 @@ export function PipetteFields(props: Props): JSX.Element { if (has96Channel) { values.right = { pipetteName: null, tiprackDefURI: null } } - }, [values.left]) + }, [has96Channel, values.left]) const renderPipetteSelect = (props: PipetteSelectProps): JSX.Element => { const { tabIndex, mount } = props @@ -112,43 +111,17 @@ export function PipetteFields(props: Props): JSX.Element { allowAllTipracks: allowAllTipracks, selectedPipetteName: selectedPipetteName, }) - const { errors, touchedFields } = formState - const touched = - touchedFields.pipettesByMount && - touchedFields.pipettesByMount[mount] != null - - const tiprackDefURIError = - errors.pipettesByMount && - errors.pipettesByMount[mount]?.tiprackDefURI != null return ( - ( - ) => { - field.onChange(e) - trigger(`pipettesByMount.${mount}.tiprackDefURI`) - }} - onBlur={field.onBlur} - /> - )} + { + // @ts-expect-error: TS can't figure out this type with react-hook-form + setValue(field, value) + trigger(`pipettesByMount.${mount}.tiprackDefURI`) + }} /> ) } diff --git a/protocol-designer/src/components/modals/FilePipettesModal/TiprackOption.tsx b/protocol-designer/src/components/modals/FilePipettesModal/TiprackOption.tsx new file mode 100644 index 00000000000..8908d0e7614 --- /dev/null +++ b/protocol-designer/src/components/modals/FilePipettesModal/TiprackOption.tsx @@ -0,0 +1,41 @@ +import * as React from 'react' +import { + Flex, + Text, + Icon, + DIRECTION_ROW, + COLORS, + SPACING, + ALIGN_CENTER, +} from '@opentrons/components' + +interface TiprackOptionProps { + onClick: React.MouseEventHandler + isSelected: boolean + text: React.ReactNode +} +export function TiprackOption(props: TiprackOptionProps): JSX.Element { + const { text, onClick, isSelected } = props + return ( + + + {text} + + ) +} diff --git a/protocol-designer/src/components/modals/FilePipettesModal/TiprackSelect.tsx b/protocol-designer/src/components/modals/FilePipettesModal/TiprackSelect.tsx new file mode 100644 index 00000000000..8aa608796ec --- /dev/null +++ b/protocol-designer/src/components/modals/FilePipettesModal/TiprackSelect.tsx @@ -0,0 +1,51 @@ +import * as React from 'react' +import { Flex, DIRECTION_COLUMN } from '@opentrons/components' +import { TiprackOption } from './TiprackOption' +import type { Mount } from '@opentrons/components' +import type { FormPipettesByMount } from '../../../step-forms' +import type { TiprackOption as TiprackOptionType } from '../utils' + +interface TiprackSelectProps { + mount: Mount + tiprackOptions: TiprackOptionType[] + onSetFieldValue: (field: string, value: any) => void + values: FormPipettesByMount +} +export const TiprackSelect = ( + props: TiprackSelectProps +): JSX.Element | null => { + const { mount, tiprackOptions, values, onSetFieldValue } = props + const selectedPipetteName = values[mount].pipetteName + + let selectedValues = values[mount].tiprackDefURI ?? [] + + React.useEffect(() => { + if (selectedValues?.length === 0 && tiprackOptions.length > 0) { + selectedValues = [tiprackOptions[0].value] + onSetFieldValue(`pipettesByMount.${mount}.tiprackDefURI`, selectedValues) + } + }, [selectedValues, onSetFieldValue, tiprackOptions]) + + if (selectedPipetteName == null) return null + + return ( + + {tiprackOptions.map(option => ( + { + const updatedValues = selectedValues?.includes(option.value) + ? selectedValues.filter(value => value !== option.value) + : [...(selectedValues ?? []), option.value] + onSetFieldValue( + `pipettesByMount.${mount}.tiprackDefURI`, + updatedValues.slice(0, 3) + ) + }} + /> + ))} + + ) +} diff --git a/protocol-designer/src/components/modals/FilePipettesModal/__tests__/TiprackOptions.test.tsx b/protocol-designer/src/components/modals/FilePipettesModal/__tests__/TiprackOptions.test.tsx new file mode 100644 index 00000000000..6b9004a2472 --- /dev/null +++ b/protocol-designer/src/components/modals/FilePipettesModal/__tests__/TiprackOptions.test.tsx @@ -0,0 +1,36 @@ +import * as React from 'react' +import { vi, describe, beforeEach, it, expect } from 'vitest' +import { screen } from '@testing-library/react' +import { renderWithProviders } from '../../../../__testing-utils__' +import { COLORS } from '@opentrons/components' +import { TiprackOption } from '../TiprackOption' + +const render = (props: React.ComponentProps) => { + return renderWithProviders()[0] +} + +describe('TiprackOption', () => { + let props: React.ComponentProps + beforeEach(() => { + props = { + onClick: vi.fn(), + isSelected: true, + text: 'mockText', + } + }) + it('renders a selected tiprack option', () => { + render(props) + screen.getByText('mockText') + expect(screen.getByLabelText('TiprackOption_checkbox-marked')).toHaveStyle( + `color: ${COLORS.blue50}` + ) + }) + it('renders an unselected tiprack option', () => { + props.isSelected = false + render(props) + screen.getByText('mockText') + expect( + screen.getByLabelText('TiprackOption_checkbox-blank-outline') + ).toHaveStyle(`color: ${COLORS.grey50}`) + }) +}) diff --git a/protocol-designer/src/components/modals/FilePipettesModal/__tests__/TiprackSelect.test.tsx b/protocol-designer/src/components/modals/FilePipettesModal/__tests__/TiprackSelect.test.tsx new file mode 100644 index 00000000000..bf1f5165002 --- /dev/null +++ b/protocol-designer/src/components/modals/FilePipettesModal/__tests__/TiprackSelect.test.tsx @@ -0,0 +1,39 @@ +import * as React from 'react' +import { vi, describe, beforeEach, it, expect } from 'vitest' +import { screen } from '@testing-library/react' +import { renderWithProviders } from '../../../../__testing-utils__' +import { TiprackSelect } from '../TiprackSelect' +import { TiprackOption } from '../TiprackOption' + +vi.mock('../TiprackOption') + +const render = (props: React.ComponentProps) => { + return renderWithProviders()[0] +} + +describe('TiprackSelect', () => { + let props: React.ComponentProps + beforeEach(() => { + vi.mocked(TiprackOption).mockReturnValue(
mock TiprackOption
) + props = { + mount: 'left', + tiprackOptions: [ + { name: 'mockTip', value: 'mockUri' }, + { name: 'mockTip2', value: 'mockUri2' }, + { name: 'mockTip3', value: 'mockUri3' }, + ], + onSetFieldValue: vi.fn(), + values: { + left: { + pipetteName: 'mockPipetteName', + tiprackDefURI: ['mockUri', 'mockUri2'], + }, + right: { pipetteName: null, tiprackDefURI: null }, + }, + } + }) + it('renders 3 options in tiprack option', () => { + render(props) + expect(screen.getAllByText('mock TiprackOption')).toHaveLength(3) + }) +}) diff --git a/protocol-designer/src/components/modals/FilePipettesModal/index.tsx b/protocol-designer/src/components/modals/FilePipettesModal/index.tsx index b08b6f5d05e..474cbd59287 100644 --- a/protocol-designer/src/components/modals/FilePipettesModal/index.tsx +++ b/protocol-designer/src/components/modals/FilePipettesModal/index.tsx @@ -119,7 +119,8 @@ const initialFormState: FormState = { const pipetteValidationShape = Yup.object().shape({ pipetteName: Yup.string().nullable(), - tiprackDefURI: Yup.string() + tiprackDefURI: Yup.array() + .of(Yup.string()) .nullable() .when('pipetteName', { is: (val: string | null): boolean => Boolean(val), @@ -172,7 +173,7 @@ const makeUpdatePipettes = ( [pipetteId: string]: { mount: string name: PipetteName - tiprackDefURI: string + tiprackDefURI: string[] id: string } } = {} @@ -253,9 +254,14 @@ const makeUpdatePipettes = ( nextPipettes, (nextPipette: typeof nextPipettes[keyof typeof nextPipettes]) => { const newPipetteId = nextPipette.id + const nextTips = nextPipette.tiprackDefURI + const oldTips = + newPipetteId in prevPipettes + ? prevPipettes[newPipetteId].tiprackDefURI + : null const tiprackChanged = - newPipetteId in prevPipettes && - nextPipette.tiprackDefURI !== prevPipettes[newPipetteId].tiprackDefURI + oldTips != null && + nextTips.every((item, index) => item !== oldTips[index]) return tiprackChanged } ).map(pipette => pipette.id) @@ -360,8 +366,8 @@ export const FilePipettesModal = (props: Props): JSX.Element => { ) // this is mostly for flow // @ts-expect-error(sa, 2021-6-21): TODO validate that pipette names coming from the modal are actually valid pipette names on PipetteName type return formPipette && - formPipette.pipetteName && - formPipette.tiprackDefURI && + formPipette.pipetteName != null && + formPipette.tiprackDefURI != null && (mount === 'left' || mount === 'right') ? [ ...acc, @@ -512,7 +518,7 @@ export const FilePipettesModal = (props: Props): JSX.Element => { @@ -524,7 +530,7 @@ export const FilePipettesModal = (props: Props): JSX.Element => { {showEditPipetteConfirmation ? ( setShowEditPipetteConfirmation(false)} - onConfirm={handleSubmit(handleFormSubmit)} + onConfirm={() => handleSubmit(handleFormSubmit)()} /> ) : null}
diff --git a/protocol-designer/src/file-data/__fixtures__/createFile/commonFields.ts b/protocol-designer/src/file-data/__fixtures__/createFile/commonFields.ts index 046d07cff48..3671654514a 100644 --- a/protocol-designer/src/file-data/__fixtures__/createFile/commonFields.ts +++ b/protocol-designer/src/file-data/__fixtures__/createFile/commonFields.ts @@ -57,8 +57,8 @@ export const pipetteEntities: PipetteEntities = { id: 'pipetteId', name: 'p10_single', spec: fixtureP10SingleV2Specs, - tiprackDefURI: 'opentrons/opentrons_96_tiprack_10ul/1', - tiprackLabwareDef: fixtureTiprack10ul, + tiprackDefURI: ['opentrons/opentrons_96_tiprack_10ul/1'], + tiprackLabwareDef: [fixtureTiprack10ul], }, } export const labwareNicknamesById: Record = { diff --git a/protocol-designer/src/file-data/__tests__/createFile.test.ts b/protocol-designer/src/file-data/__tests__/createFile.test.ts index 1946d0416a3..a25f77524ea 100644 --- a/protocol-designer/src/file-data/__tests__/createFile.test.ts +++ b/protocol-designer/src/file-data/__tests__/createFile.test.ts @@ -125,16 +125,18 @@ describe('getLabwareDefinitionsInUse util', () => { // @ts-expect-error(sa, 2021-6-18): not a valid pipette name name: 'foo', spec: fixtureP10SingleV2Specs, - tiprackLabwareDef: assignedTiprackOnDeckDef as LabwareDefinition2, - tiprackDefURI: 'assignedTiprackOnDeckURI', + tiprackLabwareDef: [assignedTiprackOnDeckDef] as LabwareDefinition2[], + tiprackDefURI: ['assignedTiprackOnDeckURI'], }, otherPipetteId: { id: 'otherPipetteId', // @ts-expect-error(sa, 2021-6-18): not a valid pipette name name: 'foo', spec: fixtureP300SingleV2Specs, - tiprackLabwareDef: assignedTiprackNotOnDeckDef as LabwareDefinition2, - tiprackDefURI: 'assignedTiprackNotOnDeckURI', + tiprackLabwareDef: [ + assignedTiprackNotOnDeckDef, + ] as LabwareDefinition2[], + tiprackDefURI: ['assignedTiprackNotOnDeckURI'], }, } const result = getLabwareDefinitionsInUse( diff --git a/protocol-designer/src/file-data/selectors/fileCreator.ts b/protocol-designer/src/file-data/selectors/fileCreator.ts index 1d79db11161..dfe72d15625 100644 --- a/protocol-designer/src/file-data/selectors/fileCreator.ts +++ b/protocol-designer/src/file-data/selectors/fileCreator.ts @@ -84,7 +84,7 @@ export const getLabwareDefinitionsInUse = ( ) const tiprackDefURIsInUse: string[] = Object.keys(pipettes) .map(id => pipettes[id]) - .map((pipetteEntity: PipetteEntity) => pipetteEntity.tiprackDefURI) + .flatMap((pipetteEntity: PipetteEntity) => pipetteEntity.tiprackDefURI) const labwareDefURIsInUse = uniq([ ...tiprackDefURIsInUse, ...labwareDefURIsOnDeck, @@ -155,9 +155,8 @@ export const createFile: Selector = createSelector( }, pipetteTiprackAssignments: mapValues( pipetteEntities, - ( - p: typeof pipetteEntities[keyof typeof pipetteEntities] - ): string | null | undefined => p.tiprackDefURI + (p: typeof pipetteEntities[keyof typeof pipetteEntities]): string[] => + p.tiprackDefURI ), dismissedWarnings, ingredients, diff --git a/protocol-designer/src/file-types.ts b/protocol-designer/src/file-types.ts index 830abd87dcc..f9a904bf4a5 100644 --- a/protocol-designer/src/file-types.ts +++ b/protocol-designer/src/file-types.ts @@ -8,7 +8,7 @@ import { ProtocolFile as ProtocolFileV6 } from '@opentrons/shared-data/protocol/ export interface PDMetadata { // pipetteId to tiprackModel - pipetteTiprackAssignments: Record + pipetteTiprackAssignments: Record dismissedWarnings: DismissRoot['dismissedWarnings'] ingredients: IngredRoot['ingredients'] ingredLocations: IngredRoot['ingredLocations'] diff --git a/protocol-designer/src/form-types.ts b/protocol-designer/src/form-types.ts index 8aeec17909a..65d54b29ff9 100644 --- a/protocol-designer/src/form-types.ts +++ b/protocol-designer/src/form-types.ts @@ -176,6 +176,7 @@ export interface HydratedMoveLiquidFormData { stepName: string description: string | null | undefined fields: { + tipRack: string pipette: PipetteEntity volume: number path: PathOption @@ -239,6 +240,7 @@ export interface HydratedMixFormDataLegacy { id: string stepType: 'mix' stepName: string + tipRack: string stepDetails: string | null | undefined pipette: PipetteEntity volume: number diff --git a/protocol-designer/src/load-file/migration/8_1_0.ts b/protocol-designer/src/load-file/migration/8_1_0.ts new file mode 100644 index 00000000000..c60ffb21183 --- /dev/null +++ b/protocol-designer/src/load-file/migration/8_1_0.ts @@ -0,0 +1,91 @@ +import type { + LoadLabwareCreateCommand, + ProtocolFile, +} from '@opentrons/shared-data' +import type { DesignerApplicationData } from './utils/getLoadLiquidCommands' + +export interface DesignerApplicationDataV8 { + ingredients: Record< + string, + { + name?: string | null + description?: string | null + serialize: boolean + } + > + ingredLocations: { + [labwareId: string]: { + [wellName: string]: { [liquidId: string]: { volume: number } } + } + } + savedStepForms: Record + orderedStepIds: string[] + pipetteTiprackAssignments: Record +} + +export const migrateFile = ( + appData: ProtocolFile +): ProtocolFile => { + const { designerApplication, commands, labwareDefinitions } = appData + + if (designerApplication == null || designerApplication?.data == null) { + throw Error('The designerApplication key in your file is corrupt.') + } + + const tiprackAssignments = designerApplication.data + ?.pipetteTiprackAssignments as Record + + const newTiprackAssignments = Object.keys(tiprackAssignments).reduce( + (acc: Record, key) => { + acc[key] = [tiprackAssignments[key]] + return acc + }, + {} + ) + + const loadLabwareCommands = commands.filter( + (command): command is LoadLabwareCreateCommand => + command.commandType === 'loadLabware' + ) + + const savedStepForms = designerApplication.data + ?.savedStepForms as DesignerApplicationData['savedStepForms'] + const pipettingSavedSteps = Object.values(savedStepForms).filter( + form => form.stepType === 'moveLiquid' || form.stepType === 'mix' + ) + + const pipettingSavedStepsWithTipRack = pipettingSavedSteps.reduce( + (acc, item) => { + const tipRackUri = tiprackAssignments[item.pipette] + const tiprackLoadName = + labwareDefinitions[tipRackUri]?.parameters.loadName + if (tiprackLoadName == null) { + console.error( + `expected to find tiprack definition with labwareDefintionURI ${tipRackUri} but could not` + ) + } + const tiprackIds = loadLabwareCommands + .filter(command => command.params.loadName === tiprackLoadName) + .map(command => command.params.labwareId) + + acc[item.id] = { ...item, tipRack: tiprackIds[0] } + return acc + }, + {} + ) + + return { + ...appData, + designerApplication: { + ...designerApplication, + data: { + ...designerApplication.data, + savedStepForms: { + ...designerApplication.data.savedStepForms, + ...pipettingSavedStepsWithTipRack, + }, + pipetteTiprackAssignments: newTiprackAssignments, + }, + }, + } +} diff --git a/protocol-designer/src/load-file/migration/index.ts b/protocol-designer/src/load-file/migration/index.ts index 5200c70e2d2..16e58a0cce7 100644 --- a/protocol-designer/src/load-file/migration/index.ts +++ b/protocol-designer/src/load-file/migration/index.ts @@ -11,6 +11,7 @@ import { migrateFile as migrateFileFiveTwo } from './5_2_0' import { migrateFile as migrateFileSix } from './6_0_0' import { migrateFile as migrateFileSeven } from './7_0_0' import { migrateFile as migrateFileEight } from './8_0_0' +import { migrateFile as migrateFileEightOne } from './8_1_0' export const OLDEST_MIGRATEABLE_VERSION = '1.0.0' type Version = string @@ -44,6 +45,8 @@ const allMigrationsByVersion: MigrationsByVersion = { '7.0.0': migrateFileSeven, // @ts-expect-error fix MigrationsByVersion type (and the function signatures of the older migration functions above) '8.0.0': migrateFileEight, + // @ts-expect-error + '8.1.0': migrateFileEightOne, } export const migration = ( file: any diff --git a/protocol-designer/src/load-file/migration/utils/getLoadLiquidCommands.ts b/protocol-designer/src/load-file/migration/utils/getLoadLiquidCommands.ts index e5d9da09567..9a48688a1d0 100644 --- a/protocol-designer/src/load-file/migration/utils/getLoadLiquidCommands.ts +++ b/protocol-designer/src/load-file/migration/utils/getLoadLiquidCommands.ts @@ -18,6 +18,7 @@ export interface DesignerApplicationData { } savedStepForms: Record orderedStepIds: string[] + pipetteTiprackAssignments: Record } export const getLoadLiquidCommands = ( diff --git a/protocol-designer/src/localization/en/alert.json b/protocol-designer/src/localization/en/alert.json index f313e7d2eb2..272e51a9363 100644 --- a/protocol-designer/src/localization/en/alert.json +++ b/protocol-designer/src/localization/en/alert.json @@ -96,6 +96,10 @@ "title": "Not enough tips to complete action", "body": "Add another tip rack to an empty slot in " }, + "NO_TIP_SELECTED": { + "title": "No tip rack was selected to complete action", + "body": "Add a tip rack in the step" + }, "NO_TIP_ON_PIPETTE": { "title": "No tip on pipette at the start of step", "body1": "Choose a different Change Tip setting. Change Tip cannot be \"Never\" the first time a pipette is used in a protocol, or following a step that used the ", diff --git a/protocol-designer/src/localization/en/form.json b/protocol-designer/src/localization/en/form.json index 36acb83462f..76876b2f5f0 100644 --- a/protocol-designer/src/localization/en/form.json +++ b/protocol-designer/src/localization/en/form.json @@ -44,6 +44,7 @@ "mixVolumeLabel": "mix volume", "mixRepetitions": "repetitions", "multiDispenseOptionsLabel": "multi-dispense options", + "tipRack": "tip rack", "wellSelectionLabel": { "columns": "columns", "wells": "wells" diff --git a/protocol-designer/src/pipettes/pipetteData.ts b/protocol-designer/src/pipettes/pipetteData.ts index 665d7f674b7..4da240de6b5 100644 --- a/protocol-designer/src/pipettes/pipetteData.ts +++ b/protocol-designer/src/pipettes/pipetteData.ts @@ -2,10 +2,11 @@ import { DropdownOption } from '../../../components/lib/forms/DropdownField.d' import { getPipetteSpecsV2, getTiprackVolume, - PipetteName, + getLabwareDefURI, } from '@opentrons/shared-data' -import { Options } from '@opentrons/components' -import { PipetteEntity } from '@opentrons/step-generation' +import type { PipetteName } from '@opentrons/shared-data' +import type { Options } from '@opentrons/components' +import type { LabwareEntities, PipetteEntity } from '@opentrons/step-generation' const supportedPipetteNames: PipetteName[] = [ 'p10_single', 'p10_multi', @@ -31,16 +32,31 @@ export const pipetteOptions: Options = supportedPipetteNames (option: DropdownOption | null): option is DropdownOption => Boolean(option) ) -// NOTE: this is similar to getPipetteWithTipMaxVol, the fns could potentially -// be merged once multiple tiprack types per pipette is supported -export function getPipetteCapacity(pipetteEntity: PipetteEntity): number { +// NOTE: this is similar to getPipetteWithTipMaxVol, the fns +export const getPipetteCapacity = ( + pipetteEntity: PipetteEntity, + labwareEntities: LabwareEntities, + tipRack?: string | null +): number => { const spec = pipetteEntity.spec - const tiprackDef = pipetteEntity.tiprackLabwareDef + const tiprackDefs = pipetteEntity.tiprackLabwareDef + const tipRackDefUri = + tipRack != null && labwareEntities[tipRack] != null + ? labwareEntities[tipRack]?.labwareDefURI + : '' + let chosenTipRack = null - if (spec && tiprackDef) { + for (const def of tiprackDefs) { + if (getLabwareDefURI(def) === tipRackDefUri) { + chosenTipRack = def + break + } + } + if (spec && tiprackDefs) { return Math.min( spec.liquids.default.maxVolume, - getTiprackVolume(tiprackDef) + // not sure if this is a good way to handle this. chosenTipRack is null until you select it + getTiprackVolume(chosenTipRack ?? tiprackDefs[0]) ) } @@ -48,7 +64,7 @@ export function getPipetteCapacity(pipetteEntity: PipetteEntity): number { false, `Expected spec and tiprack def for pipette ${ pipetteEntity ? pipetteEntity.id : '???' - }` + } and ${tipRack ?? '???'}` ) return NaN } diff --git a/protocol-designer/src/step-forms/selectors/index.ts b/protocol-designer/src/step-forms/selectors/index.ts index 26743741c11..a81846be991 100644 --- a/protocol-designer/src/step-forms/selectors/index.ts +++ b/protocol-designer/src/step-forms/selectors/index.ts @@ -13,6 +13,7 @@ import { PipetteName, MAGNETIC_BLOCK_TYPE, getPipetteSpecsV2, + LabwareDefinition2, } from '@opentrons/shared-data' import { AdditionalEquipmentEntities, @@ -339,7 +340,7 @@ export const getPermittedTipracks: Selector< reduce( initialDeckSetup.pipettes, (acc: string[], pipette: PipetteOnDeck) => { - return pipette.tiprackDefURI ? [...acc, pipette.tiprackDefURI] : acc + return pipette.tiprackDefURI ? [...acc, ...pipette.tiprackDefURI] : acc }, [] ) @@ -400,13 +401,15 @@ export const getPipettesForInstrumentGroup: Selector< pipetteId ) => { const pipetteSpec = pipetteOnDeck.spec - const tiprackDef = pipetteOnDeck.tiprackLabwareDef + const tiprackDefs = pipetteOnDeck.tiprackLabwareDef const pipetteForInstrumentGroup: InstrumentInfoProps = { mount: pipetteOnDeck.mount, pipetteSpecs: pipetteSpec, description: _getPipetteDisplayName(pipetteOnDeck.name), isDisabled: false, - tiprackModel: getLabwareDisplayName(tiprackDef), + tiprackModels: tiprackDefs?.map((def: LabwareDefinition2) => + getLabwareDisplayName(def) + ), } acc[pipetteOnDeck.mount] = pipetteForInstrumentGroup return acc @@ -422,11 +425,13 @@ export const getPipettesForEditPipetteForm: Selector< initialDeckSetup.pipettes, (acc, pipetteOnDeck: PipetteOnDeck, id) => { const pipetteSpec = pipetteOnDeck.spec - const tiprackDef = pipetteOnDeck.tiprackLabwareDef - if (!pipetteSpec || !tiprackDef) return acc + const tiprackDefs = pipetteOnDeck.tiprackLabwareDef + if (!pipetteSpec || !tiprackDefs) return acc const pipetteForInstrumentGroup = { pipetteName: pipetteOnDeck.name, - tiprackDefURI: getLabwareDefURI(tiprackDef), + tiprackDefURI: tiprackDefs.map((def: LabwareDefinition2) => + getLabwareDefURI(def) + ), } acc[pipetteOnDeck.mount] = pipetteForInstrumentGroup return acc diff --git a/protocol-designer/src/step-forms/test/createPresavedStepForm.test.ts b/protocol-designer/src/step-forms/test/createPresavedStepForm.test.ts index 8eb39b8ebce..526c4c784b1 100644 --- a/protocol-designer/src/step-forms/test/createPresavedStepForm.test.ts +++ b/protocol-designer/src/step-forms/test/createPresavedStepForm.test.ts @@ -29,7 +29,8 @@ beforeEach(() => { name: 'p10_single', id: 'leftPipetteId', spec: fixtureP10SingleV2Specs, - tiprackLabwareDef: fixture_tiprack_10_ul, + tiprackLabwareDef: [fixture_tiprack_10_ul], + tiprackDefURI: ['defaultTipRack'], } const labwareOnMagModule = { id: 'labwareOnMagModule', @@ -39,6 +40,10 @@ beforeEach(() => { }, }, } + const tipRack = { + id: 'tipRack', + def: fixture_tiprack_10_ul, + } defaultArgs = { stepId, pipetteEntities: { @@ -61,6 +66,10 @@ beforeEach(() => { slot: 'someMagneticModuleId', }, }, + tipRack: { + ...tipRack, + slot: '6', + }, modules: { someMagneticModuleId: { id: 'someMagneticModuleId', @@ -132,6 +141,7 @@ describe('createPresavedStepForm', () => { pipette: 'leftPipetteId', nozzles: null, stepType: 'moveLiquid', + tipRack: null, // default fields dropTip_location: 'mockTrash', aspirate_airGap_checkbox: false, @@ -209,6 +219,7 @@ describe('createPresavedStepForm', () => { volume: undefined, aspirate_flowRate: null, dispense_flowRate: null, + tipRack: null, }) }) }) diff --git a/protocol-designer/src/step-forms/types.ts b/protocol-designer/src/step-forms/types.ts index 6e700fdaa72..5b88b37d47b 100644 --- a/protocol-designer/src/step-forms/types.ts +++ b/protocol-designer/src/step-forms/types.ts @@ -19,8 +19,8 @@ import { AdditionalEquipmentEntity, } from '@opentrons/step-generation' export interface FormPipette { - pipetteName: string | null | undefined - tiprackDefURI: string | null | undefined + pipetteName?: string | null + tiprackDefURI?: string[] | null } export interface FormPipettesByMount { left: FormPipette diff --git a/protocol-designer/src/step-forms/utils/createPresavedStepForm.ts b/protocol-designer/src/step-forms/utils/createPresavedStepForm.ts index e934b430dc5..1ebfca8bf0c 100644 --- a/protocol-designer/src/step-forms/utils/createPresavedStepForm.ts +++ b/protocol-designer/src/step-forms/utils/createPresavedStepForm.ts @@ -118,6 +118,53 @@ const _patchDefaultDropTipLocation = (args: { return null } +const _patchDefaultTiprack = (args: { + initialDeckSetup: InitialDeckSetup + labwareEntities: LabwareEntities + pipetteEntities: PipetteEntities + savedStepForms: SavedStepFormState + orderedStepIds: OrderedStepIdsState +}): FormUpdater => formData => { + const { + initialDeckSetup, + labwareEntities, + pipetteEntities, + savedStepForms, + orderedStepIds, + } = args + const labware = initialDeckSetup.labware + const tipRackIds = Object.values(labware) + .filter(lw => lw.def.parameters.isTiprack) + .map(lw => lw.id) + + const defaultPipetteId = getNextDefaultPipetteId( + savedStepForms, + orderedStepIds, + initialDeckSetup.pipettes + ) + + const pipetteFirstTiprackDefUri = + pipetteEntities[defaultPipetteId].tiprackDefURI[0] + const defaultTiprackId = tipRackIds.find(id => + id.includes(pipetteFirstTiprackDefUri) + ) + const formHasTipRackField = formData && 'tipRack' in formData + + if (formHasTipRackField && defaultTiprackId != null) { + const updatedFields = handleFormChange( + { + tipRack: defaultTiprackId, + }, + formData, + pipetteEntities, + labwareEntities + ) + return updatedFields + } + + return null +} + const _patchDefaultMagnetFields = (args: { initialDeckSetup: InitialDeckSetup orderedStepIds: OrderedStepIdsState @@ -273,6 +320,14 @@ export const createPresavedStepForm = ({ additionalEquipmentEntities, }) + const updateDefaultTipRack = _patchDefaultTiprack({ + initialDeckSetup, + labwareEntities, + orderedStepIds, + pipetteEntities, + savedStepForms, + }) + const updateDefaultPipette = _patchDefaultPipette({ initialDeckSetup, labwareEntities, @@ -313,6 +368,7 @@ export const createPresavedStepForm = ({ return [ updateDefaultPipette, updateDefaultDropTip, + updateDefaultTipRack, updateTemperatureModuleId, updateThermocyclerFields, updateHeaterShakerModuleId, diff --git a/protocol-designer/src/step-forms/utils/index.ts b/protocol-designer/src/step-forms/utils/index.ts index a9edda43160..73596b481c6 100644 --- a/protocol-designer/src/step-forms/utils/index.ts +++ b/protocol-designer/src/step-forms/utils/index.ts @@ -99,7 +99,7 @@ export function denormalizePipetteEntities( const pipetteEntity: PipetteEntity = { ...pipette, spec, - tiprackLabwareDef: labwareDefs[pipette.tiprackDefURI], + tiprackLabwareDef: pipette.tiprackDefURI.map(def => labwareDefs[def]), } return { ...acc, [pipetteId]: pipetteEntity } }, diff --git a/protocol-designer/src/steplist/fieldLevel/index.ts b/protocol-designer/src/steplist/fieldLevel/index.ts index 03ff1751a45..15dd06279cf 100644 --- a/protocol-designer/src/steplist/fieldLevel/index.ts +++ b/protocol-designer/src/steplist/fieldLevel/index.ts @@ -398,6 +398,9 @@ const stepFieldHelperMap: Record = { getErrors: composeErrors(requiredField), hydrate: getLabwareLocation, }, + tipRack: { + getErrors: composeErrors(requiredField), + }, } const profileFieldHelperMap: Record = { // profile step fields diff --git a/protocol-designer/src/steplist/formLevel/errors.ts b/protocol-designer/src/steplist/formLevel/errors.ts index 69acc572228..64aac638745 100644 --- a/protocol-designer/src/steplist/formLevel/errors.ts +++ b/protocol-designer/src/steplist/formLevel/errors.ts @@ -14,7 +14,7 @@ import { THERMOCYCLER_PROFILE, } from '../../constants' import { StepFieldName } from '../../form-types' - +import type { LabwareEntities } from '@opentrons/step-generation' /******************* ** Error Messages ** ********************/ @@ -136,7 +136,10 @@ interface HydratedFormData { [key: string]: any } -export type FormErrorChecker = (arg: HydratedFormData) => FormError | null +export type FormErrorChecker = ( + arg: HydratedFormData, + labwareEntities?: LabwareEntities +) => FormError | null // TODO: test these /******************* @@ -235,11 +238,18 @@ export const wellRatioMoveLiquid = ( ? null : wellRatioFormError } -export const volumeTooHigh = (fields: HydratedFormData): FormError | null => { - const { pipette } = fields +export const volumeTooHigh = ( + fields: HydratedFormData, + labwareEntities?: LabwareEntities +): FormError | null => { + const { pipette, tipRack } = fields const volume = Number(fields.volume) - const pipetteCapacity = getPipetteCapacity(pipette) + const pipetteCapacity = getPipetteCapacity( + pipette, + labwareEntities ?? {}, + tipRack + ) if ( !Number.isNaN(volume) && !Number.isNaN(pipetteCapacity) && diff --git a/protocol-designer/src/steplist/formLevel/getDefaultsForStepType.ts b/protocol-designer/src/steplist/formLevel/getDefaultsForStepType.ts index 0f63b401350..66656441dd1 100644 --- a/protocol-designer/src/steplist/formLevel/getDefaultsForStepType.ts +++ b/protocol-designer/src/steplist/formLevel/getDefaultsForStepType.ts @@ -36,12 +36,14 @@ export function getDefaultsForStepType( mix_touchTip_mmFromBottom: null, dropTip_location: null, nozzles: null, + tipRack: null, } case 'moveLiquid': return { pipette: null, volume: null, + tipRack: null, changeTip: DEFAULT_CHANGE_TIP_OPTION, path: 'single', aspirate_wells_grouped: false, diff --git a/protocol-designer/src/steplist/formLevel/handleFormChange/dependentFieldsUpdateMoveLiquid.ts b/protocol-designer/src/steplist/formLevel/handleFormChange/dependentFieldsUpdateMoveLiquid.ts index b434afb3846..86df6366716 100644 --- a/protocol-designer/src/steplist/formLevel/handleFormChange/dependentFieldsUpdateMoveLiquid.ts +++ b/protocol-designer/src/steplist/formLevel/handleFormChange/dependentFieldsUpdateMoveLiquid.ts @@ -132,7 +132,8 @@ const wellRatioUpdater = makeConditionalPatchUpdater(wellRatioUpdatesMap) export function updatePatchPathField( patch: FormPatch, rawForm: FormData, - pipetteEntities: PipetteEntities + pipetteEntities: PipetteEntities, + labwareEntities: LabwareEntities ): FormPatch { const { id, stepType, ...stepData } = rawForm const appliedPatch = { ...(stepData as FormPatch), ...patch } @@ -153,7 +154,8 @@ export function updatePatchPathField( pipetteCapacityExceeded = !volumeInCapacityForMulti( // @ts-expect-error(sa, 2021-6-14): appliedPatch is not of type FormData, address in #3161 appliedPatch, - pipetteEntities + pipetteEntities, + labwareEntities ) } @@ -266,6 +268,7 @@ const clampAspirateAirGapVolume = ( const patchedAspirateAirgapVolume = patch.aspirate_airGap_volume ?? rawForm?.aspirate_airGap_volume const pipetteId = patch.pipette ?? rawForm.pipette + const tipRack = rawForm.tipRack if ( patchedAspirateAirgapVolume && @@ -276,7 +279,8 @@ const clampAspirateAirGapVolume = ( const minPipetteVolume = getMinPipetteVolume(pipetteEntity) const minAirGapVolume = 0 // NOTE: a form level warning will occur if the air gap volume is below the pipette min volume - const maxAirGapVolume = getPipetteCapacity(pipetteEntity) - minPipetteVolume + const maxAirGapVolume = + getPipetteCapacity(pipetteEntity, tipRack) - minPipetteVolume const clampedAirGapVolume = clamp( Number(patchedAspirateAirgapVolume), minAirGapVolume, @@ -293,7 +297,8 @@ const clampAspirateAirGapVolume = ( const clampDispenseAirGapVolume = ( patch: FormPatch, rawForm: FormData, - pipetteEntities: PipetteEntities + pipetteEntities: PipetteEntities, + labwareEntities: LabwareEntities ): FormPatch => { const { id, stepType, ...stepData } = rawForm const appliedPatch = { ...(stepData as FormPatch), ...patch, id, stepType } @@ -308,7 +313,8 @@ const clampDispenseAirGapVolume = ( const transferVolume = Number(appliedPatch.volume) // @ts-expect-error(sa, 2021-6-14): appliedPatch.dispense_airGap_volume does not exist. Address in #3161 const dispenseAirGapVolume = Number(appliedPatch.dispense_airGap_volume) - + // @ts-expect-error(jr, 2023-7-21): appliedPatch.tipRack does not exist + const tipRack = String(appliedPatch.tipRack) if ( // @ts-expect-error(sa, 2021-6-14): appliedPatch.dispense_airGap_volume does not exist. Address in #3161 appliedPatch.dispense_airGap_volume && @@ -316,7 +322,7 @@ const clampDispenseAirGapVolume = ( pipetteId in pipetteEntities ) { const pipetteEntity = pipetteEntities[pipetteId] - const capacity = getPipetteCapacity(pipetteEntity) + const capacity = getPipetteCapacity(pipetteEntity, labwareEntities, tipRack) const minAirGapVolume = 0 // NOTE: a form level warning will occur if the air gap volume is below the pipette min volume const maxAirGapVolume = @@ -396,7 +402,8 @@ const updatePatchDisposalVolumeFields = ( const clampDisposalVolume = ( patch: FormPatch, rawForm: FormData, - pipetteEntities: PipetteEntities + pipetteEntities: PipetteEntities, + labwareEntities: LabwareEntities ): FormPatch => { const { id, stepType, ...stepData } = rawForm const appliedPatch = { ...(stepData as FormPatch), ...patch, id, stepType } @@ -407,7 +414,8 @@ const clampDisposalVolume = ( const maxDisposalVolume = getMaxDisposalVolumeForMultidispense( // @ts-expect-error(sa, 2021-6-14): appliedPatch isn't well-typed, address in #3161 appliedPatch, - pipetteEntities + pipetteEntities, + labwareEntities ) if (maxDisposalVolume == null) { @@ -631,15 +639,32 @@ export function dependentFieldsUpdateMoveLiquid( chainPatch => updatePatchOnPipetteChange(chainPatch, rawForm, pipetteEntities), chainPatch => updatePatchOnWellRatioChange(chainPatch, rawForm), - chainPatch => updatePatchPathField(chainPatch, rawForm, pipetteEntities), + chainPatch => + updatePatchPathField( + chainPatch, + rawForm, + pipetteEntities, + labwareEntities + ), chainPatch => updatePatchDisposalVolumeFields(chainPatch, rawForm, pipetteEntities), chainPatch => clampAspirateAirGapVolume(chainPatch, rawForm, pipetteEntities), - chainPatch => clampDisposalVolume(chainPatch, rawForm, pipetteEntities), + chainPatch => + clampDisposalVolume( + chainPatch, + rawForm, + pipetteEntities, + labwareEntities + ), chainPatch => updatePatchMixFields(chainPatch, rawForm), chainPatch => updatePatchBlowoutFields(chainPatch, rawForm), chainPatch => - clampDispenseAirGapVolume(chainPatch, rawForm, pipetteEntities), + clampDispenseAirGapVolume( + chainPatch, + rawForm, + pipetteEntities, + labwareEntities + ), ]) } 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 45a2ca8582c..692ee51fe0d 100644 --- a/protocol-designer/src/steplist/formLevel/handleFormChange/test/moveLiquid.test.ts +++ b/protocol-designer/src/steplist/formLevel/handleFormChange/test/moveLiquid.test.ts @@ -35,15 +35,15 @@ beforeEach(() => { name: 'p10_single', spec: fixtureP10SingleV2Specs, // @ts-expect-error(sa, 2021-6-15): tiprackModel does not exist on PipetteEntity - tiprackModel: 'tiprack-10ul', - tiprackLabwareDef: fixtureTiprack10ul, + tiprackModel: ['tiprack-10ul'], + tiprackLabwareDef: [fixtureTiprack10ul], }, otherPipetteId: { name: 'p300_single_gen2', spec: fixtureP300SingleV2Specs, // @ts-expect-error(sa, 2021-6-15): tiprackModel does not exist on PipetteEntity - tiprackModel: 'tiprack-300ul', - tiprackLabwareDef: fixtureTiprack300ul, + tiprackModel: ['tiprack-300ul'], + tiprackLabwareDef: [fixtureTiprack300ul], }, } labwareEntities = {} 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 7217b6e46d5..0170b4ef399 100644 --- a/protocol-designer/src/steplist/formLevel/handleFormChange/test/utils.test.ts +++ b/protocol-designer/src/steplist/formLevel/handleFormChange/test/utils.test.ts @@ -1,15 +1,16 @@ import { describe, it, beforeEach, expect } from 'vitest' -import { - fixtureP300SingleV2Specs, - LabwareDefinition2, -} from '@opentrons/shared-data' +import { fixtureP300SingleV2Specs } from '@opentrons/shared-data' import { volumeInCapacityForMulti, volumeInCapacityForMultiAspirate, volumeInCapacityForMultiDispense, } from '../utils' import { fixture_tiprack_300_ul } from '@opentrons/shared-data/labware/fixtures/2' -import type { PipetteEntities } from '@opentrons/step-generation' +import type { LabwareDefinition2 } from '@opentrons/shared-data' +import type { + PipetteEntities, + LabwareEntities, +} from '@opentrons/step-generation' import type { FormData } from '../../../../form-types' const fixtureTiprack300ul = fixture_tiprack_300_ul as LabwareDefinition2 @@ -18,6 +19,7 @@ describe('utils', () => { describe('volumeInCapacityForMulti', () => { let sharedForm: FormData let pipetteEntities: PipetteEntities + let labwareEntities: LabwareEntities beforeEach(() => { sharedForm = { pipette: 'p300_single', @@ -25,9 +27,10 @@ describe('utils', () => { pipetteEntities = { p300_single: { spec: fixtureP300SingleV2Specs, - tiprackLabwareDef: fixtureTiprack300ul, + tiprackLabwareDef: [fixtureTiprack300ul], }, } as any + labwareEntities = {} }) describe('multi dispense path', () => { const testCases = [ @@ -89,7 +92,8 @@ describe('utils', () => { expect( volumeInCapacityForMulti( { ...sharedForm, ...form }, - pipetteEntities + pipetteEntities, + labwareEntities ) ).toBe(expected) }) @@ -146,7 +150,8 @@ describe('utils', () => { expect( volumeInCapacityForMulti( { ...sharedForm, ...form }, - pipetteEntities + pipetteEntities, + labwareEntities ) ).toBe(expected) }) diff --git a/protocol-designer/src/steplist/formLevel/handleFormChange/utils.ts b/protocol-designer/src/steplist/formLevel/handleFormChange/utils.ts index 669dbe5a8ac..4ec62eb354d 100644 --- a/protocol-designer/src/steplist/formLevel/handleFormChange/utils.ts +++ b/protocol-designer/src/steplist/formLevel/handleFormChange/utils.ts @@ -57,8 +57,10 @@ export function getMaxDisposalVolumeForMultidispense( path: PathOption pipette: string | null volume: string | null + tipRack?: string | null }, - pipetteEntities: PipetteEntities + pipetteEntities: PipetteEntities, + labwareEntities: LabwareEntities ): number | null | undefined { // calculate max disposal volume for given volume & pipette. Might be negative! const pipetteId = values?.pipette @@ -68,7 +70,11 @@ export function getMaxDisposalVolumeForMultidispense( `getMaxDisposalVolumeForMultidispense expected multiDispense, got path ${values.path}` ) const pipetteEntity = pipetteEntities[pipetteId] - const pipetteCapacity = getPipetteCapacity(pipetteEntity) + const pipetteCapacity = getPipetteCapacity( + pipetteEntity, + labwareEntities, + values.tipRack + ) const volume = Number(values.volume) const airGapChecked = values.aspirate_airGap_checkbox let airGapVolume = airGapChecked ? Number(values.aspirate_airGap_volume) : 0 @@ -80,14 +86,17 @@ export function getMaxDisposalVolumeForMultidispense( // is responsibility of dependentFieldsUpdateMoveLiquid's clamp fn export function volumeInCapacityForMulti( rawForm: FormData, - pipetteEntities: PipetteEntities + pipetteEntities: PipetteEntities, + labwareEntities: LabwareEntities ): boolean { console.assert( rawForm.pipette in pipetteEntities, `volumeInCapacityForMulti expected pipette ${rawForm.pipette} to be in pipetteEntities` ) const pipetteEntity = pipetteEntities[rawForm.pipette] - const pipetteCapacity = pipetteEntity && getPipetteCapacity(pipetteEntity) + const pipetteCapacity = + pipetteEntity && + getPipetteCapacity(pipetteEntity, labwareEntities, rawForm.tipRack) const volume = Number(rawForm.volume) const airGapChecked = rawForm.aspirate_airGap_checkbox let airGapVolume = airGapChecked ? Number(rawForm.aspirate_airGap_volume) : 0 diff --git a/protocol-designer/src/steplist/formLevel/stepFormToArgs/mixFormToArgs.ts b/protocol-designer/src/steplist/formLevel/stepFormToArgs/mixFormToArgs.ts index af486618c7a..741355f95a0 100644 --- a/protocol-designer/src/steplist/formLevel/stepFormToArgs/mixFormToArgs.ts +++ b/protocol-designer/src/steplist/formLevel/stepFormToArgs/mixFormToArgs.ts @@ -18,7 +18,8 @@ export const mixFormToArgs = ( const { labware, pipette, dropTip_location, nozzles } = hydratedFormData const matchingTipLiquidSpecs = getMatchingTipLiquidSpecs( pipette, - hydratedFormData.volume + hydratedFormData.volume, + hydratedFormData.tipRack ) const unorderedWells = hydratedFormData.wells || [] const orderFirst = hydratedFormData.mix_wellOrder_first @@ -100,6 +101,7 @@ export const mixFormToArgs = ( dispenseOffsetFromBottomMm, blowoutOffsetFromTopMm, aspirateDelaySeconds, + tipRack: hydratedFormData.tipRack, dispenseDelaySeconds, dropTipLocation: dropTip_location, nozzles, diff --git a/protocol-designer/src/steplist/formLevel/stepFormToArgs/moveLiquidFormToArgs.ts b/protocol-designer/src/steplist/formLevel/stepFormToArgs/moveLiquidFormToArgs.ts index cfb8a10683e..7d330f54dbf 100644 --- a/protocol-designer/src/steplist/formLevel/stepFormToArgs/moveLiquidFormToArgs.ts +++ b/protocol-designer/src/steplist/formLevel/stepFormToArgs/moveLiquidFormToArgs.ts @@ -76,6 +76,7 @@ export const moveLiquidFormToArgs = ( dispense_wells: destWellsUnordered, dropTip_location: dropTipLocation, path, + tipRack, nozzles, } = fields let sourceWells = getOrderedWells( @@ -173,13 +174,15 @@ export const moveLiquidFormToArgs = ( ) const matchingTipLiquidSpecs = getMatchingTipLiquidSpecs( fields.pipette, - fields.volume + fields.volume, + tipRack ) const commonFields = { pipette: pipetteId, volume, sourceLabware: sourceLabware.id, destLabware: destLabware.id, + tipRack: tipRack, aspirateFlowRateUlSec: fields.aspirate_flowRate || matchingTipLiquidSpecs.defaultAspirateFlowRate.default, 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 c9958a03600..acab5215075 100644 --- a/protocol-designer/src/steplist/formLevel/stepFormToArgs/test/mixFormToArgs.test.ts +++ b/protocol-designer/src/steplist/formLevel/stepFormToArgs/test/mixFormToArgs.test.ts @@ -36,17 +36,21 @@ beforeEach(() => { blowout_checkbox: false, blowout_location: null, mix_mmFromBottom: 0.5, + tipRack: 'mockTiprack', pipette: { id: 'pipetteId', spec: fixtureP10SingleV2Specs, - tiprackLabwareDef: { - parameters: { - tipLength: 10, + tiprackLabwareDef: [ + { + parameters: { + tipLength: 10, + loadName: 'mockTiprack', + }, + metadata: { + displayName: 'mock display name', + }, }, - metadata: { - displayName: 'mock display name', - }, - } as any, + ] as any, } as any, // @ts-expect-error(sa, 2021-6-15): volume should be a number volume: '12', 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 8ff3a23b44a..6c132984b89 100644 --- a/protocol-designer/src/steplist/formLevel/stepFormToArgs/test/moveLiquidFormToArgs.test.ts +++ b/protocol-designer/src/steplist/formLevel/stepFormToArgs/test/moveLiquidFormToArgs.test.ts @@ -47,14 +47,17 @@ describe('move liquid step form -> command creator args', () => { pipette: { id: 'pipetteId', spec: fixtureP10SingleV2Specs, - tiprackLabwareDef: { - parameters: { - tipLength: 10, + tiprackLabwareDef: [ + { + parameters: { + tipLength: 10, + loadName: 'mockTiprack', + }, + metadata: { + displayName: 'mock display name', + }, }, - metadata: { - displayName: 'mock display name', - }, - } as any, + ] as any, } as any, volume: 10, path: 'single', @@ -65,6 +68,7 @@ describe('move liquid step form -> command creator args', () => { type: sourceLabwareType, def: sourceLabwareDef, }, + tipRack: 'mockTiprack', aspirate_wells: [ASPIRATE_WELL], aspirate_wellOrder_first: 'l2r', aspirate_wellOrder_second: 't2b', diff --git a/protocol-designer/src/steplist/formLevel/test/errors.test.ts b/protocol-designer/src/steplist/formLevel/test/errors.test.ts index 5488d9d37a0..13aadefc325 100644 --- a/protocol-designer/src/steplist/formLevel/test/errors.test.ts +++ b/protocol-designer/src/steplist/formLevel/test/errors.test.ts @@ -2,10 +2,13 @@ import { it, describe, expect, beforeEach } from 'vitest' import { fixture_tiprack_10_ul } from '@opentrons/shared-data/labware/fixtures/2' import { volumeTooHigh } from '../errors' +const mockTiprack = 'mockTiprack:fixture_tiprack_10_ul/1' + describe('volumeTooHigh', () => { let fieldsWithPipette: any // this is any typed because HydratedFormData in formLevel/errors is any typed :( beforeEach(() => { fieldsWithPipette = { + tipRack: mockTiprack, pipette: { spec: { liquids: { @@ -14,7 +17,7 @@ describe('volumeTooHigh', () => { }, }, }, - tiprackLabwareDef: { ...fixture_tiprack_10_ul }, // max tip volume is 10 ul + tiprackLabwareDef: [{ ...fixture_tiprack_10_ul }], // max tip volume is 10 ul }, } }) diff --git a/protocol-designer/src/steplist/formLevel/test/getDefaultsForStepType.test.ts b/protocol-designer/src/steplist/formLevel/test/getDefaultsForStepType.test.ts index 43497429ea3..84803e31a74 100644 --- a/protocol-designer/src/steplist/formLevel/test/getDefaultsForStepType.test.ts +++ b/protocol-designer/src/steplist/formLevel/test/getDefaultsForStepType.test.ts @@ -65,6 +65,7 @@ describe('getDefaultsForStepType', () => { dispense_delay_checkbox: false, dispense_delay_seconds: `${DEFAULT_DELAY_SECONDS}`, dispense_delay_mmFromBottom: null, + tipRack: null, }) }) }) @@ -92,6 +93,7 @@ describe('getDefaultsForStepType', () => { wells: [], aspirate_flowRate: null, dispense_flowRate: null, + tipRack: null, }) }) }) diff --git a/protocol-designer/src/steplist/generateSubstepItem.ts b/protocol-designer/src/steplist/generateSubstepItem.ts index feab0f670d4..f16b48f412c 100644 --- a/protocol-designer/src/steplist/generateSubstepItem.ts +++ b/protocol-designer/src/steplist/generateSubstepItem.ts @@ -58,6 +58,7 @@ function getCommandCreatorForTransferlikeSubsteps( mixBeforeAspirate: null, mixInDestination: null, preWetTip: false, + tiprack: stepArgs.tipRack, } return curryCommandCreator(transfer, commandCallArgs) } else if (stepArgs.commandCreatorFnName === 'distribute') { @@ -74,6 +75,7 @@ function getCommandCreatorForTransferlikeSubsteps( // set special values for substeps mixBeforeAspirate: null, preWetTip: false, + tiprack: stepArgs.tipRack, } return curryCommandCreator(distribute, commandCallArgs) } else if (stepArgs.commandCreatorFnName === 'consolidate') { @@ -91,6 +93,7 @@ function getCommandCreatorForTransferlikeSubsteps( mixFirstAspirate: null, mixInDestination: null, preWetTip: false, + tiprack: stepArgs.tipRack, } return curryCommandCreator(consolidate, commandCallArgs) } else if (stepArgs.commandCreatorFnName === 'mix') { diff --git a/protocol-designer/src/steplist/test/generateSubsteps.test.ts b/protocol-designer/src/steplist/test/generateSubsteps.test.ts index 60b882a4b20..df8c3f5c334 100644 --- a/protocol-designer/src/steplist/test/generateSubsteps.test.ts +++ b/protocol-designer/src/steplist/test/generateSubsteps.test.ts @@ -161,6 +161,7 @@ describe('generateSubstepItem', () => { dispenseFlowRateUlSec: number dispenseOffsetFromBottomMm: number dropTipLocation: string + tipRack: string } beforeEach(() => { sharedArgs = { @@ -180,6 +181,7 @@ describe('generateSubstepItem', () => { dispenseFlowRateUlSec: 5, dispenseOffsetFromBottomMm: 10, dropTipLocation: FIXED_TRASH_ID, + tipRack: 'tiprack1Id', } }) ;[ @@ -398,6 +400,7 @@ describe('generateSubstepItem', () => { aspirateFlowRateUlSec: 5, dispenseFlowRateUlSec: 5, dropTipLocation: FIXED_TRASH_ID, + tipRack: 'tiprack1Id', }, // @ts-expect-error(sa, 2021-6-15): errors should be boolean typed errors: {}, diff --git a/protocol-designer/src/timelineMiddleware/__tests__/generateRobotStateTimeline.test.ts b/protocol-designer/src/timelineMiddleware/__tests__/generateRobotStateTimeline.test.ts index dc4589e8515..ede96f0be52 100644 --- a/protocol-designer/src/timelineMiddleware/__tests__/generateRobotStateTimeline.test.ts +++ b/protocol-designer/src/timelineMiddleware/__tests__/generateRobotStateTimeline.test.ts @@ -49,6 +49,7 @@ describe('generateRobotStateTimeline', () => { mixBeforeAspirate: null, description: null, nozzles: null, + tipRack: 'tiprack1Id', }, }, b: { @@ -84,6 +85,7 @@ describe('generateRobotStateTimeline', () => { mixBeforeAspirate: null, description: null, nozzles: null, + tipRack: 'tiprack1Id', }, }, c: { @@ -111,6 +113,7 @@ describe('generateRobotStateTimeline', () => { aspirateDelaySeconds: null, dispenseDelaySeconds: null, nozzles: null, + tipRack: 'tiprack1Id', }, }, } diff --git a/protocol-designer/src/ui/labware/selectors.ts b/protocol-designer/src/ui/labware/selectors.ts index 61d5f5dab7a..dd4be8f0c62 100644 --- a/protocol-designer/src/ui/labware/selectors.ts +++ b/protocol-designer/src/ui/labware/selectors.ts @@ -240,3 +240,38 @@ export const getDisposalOptions = createSelector( : trashBins } ) + +export const getTiprackOptions: Selector = createSelector( + stepFormSelectors.getLabwareEntities, + getLabwareNicknamesById, + (labwareEntities, nicknamesById) => { + const options = reduce( + labwareEntities, + ( + acc: Options, + labwareEntity: LabwareEntity, + labwareId: string + ): Options => { + const labwareDefURI = labwareEntity.labwareDefURI + const optionValues = acc.map(option => option.value) + + if ( + optionValues.includes(labwareDefURI) || + !getIsTiprack(labwareEntity.def) + ) { + return acc + } else { + return [ + ...acc, + { + name: nicknamesById[labwareId], + value: labwareId, + }, + ] + } + }, + [] + ) + return _sortLabwareDropdownOptions(options) + } +) diff --git a/protocol-designer/src/ui/steps/test/selectors.test.ts b/protocol-designer/src/ui/steps/test/selectors.test.ts index cc13c344d37..5cf64a59160 100644 --- a/protocol-designer/src/ui/steps/test/selectors.test.ts +++ b/protocol-designer/src/ui/steps/test/selectors.test.ts @@ -414,6 +414,10 @@ describe('_getSavedMultiSelectFieldValues', () => { ) ).toEqual({ // aspirate settings + tipRack: { + isIndeterminate: false, + value: undefined, + }, aspirate_labware: { value: 'aspirate_labware_id', isIndeterminate: false, @@ -598,6 +602,7 @@ describe('_getSavedMultiSelectFieldValues', () => { mockSavedStepFormsIndeterminate = { ...getMockMoveLiquidStep(), // just doing this so the ids are not the exact same + tipRack: 'mockTiprack', another_move_liquid_step_id: { ...getMockMoveLiquidStep().move_liquid_step_id, aspirate_labware: 'other_asp_labware', @@ -646,6 +651,9 @@ describe('_getSavedMultiSelectFieldValues', () => { aspirate_labware: { isIndeterminate: true, }, + tipRack: { + isIndeterminate: false, + }, aspirate_flowRate: { isIndeterminate: true, }, @@ -822,6 +830,7 @@ describe('_getSavedMultiSelectFieldValues', () => { ) ).toEqual({ volume: { value: '100', isIndeterminate: false }, + tipRack: { isIndeterminate: false }, times: { value: null, isIndeterminate: false }, changeTip: { value: 'always', isIndeterminate: false }, labware: { value: 'some_labware_id', isIndeterminate: false }, @@ -890,6 +899,7 @@ describe('_getSavedMultiSelectFieldValues', () => { mockMixMultiSelectItemIds ) ).toEqual({ + tipRack: { isIndeterminate: false }, volume: { isIndeterminate: true }, times: { isIndeterminate: true }, changeTip: { isIndeterminate: true }, diff --git a/protocol-designer/src/utils/index.ts b/protocol-designer/src/utils/index.ts index d94276ed3a4..28c91fd2aad 100644 --- a/protocol-designer/src/utils/index.ts +++ b/protocol-designer/src/utils/index.ts @@ -200,13 +200,25 @@ export const getCutoutIdByAddressableArea = ( export function getMatchingTipLiquidSpecs( pipetteEntity: PipetteEntity, - volume: number + volume: number, + tiprack: string ): SupportedTip { - const tipLength = pipetteEntity.tiprackLabwareDef.parameters.tipLength ?? 0 + const matchingLabwareDef = Object.values( + pipetteEntity.tiprackLabwareDef + ).find(def => tiprack.includes(def.parameters.loadName)) + + console.assert( + matchingLabwareDef, + `expected to find a matching labware def with tiprack ${tiprack} but could not` + ) + + const tipLength = matchingLabwareDef?.parameters.tipLength ?? 0 if (tipLength === 0) { console.error( - `expected to find a tiplength with tiprack ${pipetteEntity.tiprackLabwareDef.metadata.displayName} but could not` + `expected to find a tiplength with tiprack ${ + matchingLabwareDef?.metadata.displayName ?? 'unknown displayName' + } but could not` ) } @@ -227,7 +239,9 @@ export function getMatchingTipLiquidSpecs( })[0] console.assert( matchingTipLiquidSpecs, - `expected to find the tip liquid specs but could not with pipette tiprack displayname ${pipetteEntity.tiprackLabwareDef.metadata.displayName}` + `expected to find the tip liquid specs but could not with pipette tiprack displayname ${ + matchingLabwareDef?.metadata.displayName ?? 'unknown displayname' + }` ) return matchingTipLiquidSpecs diff --git a/step-generation/src/__tests__/__snapshots__/fixtureGeneration.test.ts.snap b/step-generation/src/__tests__/__snapshots__/fixtureGeneration.test.ts.snap index bac267f3a21..57b519dba68 100644 --- a/step-generation/src/__tests__/__snapshots__/fixtureGeneration.test.ts.snap +++ b/step-generation/src/__tests__/__snapshots__/fixtureGeneration.test.ts.snap @@ -10544,28 +10544,139 @@ exports[`snapshot tests > makeContext 1`] = ` "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": [ + "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", @@ -10574,6 +10685,8 @@ exports[`snapshot tests > makeContext 1`] = ` "F1", "G1", "H1", + ], + [ "A2", "B2", "C2", @@ -10582,6 +10695,8 @@ exports[`snapshot tests > makeContext 1`] = ` "F2", "G2", "H2", + ], + [ "A3", "B3", "C3", @@ -10590,6 +10705,8 @@ exports[`snapshot tests > makeContext 1`] = ` "F3", "G3", "H3", + ], + [ "A4", "B4", "C4", @@ -10598,6 +10715,8 @@ exports[`snapshot tests > makeContext 1`] = ` "F4", "G4", "H4", + ], + [ "A5", "B5", "C5", @@ -10606,6 +10725,8 @@ exports[`snapshot tests > makeContext 1`] = ` "F5", "G5", "H5", + ], + [ "A6", "B6", "C6", @@ -10614,6 +10735,8 @@ exports[`snapshot tests > makeContext 1`] = ` "F6", "G6", "H6", + ], + [ "A7", "B7", "C7", @@ -10622,6 +10745,8 @@ exports[`snapshot tests > makeContext 1`] = ` "F7", "G7", "H7", + ], + [ "A8", "B8", "C8", @@ -10630,6 +10755,8 @@ exports[`snapshot tests > makeContext 1`] = ` "F8", "G8", "H8", + ], + [ "A9", "B9", "C9", @@ -10638,6 +10765,8 @@ exports[`snapshot tests > makeContext 1`] = ` "F9", "G9", "H9", + ], + [ "A10", "B10", "C10", @@ -10646,6 +10775,8 @@ exports[`snapshot tests > makeContext 1`] = ` "F10", "G10", "H10", + ], + [ "A11", "B11", "C11", @@ -10654,6 +10785,8 @@ exports[`snapshot tests > makeContext 1`] = ` "F11", "G11", "H11", + ], + [ "A12", "B12", "C12", @@ -10663,6741 +10796,6628 @@ exports[`snapshot tests > makeContext 1`] = ` "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", - ], - [ - "A7", - "B7", - "C7", - "D7", - "E7", - "F7", - "G7", - "H7", - ], - [ - "A8", - "B8", - "C8", - "D8", - "E8", - "F8", - "G8", - "H8", - ], - [ - "A9", - "B9", - "C9", - "D9", - "E9", - "F9", - "G9", - "H9", - ], - [ - "A10", - "B10", - "C10", - "D10", - "E10", - "F10", - "G10", - "H10", - ], - [ - "A11", - "B11", - "C11", - "D11", - "E11", - "F11", - "G11", - "H11", - ], - [ - "A12", - "B12", - "C12", - "D12", - "E12", - "F12", - "G12", - "H12", ], - ], - "parameters": { - "format": "96Standard", - "isMagneticModuleCompatible": false, - "isTiprack": true, - "loadName": "fixture_flex_96_tiprack_1000ul", - "quirks": [], - "tipLength": 95.6, - "tipOverlap": 10.5, - }, - "schemaVersion": 2, - "stackingOffsetWithLabware": { - "opentrons_flex_96_tiprack_adapter": { - "x": 0, - "y": 0, - "z": 121, - }, - }, - "version": 1, - "wells": { - "A1": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 14.38, - "y": 74.38, - "z": 1.5, - }, - "A10": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 95.38, - "y": 74.38, - "z": 1.5, - }, - "A11": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 104.38, - "y": 74.38, - "z": 1.5, - }, - "A12": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 113.38, - "y": 74.38, - "z": 1.5, - }, - "A2": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 23.38, - "y": 74.38, - "z": 1.5, - }, - "A3": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 32.38, - "y": 74.38, - "z": 1.5, - }, - "A4": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 41.38, - "y": 74.38, - "z": 1.5, + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "fixture_flex_96_tiprack_1000ul", + "quirks": [], + "tipLength": 95.6, + "tipOverlap": 10.5, + }, + "schemaVersion": 2, + "stackingOffsetWithLabware": { + "opentrons_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 121, + }, }, - "A5": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 50.38, - "y": 74.38, - "z": 1.5, - }, - "A6": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 59.38, - "y": 74.38, - "z": 1.5, + "version": 1, + "wells": { + "A1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 74.38, + "z": 1.5, + }, + "A10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 74.38, + "z": 1.5, + }, + "A11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 74.38, + "z": 1.5, + }, + "A12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 74.38, + "z": 1.5, + }, + "A2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 74.38, + "z": 1.5, + }, + "A3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 74.38, + "z": 1.5, + }, + "A4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 74.38, + "z": 1.5, + }, + "A5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 74.38, + "z": 1.5, + }, + "A6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 74.38, + "z": 1.5, + }, + "A7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 74.38, + "z": 1.5, + }, + "A8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 74.38, + "z": 1.5, + }, + "A9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 74.38, + "z": 1.5, + }, + "B1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 65.38, + "z": 1.5, + }, + "B10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 65.38, + "z": 1.5, + }, + "B11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 65.38, + "z": 1.5, + }, + "B12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 65.38, + "z": 1.5, + }, + "B2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 65.38, + "z": 1.5, + }, + "B3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 65.38, + "z": 1.5, + }, + "B4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 65.38, + "z": 1.5, + }, + "B5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 65.38, + "z": 1.5, + }, + "B6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 65.38, + "z": 1.5, + }, + "B7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 65.38, + "z": 1.5, + }, + "B8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 65.38, + "z": 1.5, + }, + "B9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 65.38, + "z": 1.5, + }, + "C1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 56.38, + "z": 1.5, + }, + "C10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 56.38, + "z": 1.5, + }, + "C11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 56.38, + "z": 1.5, + }, + "C12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 56.38, + "z": 1.5, + }, + "C2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 56.38, + "z": 1.5, + }, + "C3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 56.38, + "z": 1.5, + }, + "C4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 56.38, + "z": 1.5, + }, + "C5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 56.38, + "z": 1.5, + }, + "C6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 56.38, + "z": 1.5, + }, + "C7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 56.38, + "z": 1.5, + }, + "C8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 56.38, + "z": 1.5, + }, + "C9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 56.38, + "z": 1.5, + }, + "D1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 47.38, + "z": 1.5, + }, + "D10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 47.38, + "z": 1.5, + }, + "D11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 47.38, + "z": 1.5, + }, + "D12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 47.38, + "z": 1.5, + }, + "D2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 47.38, + "z": 1.5, + }, + "D3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 47.38, + "z": 1.5, + }, + "D4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 47.38, + "z": 1.5, + }, + "D5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 47.38, + "z": 1.5, + }, + "D6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 47.38, + "z": 1.5, + }, + "D7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 47.38, + "z": 1.5, + }, + "D8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 47.38, + "z": 1.5, + }, + "D9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 47.38, + "z": 1.5, + }, + "E1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 38.38, + "z": 1.5, + }, + "E10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 38.38, + "z": 1.5, + }, + "E11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 38.38, + "z": 1.5, + }, + "E12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 38.38, + "z": 1.5, + }, + "E2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 38.38, + "z": 1.5, + }, + "E3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 38.38, + "z": 1.5, + }, + "E4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 38.38, + "z": 1.5, + }, + "E5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 38.38, + "z": 1.5, + }, + "E6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 38.38, + "z": 1.5, + }, + "E7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 38.38, + "z": 1.5, + }, + "E8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 38.38, + "z": 1.5, + }, + "E9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 38.38, + "z": 1.5, + }, + "F1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 29.38, + "z": 1.5, + }, + "F10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 29.38, + "z": 1.5, + }, + "F11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 29.38, + "z": 1.5, + }, + "F12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 29.38, + "z": 1.5, + }, + "F2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 29.38, + "z": 1.5, + }, + "F3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 29.38, + "z": 1.5, + }, + "F4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 29.38, + "z": 1.5, + }, + "F5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 29.38, + "z": 1.5, + }, + "F6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 29.38, + "z": 1.5, + }, + "F7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 29.38, + "z": 1.5, + }, + "F8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 29.38, + "z": 1.5, + }, + "F9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 29.38, + "z": 1.5, + }, + "G1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 20.38, + "z": 1.5, + }, + "G10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 20.38, + "z": 1.5, + }, + "G11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 20.38, + "z": 1.5, + }, + "G12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 20.38, + "z": 1.5, + }, + "G2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 20.38, + "z": 1.5, + }, + "G3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 20.38, + "z": 1.5, + }, + "G4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 20.38, + "z": 1.5, + }, + "G5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 20.38, + "z": 1.5, + }, + "G6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 20.38, + "z": 1.5, + }, + "G7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 20.38, + "z": 1.5, + }, + "G8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 20.38, + "z": 1.5, + }, + "G9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 20.38, + "z": 1.5, + }, + "H1": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 14.38, + "y": 11.38, + "z": 1.5, + }, + "H10": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 95.38, + "y": 11.38, + "z": 1.5, + }, + "H11": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 104.38, + "y": 11.38, + "z": 1.5, + }, + "H12": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 113.38, + "y": 11.38, + "z": 1.5, + }, + "H2": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 23.38, + "y": 11.38, + "z": 1.5, + }, + "H3": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 32.38, + "y": 11.38, + "z": 1.5, + }, + "H4": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 41.38, + "y": 11.38, + "z": 1.5, + }, + "H5": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 50.38, + "y": 11.38, + "z": 1.5, + }, + "H6": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 59.38, + "y": 11.38, + "z": 1.5, + }, + "H7": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 68.38, + "y": 11.38, + "z": 1.5, + }, + "H8": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 77.38, + "y": 11.38, + "z": 1.5, + }, + "H9": { + "depth": 97.5, + "diameter": 5.47, + "shape": "circular", + "totalLiquidVolume": 1000, + "x": 86.38, + "y": 11.38, + "z": 1.5, + }, }, - "A7": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 68.38, - "y": 74.38, - "z": 1.5, + }, + ], + }, + "p10MultiId": { + "id": "p10MultiId", + "name": "p10_multi", + "spec": { + "$otSharedSchema": "#/pipette/schemas/2/pipetteGeometrySchema.json", + "availableSensors": { + "sensors": [], + }, + "backCompatNames": [], + "backlashDistance": 0, + "channels": 8, + "displayCategory": "GEN1", + "displayName": "P10 8-Channel GEN1", + "dropTipConfigurations": { + "plungerEject": { + "current": 0.5, + "speed": 5, }, - "A8": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 77.38, - "y": 74.38, - "z": 1.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.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, + ], + ], + }, + }, + }, + }, }, - "A9": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 86.38, - "y": 74.38, - "z": 1.5, - }, - "B1": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 14.38, - "y": 65.38, - "z": 1.5, - }, - "B10": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 95.38, - "y": 65.38, - "z": 1.5, + }, + "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, + ], + }, + "nozzleOffset": [ + 0, + 31.5, + 0.8, + ], + "orderedColumns": [ + { + "key": "1", + "orderedNozzles": [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1", + ], }, - "B11": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 104.38, - "y": 65.38, - "z": 1.5, + ], + "orderedRows": [ + { + "key": "A", + "orderedNozzles": [ + "A1", + ], }, - "B12": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 113.38, - "y": 65.38, - "z": 1.5, + { + "key": "B", + "orderedNozzles": [ + "B1", + ], }, - "B2": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 23.38, - "y": 65.38, - "z": 1.5, + { + "key": "C", + "orderedNozzles": [ + "C1", + ], }, - "B3": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 32.38, - "y": 65.38, - "z": 1.5, + { + "key": "D", + "orderedNozzles": [ + "D1", + ], }, - "B4": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 41.38, - "y": 65.38, - "z": 1.5, + { + "key": "E", + "orderedNozzles": [ + "E1", + ], }, - "B5": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 50.38, - "y": 65.38, - "z": 1.5, + { + "key": "F", + "orderedNozzles": [ + "F1", + ], }, - "B6": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 59.38, - "y": 65.38, - "z": 1.5, + { + "key": "G", + "orderedNozzles": [ + "G1", + ], }, - "B7": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 68.38, - "y": 65.38, - "z": 1.5, + { + "key": "H", + "orderedNozzles": [ + "H1", + ], }, - "B8": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 77.38, - "y": 65.38, - "z": 1.5, + ], + "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, + }, }, - "B9": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 86.38, - "y": 65.38, - "z": 1.5, - }, - "C1": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 14.38, - "y": 56.38, - "z": 1.5, - }, - "C10": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 95.38, - "y": 56.38, - "z": 1.5, - }, - "C11": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 104.38, - "y": 56.38, - "z": 1.5, - }, - "C12": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 113.38, - "y": 56.38, - "z": 1.5, - }, - "C2": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 23.38, - "y": 56.38, - "z": 1.5, - }, - "C3": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 32.38, - "y": 56.38, - "z": 1.5, - }, - "C4": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 41.38, - "y": 56.38, - "z": 1.5, - }, - "C5": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 50.38, - "y": 56.38, - "z": 1.5, - }, - "C6": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 59.38, - "y": 56.38, - "z": 1.5, - }, - "C7": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 68.38, - "y": 56.38, - "z": 1.5, - }, - "C8": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 77.38, - "y": 56.38, - "z": 1.5, - }, - "C9": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 86.38, - "y": 56.38, - "z": 1.5, - }, - "D1": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 14.38, - "y": 47.38, - "z": 1.5, - }, - "D10": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 95.38, - "y": 47.38, - "z": 1.5, - }, - "D11": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 104.38, - "y": 47.38, - "z": 1.5, - }, - "D12": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 113.38, - "y": 47.38, - "z": 1.5, - }, - "D2": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 23.38, - "y": 47.38, - "z": 1.5, - }, - "D3": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 32.38, - "y": 47.38, - "z": 1.5, - }, - "D4": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 41.38, - "y": 47.38, - "z": 1.5, - }, - "D5": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 50.38, - "y": 47.38, - "z": 1.5, - }, - "D6": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 59.38, - "y": 47.38, - "z": 1.5, - }, - "D7": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 68.38, - "y": 47.38, - "z": 1.5, - }, - "D8": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 77.38, - "y": 47.38, - "z": 1.5, - }, - "D9": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 86.38, - "y": 47.38, - "z": 1.5, - }, - "E1": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 14.38, - "y": 38.38, - "z": 1.5, - }, - "E10": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 95.38, - "y": 38.38, - "z": 1.5, - }, - "E11": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 104.38, - "y": 38.38, - "z": 1.5, - }, - "E12": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 113.38, - "y": 38.38, - "z": 1.5, - }, - "E2": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 23.38, - "y": 38.38, - "z": 1.5, - }, - "E3": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 32.38, - "y": 38.38, - "z": 1.5, - }, - "E4": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 41.38, - "y": 38.38, - "z": 1.5, - }, - "E5": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 50.38, - "y": 38.38, - "z": 1.5, - }, - "E6": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 59.38, - "y": 38.38, - "z": 1.5, - }, - "E7": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 68.38, - "y": 38.38, - "z": 1.5, - }, - "E8": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 77.38, - "y": 38.38, - "z": 1.5, - }, - "E9": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 86.38, - "y": 38.38, - "z": 1.5, - }, - "F1": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 14.38, - "y": 29.38, - "z": 1.5, - }, - "F10": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 95.38, - "y": 29.38, - "z": 1.5, - }, - "F11": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 104.38, - "y": 29.38, - "z": 1.5, - }, - "F12": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 113.38, - "y": 29.38, - "z": 1.5, - }, - "F2": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 23.38, - "y": 29.38, - "z": 1.5, - }, - "F3": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 32.38, - "y": 29.38, - "z": 1.5, - }, - "F4": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 41.38, - "y": 29.38, - "z": 1.5, - }, - "F5": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 50.38, - "y": 29.38, - "z": 1.5, - }, - "F6": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 59.38, - "y": 29.38, - "z": 1.5, - }, - "F7": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 68.38, - "y": 29.38, - "z": 1.5, - }, - "F8": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 77.38, - "y": 29.38, - "z": 1.5, - }, - "F9": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 86.38, - "y": 29.38, - "z": 1.5, - }, - "G1": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 14.38, - "y": 20.38, - "z": 1.5, - }, - "G10": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 95.38, - "y": 20.38, - "z": 1.5, - }, - "G11": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 104.38, - "y": 20.38, - "z": 1.5, - }, - "G12": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 113.38, - "y": 20.38, - "z": 1.5, - }, - "G2": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 23.38, - "y": 20.38, - "z": 1.5, - }, - "G3": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 32.38, - "y": 20.38, - "z": 1.5, - }, - "G4": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 41.38, - "y": 20.38, - "z": 1.5, - }, - "G5": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 50.38, - "y": 20.38, - "z": 1.5, - }, - "G6": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 59.38, - "y": 20.38, - "z": 1.5, - }, - "G7": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 68.38, - "y": 20.38, - "z": 1.5, - }, - "G8": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 77.38, - "y": 20.38, - "z": 1.5, - }, - "G9": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 86.38, - "y": 20.38, - "z": 1.5, - }, - "H1": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 14.38, - "y": 11.38, - "z": 1.5, - }, - "H10": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 95.38, - "y": 11.38, - "z": 1.5, - }, - "H11": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 104.38, - "y": 11.38, - "z": 1.5, - }, - "H12": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 113.38, - "y": 11.38, - "z": 1.5, - }, - "H2": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 23.38, - "y": 11.38, - "z": 1.5, - }, - "H3": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 32.38, - "y": 11.38, - "z": 1.5, - }, - "H4": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 41.38, - "y": 11.38, - "z": 1.5, - }, - "H5": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 50.38, - "y": 11.38, - "z": 1.5, - }, - "H6": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 59.38, - "y": 11.38, - "z": 1.5, - }, - "H7": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 68.38, - "y": 11.38, - "z": 1.5, - }, - "H8": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 77.38, - "y": 11.38, - "z": 1.5, - }, - "H9": { - "depth": 97.5, - "diameter": 5.47, - "shape": "circular", - "totalLiquidVolume": 1000, - "x": 86.38, - "y": 11.38, - "z": 1.5, - }, - }, - }, - }, - "p10MultiId": { - "id": "p10MultiId", - "name": "p10_multi", - "spec": { - "$otSharedSchema": "#/pipette/schemas/2/pipetteGeometrySchema.json", - "availableSensors": { - "sensors": [], - }, - "backCompatNames": [], - "backlashDistance": 0, - "channels": 8, - "displayCategory": "GEN1", - "displayName": "P10 8-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.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, - ], - ], - }, - }, - }, - }, - }, - }, - "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, - ], - }, - "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/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", - "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": "Opentrons GEB 10uL Tiprack", - "displayVolumeUnits": "µL", - "tags": [ - "GEB", - "tiprack", - "10uL", - "Opentrons", - ], - }, - "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", - ], - [ - "A7", - "B7", - "C7", - "D7", - "E7", - "F7", - "G7", - "H7", - ], - [ - "A8", - "B8", - "C8", - "D8", - "E8", - "F8", - "G8", - "H8", - ], - [ - "A9", - "B9", - "C9", - "D9", - "E9", - "F9", - "G9", - "H9", - ], - [ - "A10", - "B10", - "C10", - "D10", - "E10", - "F10", - "G10", - "H10", - ], - [ - "A11", - "B11", - "C11", - "D11", - "E11", - "F11", - "G11", - "H11", - ], - [ - "A12", - "B12", - "C12", - "D12", - "E12", - "F12", - "G12", - "H12", - ], - ], - "parameters": { - "format": "96Standard", - "isMagneticModuleCompatible": false, - "isTiprack": true, - "loadName": "fixture_tiprack_10_ul", - "tipLength": 39.2, - "tipOverlap": 6.2, - }, - "schemaVersion": 2, - "version": 1, - "wells": { - "A1": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 14.38, - "y": 74.25, - "z": 22.25, - }, - "A10": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 95.38, - "y": 74.25, - "z": 22.25, - }, - "A11": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 104.38, - "y": 74.25, - "z": 22.25, - }, - "A12": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 113.38, - "y": 74.25, - "z": 22.25, - }, - "A2": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 23.38, - "y": 74.25, - "z": 22.25, - }, - "A3": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 32.38, - "y": 74.25, - "z": 22.25, - }, - "A4": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 41.38, - "y": 74.25, - "z": 22.25, - }, - "A5": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 50.38, - "y": 74.25, - "z": 22.25, - }, - "A6": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 59.38, - "y": 74.25, - "z": 22.25, - }, - "A7": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 68.38, - "y": 74.25, - "z": 22.25, - }, - "A8": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 77.38, - "y": 74.25, - "z": 22.25, - }, - "A9": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 86.38, - "y": 74.25, - "z": 22.25, - }, - "B1": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 14.38, - "y": 65.25, - "z": 22.25, - }, - "B10": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 95.38, - "y": 65.25, - "z": 22.25, - }, - "B11": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 104.38, - "y": 65.25, - "z": 22.25, - }, - "B12": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 113.38, - "y": 65.25, - "z": 22.25, - }, - "B2": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 23.38, - "y": 65.25, - "z": 22.25, - }, - "B3": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 32.38, - "y": 65.25, - "z": 22.25, - }, - "B4": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 41.38, - "y": 65.25, - "z": 22.25, - }, - "B5": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 50.38, - "y": 65.25, - "z": 22.25, - }, - "B6": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 59.38, - "y": 65.25, - "z": 22.25, - }, - "B7": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 68.38, - "y": 65.25, - "z": 22.25, - }, - "B8": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 77.38, - "y": 65.25, - "z": 22.25, - }, - "B9": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 86.38, - "y": 65.25, - "z": 22.25, - }, - "C1": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 14.38, - "y": 56.25, - "z": 22.25, - }, - "C10": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 95.38, - "y": 56.25, - "z": 22.25, - }, - "C11": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 104.38, - "y": 56.25, - "z": 22.25, - }, - "C12": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 113.38, - "y": 56.25, - "z": 22.25, - }, - "C2": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 23.38, - "y": 56.25, - "z": 22.25, - }, - "C3": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 32.38, - "y": 56.25, - "z": 22.25, - }, - "C4": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 41.38, - "y": 56.25, - "z": 22.25, - }, - "C5": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 50.38, - "y": 56.25, - "z": 22.25, - }, - "C6": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 59.38, - "y": 56.25, - "z": 22.25, - }, - "C7": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 68.38, - "y": 56.25, - "z": 22.25, - }, - "C8": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 77.38, - "y": 56.25, - "z": 22.25, - }, - "C9": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 86.38, - "y": 56.25, - "z": 22.25, - }, - "D1": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 14.38, - "y": 47.25, - "z": 22.25, - }, - "D10": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 95.38, - "y": 47.25, - "z": 22.25, - }, - "D11": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 104.38, - "y": 47.25, - "z": 22.25, - }, - "D12": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 113.38, - "y": 47.25, - "z": 22.25, - }, - "D2": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 23.38, - "y": 47.25, - "z": 22.25, - }, - "D3": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 32.38, - "y": 47.25, - "z": 22.25, - }, - "D4": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 41.38, - "y": 47.25, - "z": 22.25, - }, - "D5": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 50.38, - "y": 47.25, - "z": 22.25, - }, - "D6": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 59.38, - "y": 47.25, - "z": 22.25, - }, - "D7": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 68.38, - "y": 47.25, - "z": 22.25, - }, - "D8": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 77.38, - "y": 47.25, - "z": 22.25, - }, - "D9": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 86.38, - "y": 47.25, - "z": 22.25, - }, - "E1": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 14.38, - "y": 38.25, - "z": 22.25, - }, - "E10": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 95.38, - "y": 38.25, - "z": 22.25, - }, - "E11": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 104.38, - "y": 38.25, - "z": 22.25, - }, - "E12": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 113.38, - "y": 38.25, - "z": 22.25, - }, - "E2": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 23.38, - "y": 38.25, - "z": 22.25, - }, - "E3": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 32.38, - "y": 38.25, - "z": 22.25, - }, - "E4": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 41.38, - "y": 38.25, - "z": 22.25, - }, - "E5": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 50.38, - "y": 38.25, - "z": 22.25, - }, - "E6": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 59.38, - "y": 38.25, - "z": 22.25, - }, - "E7": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 68.38, - "y": 38.25, - "z": 22.25, - }, - "E8": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 77.38, - "y": 38.25, - "z": 22.25, - }, - "E9": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 86.38, - "y": 38.25, - "z": 22.25, - }, - "F1": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 14.38, - "y": 29.25, - "z": 22.25, - }, - "F10": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 95.38, - "y": 29.25, - "z": 22.25, - }, - "F11": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 104.38, - "y": 29.25, - "z": 22.25, - }, - "F12": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 113.38, - "y": 29.25, - "z": 22.25, - }, - "F2": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 23.38, - "y": 29.25, - "z": 22.25, - }, - "F3": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 32.38, - "y": 29.25, - "z": 22.25, - }, - "F4": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 41.38, - "y": 29.25, - "z": 22.25, - }, - "F5": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 50.38, - "y": 29.25, - "z": 22.25, - }, - "F6": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 59.38, - "y": 29.25, - "z": 22.25, - }, - "F7": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 68.38, - "y": 29.25, - "z": 22.25, - }, - "F8": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 77.38, - "y": 29.25, - "z": 22.25, - }, - "F9": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 86.38, - "y": 29.25, - "z": 22.25, - }, - "G1": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 14.38, - "y": 20.25, - "z": 22.25, - }, - "G10": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 95.38, - "y": 20.25, - "z": 22.25, - }, - "G11": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 104.38, - "y": 20.25, - "z": 22.25, - }, - "G12": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 113.38, - "y": 20.25, - "z": 22.25, - }, - "G2": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 23.38, - "y": 20.25, - "z": 22.25, - }, - "G3": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 32.38, - "y": 20.25, - "z": 22.25, - }, - "G4": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 41.38, - "y": 20.25, - "z": 22.25, - }, - "G5": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 50.38, - "y": 20.25, - "z": 22.25, - }, - "G6": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 59.38, - "y": 20.25, - "z": 22.25, - }, - "G7": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 68.38, - "y": 20.25, - "z": 22.25, - }, - "G8": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 77.38, - "y": 20.25, - "z": 22.25, - }, - "G9": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 86.38, - "y": 20.25, - "z": 22.25, - }, - "H1": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 14.38, - "y": 11.25, - "z": 22.25, - }, - "H10": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 95.38, - "y": 11.25, - "z": 22.25, - }, - "H11": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 104.38, - "y": 11.25, - "z": 22.25, - }, - "H12": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 113.38, - "y": 11.25, - "z": 22.25, - }, - "H2": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 23.38, - "y": 11.25, - "z": 22.25, - }, - "H3": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 32.38, - "y": 11.25, - "z": 22.25, - }, - "H4": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 41.38, - "y": 11.25, - "z": 22.25, - }, - "H5": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 50.38, - "y": 11.25, - "z": 22.25, - }, - "H6": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 59.38, - "y": 11.25, - "z": 22.25, - }, - "H7": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 68.38, - "y": 11.25, - "z": 22.25, - }, - "H8": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 77.38, - "y": 11.25, - "z": 22.25, - }, - "H9": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 86.38, - "y": 11.25, - "z": 22.25, - }, - }, - }, - }, - "p10SingleId": { - "id": "p10SingleId", - "name": "p10_single", - "spec": { - "$otSharedSchema": "#/pipette/schemas/2/pipetteGeometrySchema.json", - "availableSensors": { - "sensors": [], - }, - "backCompatNames": [], - "backlashDistance": 0, - "channels": 1, - "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, - ], - }, - "plungerHomingConfigurations": { - "current": 0.3, - "speed": 30, - }, - "plungerMotorConfigurations": { - "idle": 0.05, - "run": 0.3, - }, - "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": { - "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", - "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": "Opentrons GEB 10uL Tiprack", - "displayVolumeUnits": "µL", - "tags": [ - "GEB", - "tiprack", - "10uL", - "Opentrons", - ], - }, - "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", - ], - [ - "A7", - "B7", - "C7", - "D7", - "E7", - "F7", - "G7", - "H7", - ], - [ - "A8", - "B8", - "C8", - "D8", - "E8", - "F8", - "G8", - "H8", - ], - [ - "A9", - "B9", - "C9", - "D9", - "E9", - "F9", - "G9", - "H9", - ], - [ - "A10", - "B10", - "C10", - "D10", - "E10", - "F10", - "G10", - "H10", - ], - [ - "A11", - "B11", - "C11", - "D11", - "E11", - "F11", - "G11", - "H11", - ], - [ - "A12", - "B12", - "C12", - "D12", - "E12", - "F12", - "G12", - "H12", - ], - ], - "parameters": { - "format": "96Standard", - "isMagneticModuleCompatible": false, - "isTiprack": true, - "loadName": "fixture_tiprack_10_ul", - "tipLength": 39.2, - "tipOverlap": 6.2, - }, - "schemaVersion": 2, - "version": 1, - "wells": { - "A1": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 14.38, - "y": 74.25, - "z": 22.25, - }, - "A10": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 95.38, - "y": 74.25, - "z": 22.25, - }, - "A11": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 104.38, - "y": 74.25, - "z": 22.25, - }, - "A12": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 113.38, - "y": 74.25, - "z": 22.25, - }, - "A2": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 23.38, - "y": 74.25, - "z": 22.25, - }, - "A3": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 32.38, - "y": 74.25, - "z": 22.25, - }, - "A4": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 41.38, - "y": 74.25, - "z": 22.25, - }, - "A5": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 50.38, - "y": 74.25, - "z": 22.25, - }, - "A6": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 59.38, - "y": 74.25, - "z": 22.25, - }, - "A7": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 68.38, - "y": 74.25, - "z": 22.25, - }, - "A8": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 77.38, - "y": 74.25, - "z": 22.25, - }, - "A9": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 86.38, - "y": 74.25, - "z": 22.25, - }, - "B1": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 14.38, - "y": 65.25, - "z": 22.25, - }, - "B10": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 95.38, - "y": 65.25, - "z": 22.25, - }, - "B11": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 104.38, - "y": 65.25, - "z": 22.25, - }, - "B12": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 113.38, - "y": 65.25, - "z": 22.25, - }, - "B2": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 23.38, - "y": 65.25, - "z": 22.25, - }, - "B3": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 32.38, - "y": 65.25, - "z": 22.25, - }, - "B4": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 41.38, - "y": 65.25, - "z": 22.25, - }, - "B5": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 50.38, - "y": 65.25, - "z": 22.25, - }, - "B6": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 59.38, - "y": 65.25, - "z": 22.25, - }, - "B7": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 68.38, - "y": 65.25, - "z": 22.25, - }, - "B8": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 77.38, - "y": 65.25, - "z": 22.25, - }, - "B9": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 86.38, - "y": 65.25, - "z": 22.25, - }, - "C1": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 14.38, - "y": 56.25, - "z": 22.25, - }, - "C10": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 95.38, - "y": 56.25, - "z": 22.25, - }, - "C11": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 104.38, - "y": 56.25, - "z": 22.25, - }, - "C12": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 113.38, - "y": 56.25, - "z": 22.25, - }, - "C2": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 23.38, - "y": 56.25, - "z": 22.25, - }, - "C3": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 32.38, - "y": 56.25, - "z": 22.25, - }, - "C4": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 41.38, - "y": 56.25, - "z": 22.25, - }, - "C5": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 50.38, - "y": 56.25, - "z": 22.25, - }, - "C6": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 59.38, - "y": 56.25, - "z": 22.25, - }, - "C7": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 68.38, - "y": 56.25, - "z": 22.25, - }, - "C8": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 77.38, - "y": 56.25, - "z": 22.25, - }, - "C9": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 86.38, - "y": 56.25, - "z": 22.25, - }, - "D1": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 14.38, - "y": 47.25, - "z": 22.25, - }, - "D10": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 95.38, - "y": 47.25, - "z": 22.25, - }, - "D11": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 104.38, - "y": 47.25, - "z": 22.25, - }, - "D12": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 113.38, - "y": 47.25, - "z": 22.25, - }, - "D2": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 23.38, - "y": 47.25, - "z": 22.25, - }, - "D3": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 32.38, - "y": 47.25, - "z": 22.25, - }, - "D4": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 41.38, - "y": 47.25, - "z": 22.25, - }, - "D5": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 50.38, - "y": 47.25, - "z": 22.25, - }, - "D6": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 59.38, - "y": 47.25, - "z": 22.25, - }, - "D7": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 68.38, - "y": 47.25, - "z": 22.25, - }, - "D8": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 77.38, - "y": 47.25, - "z": 22.25, - }, - "D9": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 86.38, - "y": 47.25, - "z": 22.25, - }, - "E1": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 14.38, - "y": 38.25, - "z": 22.25, - }, - "E10": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 95.38, - "y": 38.25, - "z": 22.25, - }, - "E11": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 104.38, - "y": 38.25, - "z": 22.25, - }, - "E12": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 113.38, - "y": 38.25, - "z": 22.25, - }, - "E2": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 23.38, - "y": 38.25, - "z": 22.25, - }, - "E3": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 32.38, - "y": 38.25, - "z": 22.25, - }, - "E4": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 41.38, - "y": 38.25, - "z": 22.25, - }, - "E5": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 50.38, - "y": 38.25, - "z": 22.25, - }, - "E6": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 59.38, - "y": 38.25, - "z": 22.25, - }, - "E7": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 68.38, - "y": 38.25, - "z": 22.25, - }, - "E8": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 77.38, - "y": 38.25, - "z": 22.25, - }, - "E9": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 86.38, - "y": 38.25, - "z": 22.25, - }, - "F1": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 14.38, - "y": 29.25, - "z": 22.25, - }, - "F10": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 95.38, - "y": 29.25, - "z": 22.25, - }, - "F11": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 104.38, - "y": 29.25, - "z": 22.25, - }, - "F12": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 113.38, - "y": 29.25, - "z": 22.25, - }, - "F2": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 23.38, - "y": 29.25, - "z": 22.25, - }, - "F3": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 32.38, - "y": 29.25, - "z": 22.25, - }, - "F4": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 41.38, - "y": 29.25, - "z": 22.25, - }, - "F5": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 50.38, - "y": 29.25, - "z": 22.25, - }, - "F6": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 59.38, - "y": 29.25, - "z": 22.25, - }, - "F7": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 68.38, - "y": 29.25, - "z": 22.25, - }, - "F8": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 77.38, - "y": 29.25, - "z": 22.25, - }, - "F9": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 86.38, - "y": 29.25, - "z": 22.25, - }, - "G1": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 14.38, - "y": 20.25, - "z": 22.25, - }, - "G10": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 95.38, - "y": 20.25, - "z": 22.25, - }, - "G11": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 104.38, - "y": 20.25, - "z": 22.25, - }, - "G12": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 113.38, - "y": 20.25, - "z": 22.25, - }, - "G2": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 23.38, - "y": 20.25, - "z": 22.25, - }, - "G3": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 32.38, - "y": 20.25, - "z": 22.25, - }, - "G4": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 41.38, - "y": 20.25, - "z": 22.25, - }, - "G5": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 50.38, - "y": 20.25, - "z": 22.25, - }, - "G6": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 59.38, - "y": 20.25, - "z": 22.25, - }, - "G7": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 68.38, - "y": 20.25, - "z": 22.25, - }, - "G8": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 77.38, - "y": 20.25, - "z": 22.25, - }, - "G9": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 86.38, - "y": 20.25, - "z": 22.25, - }, - "H1": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 14.38, - "y": 11.25, - "z": 22.25, - }, - "H10": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 95.38, - "y": 11.25, - "z": 22.25, - }, - "H11": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 104.38, - "y": 11.25, - "z": 22.25, - }, - "H12": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 113.38, - "y": 11.25, - "z": 22.25, - }, - "H2": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 23.38, - "y": 11.25, - "z": 22.25, - }, - "H3": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 32.38, - "y": 11.25, - "z": 22.25, - }, - "H4": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 41.38, - "y": 11.25, - "z": 22.25, - }, - "H5": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 50.38, - "y": 11.25, - "z": 22.25, - }, - "H6": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 59.38, - "y": 11.25, - "z": 22.25, - }, - "H7": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 68.38, - "y": 11.25, - "z": 22.25, - }, - "H8": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 77.38, - "y": 11.25, - "z": 22.25, - }, - "H9": { - "depth": 34, - "diameter": 3.46, - "shape": "circular", - "totalLiquidVolume": 10, - "x": 86.38, - "y": 11.25, - "z": 22.25, - }, - }, - }, - }, - "p300MultiId": { - "id": "p300MultiId", - "name": "p300_multi", - "spec": { - "$otSharedSchema": "#/pipette/schemas/2/pipetteGeometrySchema.json", - "availableSensors": { - "sensors": [], - }, - "backCompatNames": [], - "backlashDistance": 0, - "channels": 8, - "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, - }, - }, - }, - "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": 3, - "bottom": 3.5, - "drop": -2, - "top": 19.5, - }, - }, - "quirks": [ - "dropTipShake", - ], - "shaftDiameter": 5, - "shaftULperMM": 19.635, - }, - "tiprackDefURI": "fixture/fixture_tiprack_300_ul/1", - "tiprackLabwareDef": { - "brand": { - "brand": "Fixture Brand", - }, - "cornerOffsetFromSlot": { - "x": 0, - "y": 0, - "z": 0, - }, - "dimensions": { - "xDimension": 127.76, - "yDimension": 85.48, - "zDimension": 64.49, - }, - "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": "300ul Tiprack FIXTURE", - "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", - ], - [ - "A7", - "B7", - "C7", - "D7", - "E7", - "F7", - "G7", - "H7", - ], - [ - "A8", - "B8", - "C8", - "D8", - "E8", - "F8", - "G8", - "H8", - ], - [ - "A9", - "B9", - "C9", - "D9", - "E9", - "F9", - "G9", - "H9", - ], - [ - "A10", - "B10", - "C10", - "D10", - "E10", - "F10", - "G10", - "H10", - ], - [ - "A11", - "B11", - "C11", - "D11", - "E11", - "F11", - "G11", - "H11", - ], - [ - "A12", - "B12", - "C12", - "D12", - "E12", - "F12", - "G12", - "H12", - ], - ], - "parameters": { - "format": "96Standard", - "isMagneticModuleCompatible": false, - "isTiprack": true, - "loadName": "fixture_tiprack_300_ul", - "tipLength": 59.3, - }, - "schemaVersion": 2, - "version": 1, - "wells": { - "A1": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 14.38, - "y": 74.24, - "z": 5.19, - }, - "A10": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 95.38, - "y": 74.24, - "z": 5.19, - }, - "A11": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 104.38, - "y": 74.24, - "z": 5.19, - }, - "A12": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 113.38, - "y": 74.24, - "z": 5.19, - }, - "A2": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 23.38, - "y": 74.24, - "z": 5.19, - }, - "A3": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 32.38, - "y": 74.24, - "z": 5.19, - }, - "A4": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 41.38, - "y": 74.24, - "z": 5.19, - }, - "A5": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 50.38, - "y": 74.24, - "z": 5.19, - }, - "A6": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 59.38, - "y": 74.24, - "z": 5.19, - }, - "A7": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 68.38, - "y": 74.24, - "z": 5.19, - }, - "A8": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 77.38, - "y": 74.24, - "z": 5.19, - }, - "A9": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 86.38, - "y": 74.24, - "z": 5.19, - }, - "B1": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 14.38, - "y": 65.24, - "z": 5.19, - }, - "B10": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 95.38, - "y": 65.24, - "z": 5.19, - }, - "B11": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 104.38, - "y": 65.24, - "z": 5.19, - }, - "B12": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 113.38, - "y": 65.24, - "z": 5.19, - }, - "B2": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 23.38, - "y": 65.24, - "z": 5.19, - }, - "B3": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 32.38, - "y": 65.24, - "z": 5.19, - }, - "B4": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 41.38, - "y": 65.24, - "z": 5.19, - }, - "B5": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 50.38, - "y": 65.24, - "z": 5.19, - }, - "B6": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 59.38, - "y": 65.24, - "z": 5.19, - }, - "B7": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 68.38, - "y": 65.24, - "z": 5.19, - }, - "B8": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 77.38, - "y": 65.24, - "z": 5.19, - }, - "B9": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 86.38, - "y": 65.24, - "z": 5.19, - }, - "C1": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 14.38, - "y": 56.24, - "z": 5.19, - }, - "C10": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 95.38, - "y": 56.24, - "z": 5.19, - }, - "C11": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 104.38, - "y": 56.24, - "z": 5.19, - }, - "C12": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 113.38, - "y": 56.24, - "z": 5.19, - }, - "C2": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 23.38, - "y": 56.24, - "z": 5.19, - }, - "C3": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 32.38, - "y": 56.24, - "z": 5.19, - }, - "C4": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 41.38, - "y": 56.24, - "z": 5.19, - }, - "C5": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 50.38, - "y": 56.24, - "z": 5.19, - }, - "C6": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 59.38, - "y": 56.24, - "z": 5.19, - }, - "C7": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 68.38, - "y": 56.24, - "z": 5.19, - }, - "C8": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 77.38, - "y": 56.24, - "z": 5.19, - }, - "C9": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 86.38, - "y": 56.24, - "z": 5.19, - }, - "D1": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 14.38, - "y": 47.24, - "z": 5.19, - }, - "D10": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 95.38, - "y": 47.24, - "z": 5.19, - }, - "D11": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 104.38, - "y": 47.24, - "z": 5.19, - }, - "D12": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 113.38, - "y": 47.24, - "z": 5.19, - }, - "D2": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 23.38, - "y": 47.24, - "z": 5.19, - }, - "D3": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 32.38, - "y": 47.24, - "z": 5.19, - }, - "D4": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 41.38, - "y": 47.24, - "z": 5.19, - }, - "D5": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 50.38, - "y": 47.24, - "z": 5.19, - }, - "D6": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 59.38, - "y": 47.24, - "z": 5.19, - }, - "D7": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 68.38, - "y": 47.24, - "z": 5.19, - }, - "D8": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 77.38, - "y": 47.24, - "z": 5.19, - }, - "D9": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 86.38, - "y": 47.24, - "z": 5.19, - }, - "E1": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 14.38, - "y": 38.24, - "z": 5.19, - }, - "E10": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 95.38, - "y": 38.24, - "z": 5.19, - }, - "E11": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 104.38, - "y": 38.24, - "z": 5.19, - }, - "E12": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 113.38, - "y": 38.24, - "z": 5.19, - }, - "E2": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 23.38, - "y": 38.24, - "z": 5.19, - }, - "E3": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 32.38, - "y": 38.24, - "z": 5.19, - }, - "E4": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 41.38, - "y": 38.24, - "z": 5.19, - }, - "E5": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 50.38, - "y": 38.24, - "z": 5.19, - }, - "E6": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 59.38, - "y": 38.24, - "z": 5.19, - }, - "E7": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 68.38, - "y": 38.24, - "z": 5.19, - }, - "E8": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 77.38, - "y": 38.24, - "z": 5.19, - }, - "E9": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 86.38, - "y": 38.24, - "z": 5.19, - }, - "F1": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 14.38, - "y": 29.24, - "z": 5.19, - }, - "F10": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 95.38, - "y": 29.24, - "z": 5.19, - }, - "F11": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 104.38, - "y": 29.24, - "z": 5.19, - }, - "F12": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 113.38, - "y": 29.24, - "z": 5.19, - }, - "F2": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 23.38, - "y": 29.24, - "z": 5.19, - }, - "F3": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 32.38, - "y": 29.24, - "z": 5.19, - }, - "F4": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 41.38, - "y": 29.24, - "z": 5.19, - }, - "F5": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 50.38, - "y": 29.24, - "z": 5.19, - }, - "F6": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 59.38, - "y": 29.24, - "z": 5.19, - }, - "F7": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 68.38, - "y": 29.24, - "z": 5.19, - }, - "F8": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 77.38, - "y": 29.24, - "z": 5.19, - }, - "F9": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 86.38, - "y": 29.24, - "z": 5.19, - }, - "G1": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 14.38, - "y": 20.24, - "z": 5.19, - }, - "G10": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 95.38, - "y": 20.24, - "z": 5.19, - }, - "G11": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 104.38, - "y": 20.24, - "z": 5.19, - }, - "G12": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 113.38, - "y": 20.24, - "z": 5.19, - }, - "G2": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 23.38, - "y": 20.24, - "z": 5.19, - }, - "G3": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 32.38, - "y": 20.24, - "z": 5.19, - }, - "G4": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 41.38, - "y": 20.24, - "z": 5.19, - }, - "G5": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 50.38, - "y": 20.24, - "z": 5.19, - }, - "G6": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 59.38, - "y": 20.24, - "z": 5.19, - }, - "G7": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 68.38, - "y": 20.24, - "z": 5.19, - }, - "G8": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 77.38, - "y": 20.24, - "z": 5.19, - }, - "G9": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 86.38, - "y": 20.24, - "z": 5.19, - }, - "H1": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 14.38, - "y": 11.24, - "z": 5.19, - }, - "H10": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 95.38, - "y": 11.24, - "z": 5.19, - }, - "H11": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 104.38, - "y": 11.24, - "z": 5.19, - }, - "H12": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 113.38, - "y": 11.24, - "z": 5.19, - }, - "H2": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 23.38, - "y": 11.24, - "z": 5.19, - }, - "H3": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 32.38, - "y": 11.24, - "z": 5.19, - }, - "H4": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 41.38, - "y": 11.24, - "z": 5.19, - }, - "H5": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 50.38, - "y": 11.24, - "z": 5.19, - }, - "H6": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 59.38, - "y": 11.24, - "z": 5.19, - }, - "H7": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 68.38, - "y": 11.24, - "z": 5.19, - }, - "H8": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 77.38, - "y": 11.24, - "z": 5.19, - }, - "H9": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 86.38, - "y": 11.24, - "z": 5.19, - }, - }, - }, - }, - "p300SingleId": { - "id": "p300SingleId", - "name": "p300_single", - "spec": { - "$otSharedSchema": "#/pipette/schemas/2/pipetteGeometrySchema.json", - "availableSensors": { - "sensors": [], - }, - "backCompatNames": [], - "backlashDistance": 0, - "channels": 1, - "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, - }, - }, - }, - "pipetteBoundingBoxOffsets": { - "backLeftCorner": [ - 0, - 0, - 25, - ], - "frontRightCorner": [ - 0, - 0, - 25, - ], - }, - "plungerHomingConfigurations": { - "current": 0.3, - "speed": 30, - }, - "plungerMotorConfigurations": { - "idle": 0.05, - "run": 0.3, - }, - "plungerPositionsConfigurations": { - "default": { - "blowout": 0, - "bottom": 1.5, - "drop": -4, - "top": 19.5, - }, - }, - "quirks": [ - "dropTipShake", - ], - "shaftDiameter": 5, - "shaftULperMM": 19.635, - }, - "tiprackDefURI": "fixture/fixture_tiprack_300_ul/1", - "tiprackLabwareDef": { - "brand": { - "brand": "Fixture Brand", - }, - "cornerOffsetFromSlot": { - "x": 0, - "y": 0, - "z": 0, - }, - "dimensions": { - "xDimension": 127.76, - "yDimension": 85.48, - "zDimension": 64.49, - }, - "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": "300ul Tiprack FIXTURE", - "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", - ], - [ - "A7", - "B7", - "C7", - "D7", - "E7", - "F7", - "G7", - "H7", - ], - [ - "A8", - "B8", - "C8", - "D8", - "E8", - "F8", - "G8", - "H8", - ], - [ - "A9", - "B9", - "C9", - "D9", - "E9", - "F9", - "G9", - "H9", - ], - [ - "A10", - "B10", - "C10", - "D10", - "E10", - "F10", - "G10", - "H10", - ], - [ - "A11", - "B11", - "C11", - "D11", - "E11", - "F11", - "G11", - "H11", - ], - [ - "A12", - "B12", - "C12", - "D12", - "E12", - "F12", - "G12", - "H12", - ], - ], - "parameters": { - "format": "96Standard", - "isMagneticModuleCompatible": false, - "isTiprack": true, - "loadName": "fixture_tiprack_300_ul", - "tipLength": 59.3, - }, - "schemaVersion": 2, - "version": 1, - "wells": { - "A1": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 14.38, - "y": 74.24, - "z": 5.19, - }, - "A10": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 95.38, - "y": 74.24, - "z": 5.19, - }, - "A11": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 104.38, - "y": 74.24, - "z": 5.19, - }, - "A12": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 113.38, - "y": 74.24, - "z": 5.19, - }, - "A2": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 23.38, - "y": 74.24, - "z": 5.19, - }, - "A3": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 32.38, - "y": 74.24, - "z": 5.19, - }, - "A4": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 41.38, - "y": 74.24, - "z": 5.19, - }, - "A5": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 50.38, - "y": 74.24, - "z": 5.19, - }, - "A6": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 59.38, - "y": 74.24, - "z": 5.19, - }, - "A7": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 68.38, - "y": 74.24, - "z": 5.19, - }, - "A8": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 77.38, - "y": 74.24, - "z": 5.19, - }, - "A9": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 86.38, - "y": 74.24, - "z": 5.19, - }, - "B1": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 14.38, - "y": 65.24, - "z": 5.19, - }, - "B10": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 95.38, - "y": 65.24, - "z": 5.19, - }, - "B11": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 104.38, - "y": 65.24, - "z": 5.19, - }, - "B12": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 113.38, - "y": 65.24, - "z": 5.19, - }, - "B2": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 23.38, - "y": 65.24, - "z": 5.19, - }, - "B3": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 32.38, - "y": 65.24, - "z": 5.19, - }, - "B4": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 41.38, - "y": 65.24, - "z": 5.19, - }, - "B5": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 50.38, - "y": 65.24, - "z": 5.19, - }, - "B6": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 59.38, - "y": 65.24, - "z": 5.19, - }, - "B7": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 68.38, - "y": 65.24, - "z": 5.19, - }, - "B8": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 77.38, - "y": 65.24, - "z": 5.19, - }, - "B9": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 86.38, - "y": 65.24, - "z": 5.19, - }, - "C1": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 14.38, - "y": 56.24, - "z": 5.19, - }, - "C10": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 95.38, - "y": 56.24, - "z": 5.19, - }, - "C11": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 104.38, - "y": 56.24, - "z": 5.19, - }, - "C12": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 113.38, - "y": 56.24, - "z": 5.19, - }, - "C2": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 23.38, - "y": 56.24, - "z": 5.19, - }, - "C3": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 32.38, - "y": 56.24, - "z": 5.19, - }, - "C4": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 41.38, - "y": 56.24, - "z": 5.19, - }, - "C5": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 50.38, - "y": 56.24, - "z": 5.19, - }, - "C6": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 59.38, - "y": 56.24, - "z": 5.19, - }, - "C7": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 68.38, - "y": 56.24, - "z": 5.19, - }, - "C8": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 77.38, - "y": 56.24, - "z": 5.19, - }, - "C9": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 86.38, - "y": 56.24, - "z": 5.19, - }, - "D1": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 14.38, - "y": 47.24, - "z": 5.19, - }, - "D10": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 95.38, - "y": 47.24, - "z": 5.19, - }, - "D11": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 104.38, - "y": 47.24, - "z": 5.19, - }, - "D12": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 113.38, - "y": 47.24, - "z": 5.19, - }, - "D2": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 23.38, - "y": 47.24, - "z": 5.19, - }, - "D3": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 32.38, - "y": 47.24, - "z": 5.19, - }, - "D4": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 41.38, - "y": 47.24, - "z": 5.19, - }, - "D5": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 50.38, - "y": 47.24, - "z": 5.19, - }, - "D6": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 59.38, - "y": 47.24, - "z": 5.19, - }, - "D7": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 68.38, - "y": 47.24, - "z": 5.19, - }, - "D8": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 77.38, - "y": 47.24, - "z": 5.19, - }, - "D9": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 86.38, - "y": 47.24, - "z": 5.19, - }, - "E1": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 14.38, - "y": 38.24, - "z": 5.19, - }, - "E10": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 95.38, - "y": 38.24, - "z": 5.19, - }, - "E11": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 104.38, - "y": 38.24, - "z": 5.19, - }, - "E12": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 113.38, - "y": 38.24, - "z": 5.19, - }, - "E2": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 23.38, - "y": 38.24, - "z": 5.19, - }, - "E3": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 32.38, - "y": 38.24, - "z": 5.19, - }, - "E4": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 41.38, - "y": 38.24, - "z": 5.19, - }, - "E5": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 50.38, - "y": 38.24, - "z": 5.19, - }, - "E6": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 59.38, - "y": 38.24, - "z": 5.19, - }, - "E7": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 68.38, - "y": 38.24, - "z": 5.19, - }, - "E8": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 77.38, - "y": 38.24, - "z": 5.19, - }, - "E9": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 86.38, - "y": 38.24, - "z": 5.19, - }, - "F1": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 14.38, - "y": 29.24, - "z": 5.19, - }, - "F10": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 95.38, - "y": 29.24, - "z": 5.19, - }, - "F11": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 104.38, - "y": 29.24, - "z": 5.19, - }, - "F12": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 113.38, - "y": 29.24, - "z": 5.19, - }, - "F2": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 23.38, - "y": 29.24, - "z": 5.19, - }, - "F3": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 32.38, - "y": 29.24, - "z": 5.19, + }, + "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, }, - "F4": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 41.38, - "y": 29.24, - "z": 5.19, + }, + "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", + "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": "Opentrons GEB 10uL Tiprack", + "displayVolumeUnits": "µL", + "tags": [ + "GEB", + "tiprack", + "10uL", + "Opentrons", + ], }, - "F5": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 50.38, - "y": 29.24, - "z": 5.19, + "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", + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7", + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8", + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9", + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10", + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11", + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12", + ], + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "fixture_tiprack_10_ul", + "tipLength": 39.2, + "tipOverlap": 6.2, + }, + "schemaVersion": 2, + "version": 1, + "wells": { + "A1": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 14.38, + "y": 74.25, + "z": 22.25, + }, + "A10": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 95.38, + "y": 74.25, + "z": 22.25, + }, + "A11": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 104.38, + "y": 74.25, + "z": 22.25, + }, + "A12": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 113.38, + "y": 74.25, + "z": 22.25, + }, + "A2": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 23.38, + "y": 74.25, + "z": 22.25, + }, + "A3": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 32.38, + "y": 74.25, + "z": 22.25, + }, + "A4": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 41.38, + "y": 74.25, + "z": 22.25, + }, + "A5": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 50.38, + "y": 74.25, + "z": 22.25, + }, + "A6": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 59.38, + "y": 74.25, + "z": 22.25, + }, + "A7": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 68.38, + "y": 74.25, + "z": 22.25, + }, + "A8": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 77.38, + "y": 74.25, + "z": 22.25, + }, + "A9": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 86.38, + "y": 74.25, + "z": 22.25, + }, + "B1": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 14.38, + "y": 65.25, + "z": 22.25, + }, + "B10": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 95.38, + "y": 65.25, + "z": 22.25, + }, + "B11": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 104.38, + "y": 65.25, + "z": 22.25, + }, + "B12": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 113.38, + "y": 65.25, + "z": 22.25, + }, + "B2": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 23.38, + "y": 65.25, + "z": 22.25, + }, + "B3": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 32.38, + "y": 65.25, + "z": 22.25, + }, + "B4": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 41.38, + "y": 65.25, + "z": 22.25, + }, + "B5": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 50.38, + "y": 65.25, + "z": 22.25, + }, + "B6": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 59.38, + "y": 65.25, + "z": 22.25, + }, + "B7": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 68.38, + "y": 65.25, + "z": 22.25, + }, + "B8": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 77.38, + "y": 65.25, + "z": 22.25, + }, + "B9": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 86.38, + "y": 65.25, + "z": 22.25, + }, + "C1": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 14.38, + "y": 56.25, + "z": 22.25, + }, + "C10": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 95.38, + "y": 56.25, + "z": 22.25, + }, + "C11": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 104.38, + "y": 56.25, + "z": 22.25, + }, + "C12": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 113.38, + "y": 56.25, + "z": 22.25, + }, + "C2": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 23.38, + "y": 56.25, + "z": 22.25, + }, + "C3": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 32.38, + "y": 56.25, + "z": 22.25, + }, + "C4": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 41.38, + "y": 56.25, + "z": 22.25, + }, + "C5": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 50.38, + "y": 56.25, + "z": 22.25, + }, + "C6": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 59.38, + "y": 56.25, + "z": 22.25, + }, + "C7": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 68.38, + "y": 56.25, + "z": 22.25, + }, + "C8": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 77.38, + "y": 56.25, + "z": 22.25, + }, + "C9": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 86.38, + "y": 56.25, + "z": 22.25, + }, + "D1": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 14.38, + "y": 47.25, + "z": 22.25, + }, + "D10": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 95.38, + "y": 47.25, + "z": 22.25, + }, + "D11": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 104.38, + "y": 47.25, + "z": 22.25, + }, + "D12": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 113.38, + "y": 47.25, + "z": 22.25, + }, + "D2": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 23.38, + "y": 47.25, + "z": 22.25, + }, + "D3": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 32.38, + "y": 47.25, + "z": 22.25, + }, + "D4": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 41.38, + "y": 47.25, + "z": 22.25, + }, + "D5": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 50.38, + "y": 47.25, + "z": 22.25, + }, + "D6": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 59.38, + "y": 47.25, + "z": 22.25, + }, + "D7": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 68.38, + "y": 47.25, + "z": 22.25, + }, + "D8": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 77.38, + "y": 47.25, + "z": 22.25, + }, + "D9": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 86.38, + "y": 47.25, + "z": 22.25, + }, + "E1": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 14.38, + "y": 38.25, + "z": 22.25, + }, + "E10": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 95.38, + "y": 38.25, + "z": 22.25, + }, + "E11": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 104.38, + "y": 38.25, + "z": 22.25, + }, + "E12": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 113.38, + "y": 38.25, + "z": 22.25, + }, + "E2": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 23.38, + "y": 38.25, + "z": 22.25, + }, + "E3": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 32.38, + "y": 38.25, + "z": 22.25, + }, + "E4": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 41.38, + "y": 38.25, + "z": 22.25, + }, + "E5": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 50.38, + "y": 38.25, + "z": 22.25, + }, + "E6": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 59.38, + "y": 38.25, + "z": 22.25, + }, + "E7": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 68.38, + "y": 38.25, + "z": 22.25, + }, + "E8": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 77.38, + "y": 38.25, + "z": 22.25, + }, + "E9": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 86.38, + "y": 38.25, + "z": 22.25, + }, + "F1": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 14.38, + "y": 29.25, + "z": 22.25, + }, + "F10": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 95.38, + "y": 29.25, + "z": 22.25, + }, + "F11": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 104.38, + "y": 29.25, + "z": 22.25, + }, + "F12": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 113.38, + "y": 29.25, + "z": 22.25, + }, + "F2": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 23.38, + "y": 29.25, + "z": 22.25, + }, + "F3": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 32.38, + "y": 29.25, + "z": 22.25, + }, + "F4": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 41.38, + "y": 29.25, + "z": 22.25, + }, + "F5": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 50.38, + "y": 29.25, + "z": 22.25, + }, + "F6": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 59.38, + "y": 29.25, + "z": 22.25, + }, + "F7": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 68.38, + "y": 29.25, + "z": 22.25, + }, + "F8": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 77.38, + "y": 29.25, + "z": 22.25, + }, + "F9": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 86.38, + "y": 29.25, + "z": 22.25, + }, + "G1": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 14.38, + "y": 20.25, + "z": 22.25, + }, + "G10": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 95.38, + "y": 20.25, + "z": 22.25, + }, + "G11": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 104.38, + "y": 20.25, + "z": 22.25, + }, + "G12": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 113.38, + "y": 20.25, + "z": 22.25, + }, + "G2": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 23.38, + "y": 20.25, + "z": 22.25, + }, + "G3": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 32.38, + "y": 20.25, + "z": 22.25, + }, + "G4": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 41.38, + "y": 20.25, + "z": 22.25, + }, + "G5": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 50.38, + "y": 20.25, + "z": 22.25, + }, + "G6": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 59.38, + "y": 20.25, + "z": 22.25, + }, + "G7": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 68.38, + "y": 20.25, + "z": 22.25, + }, + "G8": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 77.38, + "y": 20.25, + "z": 22.25, + }, + "G9": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 86.38, + "y": 20.25, + "z": 22.25, + }, + "H1": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 14.38, + "y": 11.25, + "z": 22.25, + }, + "H10": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 95.38, + "y": 11.25, + "z": 22.25, + }, + "H11": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 104.38, + "y": 11.25, + "z": 22.25, + }, + "H12": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 113.38, + "y": 11.25, + "z": 22.25, + }, + "H2": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 23.38, + "y": 11.25, + "z": 22.25, + }, + "H3": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 32.38, + "y": 11.25, + "z": 22.25, + }, + "H4": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 41.38, + "y": 11.25, + "z": 22.25, + }, + "H5": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 50.38, + "y": 11.25, + "z": 22.25, + }, + "H6": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 59.38, + "y": 11.25, + "z": 22.25, + }, + "H7": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 68.38, + "y": 11.25, + "z": 22.25, + }, + "H8": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 77.38, + "y": 11.25, + "z": 22.25, + }, + "H9": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 86.38, + "y": 11.25, + "z": 22.25, + }, }, - "F6": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 59.38, - "y": 29.24, - "z": 5.19, + }, + ], + }, + "p10SingleId": { + "id": "p10SingleId", + "name": "p10_single", + "spec": { + "$otSharedSchema": "#/pipette/schemas/2/pipetteGeometrySchema.json", + "availableSensors": { + "sensors": [], + }, + "backCompatNames": [], + "backlashDistance": 0, + "channels": 1, + "displayCategory": "GEN1", + "displayName": "P10 Single-Channel GEN1", + "dropTipConfigurations": { + "plungerEject": { + "current": 0.5, + "speed": 5, }, - "F7": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 68.38, - "y": 29.24, - "z": 5.19, + }, + "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, + ], + ], + }, + }, + }, + }, }, - "F8": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 77.38, - "y": 29.24, - "z": 5.19, + }, + "model": "p10", + "nozzleMap": { + "A1": [ + 0, + 0, + 12, + ], + }, + "nozzleOffset": [ + 0, + 0, + 12, + ], + "orderedColumns": [ + { + "key": "1", + "orderedNozzles": [ + "A1", + ], }, - "F9": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 86.38, - "y": 29.24, - "z": 5.19, + ], + "orderedRows": [ + { + "key": "A", + "orderedNozzles": [ + "A1", + ], }, - "G1": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 14.38, - "y": 20.24, - "z": 5.19, + ], + "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, + }, }, - "G10": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 95.38, - "y": 20.24, - "z": 5.19, + }, + "pipetteBoundingBoxOffsets": { + "backLeftCorner": [ + 0, + 0, + 12, + ], + "frontRightCorner": [ + 0, + 0, + 12, + ], + }, + "plungerHomingConfigurations": { + "current": 0.3, + "speed": 30, + }, + "plungerMotorConfigurations": { + "idle": 0.05, + "run": 0.3, + }, + "plungerPositionsConfigurations": { + "default": { + "blowout": -1, + "bottom": 2, + "drop": -4.5, + "top": 19.5, }, - "G11": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 104.38, - "y": 20.24, - "z": 5.19, + }, + "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", + "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": "Opentrons GEB 10uL Tiprack", + "displayVolumeUnits": "µL", + "tags": [ + "GEB", + "tiprack", + "10uL", + "Opentrons", + ], + }, + "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", + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7", + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8", + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9", + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10", + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11", + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12", + ], + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "fixture_tiprack_10_ul", + "tipLength": 39.2, + "tipOverlap": 6.2, + }, + "schemaVersion": 2, + "version": 1, + "wells": { + "A1": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 14.38, + "y": 74.25, + "z": 22.25, + }, + "A10": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 95.38, + "y": 74.25, + "z": 22.25, + }, + "A11": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 104.38, + "y": 74.25, + "z": 22.25, + }, + "A12": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 113.38, + "y": 74.25, + "z": 22.25, + }, + "A2": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 23.38, + "y": 74.25, + "z": 22.25, + }, + "A3": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 32.38, + "y": 74.25, + "z": 22.25, + }, + "A4": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 41.38, + "y": 74.25, + "z": 22.25, + }, + "A5": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 50.38, + "y": 74.25, + "z": 22.25, + }, + "A6": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 59.38, + "y": 74.25, + "z": 22.25, + }, + "A7": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 68.38, + "y": 74.25, + "z": 22.25, + }, + "A8": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 77.38, + "y": 74.25, + "z": 22.25, + }, + "A9": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 86.38, + "y": 74.25, + "z": 22.25, + }, + "B1": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 14.38, + "y": 65.25, + "z": 22.25, + }, + "B10": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 95.38, + "y": 65.25, + "z": 22.25, + }, + "B11": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 104.38, + "y": 65.25, + "z": 22.25, + }, + "B12": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 113.38, + "y": 65.25, + "z": 22.25, + }, + "B2": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 23.38, + "y": 65.25, + "z": 22.25, + }, + "B3": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 32.38, + "y": 65.25, + "z": 22.25, + }, + "B4": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 41.38, + "y": 65.25, + "z": 22.25, + }, + "B5": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 50.38, + "y": 65.25, + "z": 22.25, + }, + "B6": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 59.38, + "y": 65.25, + "z": 22.25, + }, + "B7": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 68.38, + "y": 65.25, + "z": 22.25, + }, + "B8": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 77.38, + "y": 65.25, + "z": 22.25, + }, + "B9": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 86.38, + "y": 65.25, + "z": 22.25, + }, + "C1": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 14.38, + "y": 56.25, + "z": 22.25, + }, + "C10": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 95.38, + "y": 56.25, + "z": 22.25, + }, + "C11": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 104.38, + "y": 56.25, + "z": 22.25, + }, + "C12": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 113.38, + "y": 56.25, + "z": 22.25, + }, + "C2": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 23.38, + "y": 56.25, + "z": 22.25, + }, + "C3": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 32.38, + "y": 56.25, + "z": 22.25, + }, + "C4": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 41.38, + "y": 56.25, + "z": 22.25, + }, + "C5": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 50.38, + "y": 56.25, + "z": 22.25, + }, + "C6": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 59.38, + "y": 56.25, + "z": 22.25, + }, + "C7": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 68.38, + "y": 56.25, + "z": 22.25, + }, + "C8": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 77.38, + "y": 56.25, + "z": 22.25, + }, + "C9": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 86.38, + "y": 56.25, + "z": 22.25, + }, + "D1": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 14.38, + "y": 47.25, + "z": 22.25, + }, + "D10": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 95.38, + "y": 47.25, + "z": 22.25, + }, + "D11": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 104.38, + "y": 47.25, + "z": 22.25, + }, + "D12": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 113.38, + "y": 47.25, + "z": 22.25, + }, + "D2": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 23.38, + "y": 47.25, + "z": 22.25, + }, + "D3": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 32.38, + "y": 47.25, + "z": 22.25, + }, + "D4": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 41.38, + "y": 47.25, + "z": 22.25, + }, + "D5": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 50.38, + "y": 47.25, + "z": 22.25, + }, + "D6": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 59.38, + "y": 47.25, + "z": 22.25, + }, + "D7": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 68.38, + "y": 47.25, + "z": 22.25, + }, + "D8": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 77.38, + "y": 47.25, + "z": 22.25, + }, + "D9": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 86.38, + "y": 47.25, + "z": 22.25, + }, + "E1": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 14.38, + "y": 38.25, + "z": 22.25, + }, + "E10": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 95.38, + "y": 38.25, + "z": 22.25, + }, + "E11": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 104.38, + "y": 38.25, + "z": 22.25, + }, + "E12": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 113.38, + "y": 38.25, + "z": 22.25, + }, + "E2": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 23.38, + "y": 38.25, + "z": 22.25, + }, + "E3": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 32.38, + "y": 38.25, + "z": 22.25, + }, + "E4": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 41.38, + "y": 38.25, + "z": 22.25, + }, + "E5": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 50.38, + "y": 38.25, + "z": 22.25, + }, + "E6": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 59.38, + "y": 38.25, + "z": 22.25, + }, + "E7": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 68.38, + "y": 38.25, + "z": 22.25, + }, + "E8": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 77.38, + "y": 38.25, + "z": 22.25, + }, + "E9": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 86.38, + "y": 38.25, + "z": 22.25, + }, + "F1": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 14.38, + "y": 29.25, + "z": 22.25, + }, + "F10": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 95.38, + "y": 29.25, + "z": 22.25, + }, + "F11": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 104.38, + "y": 29.25, + "z": 22.25, + }, + "F12": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 113.38, + "y": 29.25, + "z": 22.25, + }, + "F2": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 23.38, + "y": 29.25, + "z": 22.25, + }, + "F3": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 32.38, + "y": 29.25, + "z": 22.25, + }, + "F4": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 41.38, + "y": 29.25, + "z": 22.25, + }, + "F5": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 50.38, + "y": 29.25, + "z": 22.25, + }, + "F6": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 59.38, + "y": 29.25, + "z": 22.25, + }, + "F7": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 68.38, + "y": 29.25, + "z": 22.25, + }, + "F8": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 77.38, + "y": 29.25, + "z": 22.25, + }, + "F9": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 86.38, + "y": 29.25, + "z": 22.25, + }, + "G1": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 14.38, + "y": 20.25, + "z": 22.25, + }, + "G10": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 95.38, + "y": 20.25, + "z": 22.25, + }, + "G11": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 104.38, + "y": 20.25, + "z": 22.25, + }, + "G12": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 113.38, + "y": 20.25, + "z": 22.25, + }, + "G2": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 23.38, + "y": 20.25, + "z": 22.25, + }, + "G3": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 32.38, + "y": 20.25, + "z": 22.25, + }, + "G4": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 41.38, + "y": 20.25, + "z": 22.25, + }, + "G5": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 50.38, + "y": 20.25, + "z": 22.25, + }, + "G6": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 59.38, + "y": 20.25, + "z": 22.25, + }, + "G7": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 68.38, + "y": 20.25, + "z": 22.25, + }, + "G8": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 77.38, + "y": 20.25, + "z": 22.25, + }, + "G9": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 86.38, + "y": 20.25, + "z": 22.25, + }, + "H1": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 14.38, + "y": 11.25, + "z": 22.25, + }, + "H10": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 95.38, + "y": 11.25, + "z": 22.25, + }, + "H11": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 104.38, + "y": 11.25, + "z": 22.25, + }, + "H12": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 113.38, + "y": 11.25, + "z": 22.25, + }, + "H2": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 23.38, + "y": 11.25, + "z": 22.25, + }, + "H3": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 32.38, + "y": 11.25, + "z": 22.25, + }, + "H4": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 41.38, + "y": 11.25, + "z": 22.25, + }, + "H5": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 50.38, + "y": 11.25, + "z": 22.25, + }, + "H6": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 59.38, + "y": 11.25, + "z": 22.25, + }, + "H7": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 68.38, + "y": 11.25, + "z": 22.25, + }, + "H8": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 77.38, + "y": 11.25, + "z": 22.25, + }, + "H9": { + "depth": 34, + "diameter": 3.46, + "shape": "circular", + "totalLiquidVolume": 10, + "x": 86.38, + "y": 11.25, + "z": 22.25, + }, }, - "G12": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 113.38, - "y": 20.24, - "z": 5.19, + }, + ], + }, + "p300MultiId": { + "id": "p300MultiId", + "name": "p300_multi", + "spec": { + "$otSharedSchema": "#/pipette/schemas/2/pipetteGeometrySchema.json", + "availableSensors": { + "sensors": [], + }, + "backCompatNames": [], + "backlashDistance": 0, + "channels": 8, + "displayCategory": "GEN1", + "displayName": "P300 8-Channel GEN1", + "dropTipConfigurations": { + "plungerEject": { + "current": 0.5, + "speed": 5, }, - "G2": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 23.38, - "y": 20.24, - "z": 5.19, + }, + "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, + ], + ], + }, + }, + }, + }, }, - "G3": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 32.38, - "y": 20.24, - "z": 5.19, + }, + "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", + ], }, - "G4": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 41.38, - "y": 20.24, - "z": 5.19, + ], + "orderedRows": [ + { + "key": "A", + "orderedNozzles": [ + "A1", + ], }, - "G5": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 50.38, - "y": 20.24, - "z": 5.19, + { + "key": "B", + "orderedNozzles": [ + "B1", + ], }, - "G6": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 59.38, - "y": 20.24, - "z": 5.19, + { + "key": "C", + "orderedNozzles": [ + "C1", + ], }, - "G7": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 68.38, - "y": 20.24, - "z": 5.19, + { + "key": "D", + "orderedNozzles": [ + "D1", + ], }, - "G8": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 77.38, - "y": 20.24, - "z": 5.19, + { + "key": "E", + "orderedNozzles": [ + "E1", + ], }, - "G9": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 86.38, - "y": 20.24, - "z": 5.19, + { + "key": "F", + "orderedNozzles": [ + "F1", + ], }, - "H1": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 14.38, - "y": 11.24, - "z": 5.19, + { + "key": "G", + "orderedNozzles": [ + "G1", + ], }, - "H10": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 95.38, - "y": 11.24, - "z": 5.19, + { + "key": "H", + "orderedNozzles": [ + "H1", + ], }, - "H11": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 104.38, - "y": 11.24, - "z": 5.19, + ], + "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, + }, }, - "H12": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 113.38, - "y": 11.24, - "z": 5.19, + }, + "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": 3, + "bottom": 3.5, + "drop": -2, + "top": 19.5, }, - "H2": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 23.38, - "y": 11.24, - "z": 5.19, + }, + "quirks": [ + "dropTipShake", + ], + "shaftDiameter": 5, + "shaftULperMM": 19.635, + }, + "tiprackDefURI": [ + "fixture/fixture_tiprack_300_ul/1", + ], + "tiprackLabwareDef": [ + { + "brand": { + "brand": "Fixture Brand", + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0, + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.49, + }, + "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": "300ul Tiprack FIXTURE", + "displayVolumeUnits": "µL", + "tags": [], }, - "H3": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 32.38, - "y": 11.24, - "z": 5.19, + "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", + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7", + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8", + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9", + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10", + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11", + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12", + ], + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "fixture_tiprack_300_ul", + "tipLength": 59.3, + }, + "schemaVersion": 2, + "version": 1, + "wells": { + "A1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 74.24, + "z": 5.19, + }, + "A10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 74.24, + "z": 5.19, + }, + "A11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 74.24, + "z": 5.19, + }, + "A12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 74.24, + "z": 5.19, + }, + "A2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 74.24, + "z": 5.19, + }, + "A3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 74.24, + "z": 5.19, + }, + "A4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 74.24, + "z": 5.19, + }, + "A5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 74.24, + "z": 5.19, + }, + "A6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 74.24, + "z": 5.19, + }, + "A7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 74.24, + "z": 5.19, + }, + "A8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 74.24, + "z": 5.19, + }, + "A9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 74.24, + "z": 5.19, + }, + "B1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 65.24, + "z": 5.19, + }, + "B10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 65.24, + "z": 5.19, + }, + "B11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 65.24, + "z": 5.19, + }, + "B12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 65.24, + "z": 5.19, + }, + "B2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 65.24, + "z": 5.19, + }, + "B3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 65.24, + "z": 5.19, + }, + "B4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 65.24, + "z": 5.19, + }, + "B5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 65.24, + "z": 5.19, + }, + "B6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 65.24, + "z": 5.19, + }, + "B7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 65.24, + "z": 5.19, + }, + "B8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 65.24, + "z": 5.19, + }, + "B9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 65.24, + "z": 5.19, + }, + "C1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 56.24, + "z": 5.19, + }, + "C10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 56.24, + "z": 5.19, + }, + "C11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 56.24, + "z": 5.19, + }, + "C12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 56.24, + "z": 5.19, + }, + "C2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 56.24, + "z": 5.19, + }, + "C3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 56.24, + "z": 5.19, + }, + "C4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 56.24, + "z": 5.19, + }, + "C5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 56.24, + "z": 5.19, + }, + "C6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 56.24, + "z": 5.19, + }, + "C7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 56.24, + "z": 5.19, + }, + "C8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 56.24, + "z": 5.19, + }, + "C9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 56.24, + "z": 5.19, + }, + "D1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 47.24, + "z": 5.19, + }, + "D10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 47.24, + "z": 5.19, + }, + "D11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 47.24, + "z": 5.19, + }, + "D12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 47.24, + "z": 5.19, + }, + "D2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 47.24, + "z": 5.19, + }, + "D3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 47.24, + "z": 5.19, + }, + "D4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 47.24, + "z": 5.19, + }, + "D5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 47.24, + "z": 5.19, + }, + "D6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 47.24, + "z": 5.19, + }, + "D7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 47.24, + "z": 5.19, + }, + "D8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 47.24, + "z": 5.19, + }, + "D9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 47.24, + "z": 5.19, + }, + "E1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 38.24, + "z": 5.19, + }, + "E10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 38.24, + "z": 5.19, + }, + "E11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 38.24, + "z": 5.19, + }, + "E12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 38.24, + "z": 5.19, + }, + "E2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 38.24, + "z": 5.19, + }, + "E3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 38.24, + "z": 5.19, + }, + "E4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 38.24, + "z": 5.19, + }, + "E5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 38.24, + "z": 5.19, + }, + "E6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 38.24, + "z": 5.19, + }, + "E7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 38.24, + "z": 5.19, + }, + "E8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 38.24, + "z": 5.19, + }, + "E9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 38.24, + "z": 5.19, + }, + "F1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 29.24, + "z": 5.19, + }, + "F10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 29.24, + "z": 5.19, + }, + "F11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 29.24, + "z": 5.19, + }, + "F12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 29.24, + "z": 5.19, + }, + "F2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 29.24, + "z": 5.19, + }, + "F3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 29.24, + "z": 5.19, + }, + "F4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 29.24, + "z": 5.19, + }, + "F5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 29.24, + "z": 5.19, + }, + "F6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 29.24, + "z": 5.19, + }, + "F7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 29.24, + "z": 5.19, + }, + "F8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 29.24, + "z": 5.19, + }, + "F9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 29.24, + "z": 5.19, + }, + "G1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 20.24, + "z": 5.19, + }, + "G10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 20.24, + "z": 5.19, + }, + "G11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 20.24, + "z": 5.19, + }, + "G12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 20.24, + "z": 5.19, + }, + "G2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 20.24, + "z": 5.19, + }, + "G3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 20.24, + "z": 5.19, + }, + "G4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 20.24, + "z": 5.19, + }, + "G5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 20.24, + "z": 5.19, + }, + "G6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 20.24, + "z": 5.19, + }, + "G7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 20.24, + "z": 5.19, + }, + "G8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 20.24, + "z": 5.19, + }, + "G9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 20.24, + "z": 5.19, + }, + "H1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 11.24, + "z": 5.19, + }, + "H10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 11.24, + "z": 5.19, + }, + "H11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 11.24, + "z": 5.19, + }, + "H12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 11.24, + "z": 5.19, + }, + "H2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 11.24, + "z": 5.19, + }, + "H3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 11.24, + "z": 5.19, + }, + "H4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 11.24, + "z": 5.19, + }, + "H5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 11.24, + "z": 5.19, + }, + "H6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 11.24, + "z": 5.19, + }, + "H7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 11.24, + "z": 5.19, + }, + "H8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 11.24, + "z": 5.19, + }, + "H9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 11.24, + "z": 5.19, + }, }, - "H4": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 41.38, - "y": 11.24, - "z": 5.19, + }, + ], + }, + "p300SingleId": { + "id": "p300SingleId", + "name": "p300_single", + "spec": { + "$otSharedSchema": "#/pipette/schemas/2/pipetteGeometrySchema.json", + "availableSensors": { + "sensors": [], + }, + "backCompatNames": [], + "backlashDistance": 0, + "channels": 1, + "displayCategory": "GEN1", + "displayName": "P300 Single-Channel GEN1", + "dropTipConfigurations": { + "plungerEject": { + "current": 0.5, + "speed": 5, }, - "H5": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 50.38, - "y": 11.24, - "z": 5.19, + }, + "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, + ], + ], + }, + }, + }, + }, }, - "H6": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 59.38, - "y": 11.24, - "z": 5.19, + }, + "model": "p300", + "nozzleMap": { + "A1": [ + 0, + 0, + 25, + ], + }, + "nozzleOffset": [ + 0, + 0, + 25, + ], + "orderedColumns": [ + { + "key": "1", + "orderedNozzles": [ + "A1", + ], }, - "H7": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 68.38, - "y": 11.24, - "z": 5.19, + ], + "orderedRows": [ + { + "key": "A", + "orderedNozzles": [ + "A1", + ], }, - "H8": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 77.38, - "y": 11.24, - "z": 5.19, + ], + "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, + }, }, - "H9": { - "depth": 59.3, - "diameter": 5.23, - "shape": "circular", - "totalLiquidVolume": 300, - "x": 86.38, - "y": 11.24, - "z": 5.19, + }, + "pipetteBoundingBoxOffsets": { + "backLeftCorner": [ + 0, + 0, + 25, + ], + "frontRightCorner": [ + 0, + 0, + 25, + ], + }, + "plungerHomingConfigurations": { + "current": 0.3, + "speed": 30, + }, + "plungerMotorConfigurations": { + "idle": 0.05, + "run": 0.3, + }, + "plungerPositionsConfigurations": { + "default": { + "blowout": 0, + "bottom": 1.5, + "drop": -4, + "top": 19.5, }, }, + "quirks": [ + "dropTipShake", + ], + "shaftDiameter": 5, + "shaftULperMM": 19.635, }, + "tiprackDefURI": [ + "fixture/fixture_tiprack_300_ul/1", + ], + "tiprackLabwareDef": [ + { + "brand": { + "brand": "Fixture Brand", + }, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0, + }, + "dimensions": { + "xDimension": 127.76, + "yDimension": 85.48, + "zDimension": 64.49, + }, + "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": "300ul Tiprack FIXTURE", + "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", + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7", + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8", + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9", + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10", + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11", + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12", + ], + ], + "parameters": { + "format": "96Standard", + "isMagneticModuleCompatible": false, + "isTiprack": true, + "loadName": "fixture_tiprack_300_ul", + "tipLength": 59.3, + }, + "schemaVersion": 2, + "version": 1, + "wells": { + "A1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 74.24, + "z": 5.19, + }, + "A10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 74.24, + "z": 5.19, + }, + "A11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 74.24, + "z": 5.19, + }, + "A12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 74.24, + "z": 5.19, + }, + "A2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 74.24, + "z": 5.19, + }, + "A3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 74.24, + "z": 5.19, + }, + "A4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 74.24, + "z": 5.19, + }, + "A5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 74.24, + "z": 5.19, + }, + "A6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 74.24, + "z": 5.19, + }, + "A7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 74.24, + "z": 5.19, + }, + "A8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 74.24, + "z": 5.19, + }, + "A9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 74.24, + "z": 5.19, + }, + "B1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 65.24, + "z": 5.19, + }, + "B10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 65.24, + "z": 5.19, + }, + "B11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 65.24, + "z": 5.19, + }, + "B12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 65.24, + "z": 5.19, + }, + "B2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 65.24, + "z": 5.19, + }, + "B3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 65.24, + "z": 5.19, + }, + "B4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 65.24, + "z": 5.19, + }, + "B5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 65.24, + "z": 5.19, + }, + "B6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 65.24, + "z": 5.19, + }, + "B7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 65.24, + "z": 5.19, + }, + "B8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 65.24, + "z": 5.19, + }, + "B9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 65.24, + "z": 5.19, + }, + "C1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 56.24, + "z": 5.19, + }, + "C10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 56.24, + "z": 5.19, + }, + "C11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 56.24, + "z": 5.19, + }, + "C12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 56.24, + "z": 5.19, + }, + "C2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 56.24, + "z": 5.19, + }, + "C3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 56.24, + "z": 5.19, + }, + "C4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 56.24, + "z": 5.19, + }, + "C5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 56.24, + "z": 5.19, + }, + "C6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 56.24, + "z": 5.19, + }, + "C7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 56.24, + "z": 5.19, + }, + "C8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 56.24, + "z": 5.19, + }, + "C9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 56.24, + "z": 5.19, + }, + "D1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 47.24, + "z": 5.19, + }, + "D10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 47.24, + "z": 5.19, + }, + "D11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 47.24, + "z": 5.19, + }, + "D12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 47.24, + "z": 5.19, + }, + "D2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 47.24, + "z": 5.19, + }, + "D3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 47.24, + "z": 5.19, + }, + "D4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 47.24, + "z": 5.19, + }, + "D5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 47.24, + "z": 5.19, + }, + "D6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 47.24, + "z": 5.19, + }, + "D7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 47.24, + "z": 5.19, + }, + "D8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 47.24, + "z": 5.19, + }, + "D9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 47.24, + "z": 5.19, + }, + "E1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 38.24, + "z": 5.19, + }, + "E10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 38.24, + "z": 5.19, + }, + "E11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 38.24, + "z": 5.19, + }, + "E12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 38.24, + "z": 5.19, + }, + "E2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 38.24, + "z": 5.19, + }, + "E3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 38.24, + "z": 5.19, + }, + "E4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 38.24, + "z": 5.19, + }, + "E5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 38.24, + "z": 5.19, + }, + "E6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 38.24, + "z": 5.19, + }, + "E7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 38.24, + "z": 5.19, + }, + "E8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 38.24, + "z": 5.19, + }, + "E9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 38.24, + "z": 5.19, + }, + "F1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 29.24, + "z": 5.19, + }, + "F10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 29.24, + "z": 5.19, + }, + "F11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 29.24, + "z": 5.19, + }, + "F12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 29.24, + "z": 5.19, + }, + "F2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 29.24, + "z": 5.19, + }, + "F3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 29.24, + "z": 5.19, + }, + "F4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 29.24, + "z": 5.19, + }, + "F5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 29.24, + "z": 5.19, + }, + "F6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 29.24, + "z": 5.19, + }, + "F7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 29.24, + "z": 5.19, + }, + "F8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 29.24, + "z": 5.19, + }, + "F9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 29.24, + "z": 5.19, + }, + "G1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 20.24, + "z": 5.19, + }, + "G10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 20.24, + "z": 5.19, + }, + "G11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 20.24, + "z": 5.19, + }, + "G12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 20.24, + "z": 5.19, + }, + "G2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 20.24, + "z": 5.19, + }, + "G3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 20.24, + "z": 5.19, + }, + "G4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 20.24, + "z": 5.19, + }, + "G5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 20.24, + "z": 5.19, + }, + "G6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 20.24, + "z": 5.19, + }, + "G7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 20.24, + "z": 5.19, + }, + "G8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 20.24, + "z": 5.19, + }, + "G9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 20.24, + "z": 5.19, + }, + "H1": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 14.38, + "y": 11.24, + "z": 5.19, + }, + "H10": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 95.38, + "y": 11.24, + "z": 5.19, + }, + "H11": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 104.38, + "y": 11.24, + "z": 5.19, + }, + "H12": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 113.38, + "y": 11.24, + "z": 5.19, + }, + "H2": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 23.38, + "y": 11.24, + "z": 5.19, + }, + "H3": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 32.38, + "y": 11.24, + "z": 5.19, + }, + "H4": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 41.38, + "y": 11.24, + "z": 5.19, + }, + "H5": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 50.38, + "y": 11.24, + "z": 5.19, + }, + "H6": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 59.38, + "y": 11.24, + "z": 5.19, + }, + "H7": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 68.38, + "y": 11.24, + "z": 5.19, + }, + "H8": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 77.38, + "y": 11.24, + "z": 5.19, + }, + "H9": { + "depth": 59.3, + "diameter": 5.23, + "shape": "circular", + "totalLiquidVolume": 300, + "x": 86.38, + "y": 11.24, + "z": 5.19, + }, + }, + }, + ], }, }, } diff --git a/step-generation/src/__tests__/aspirate.test.ts b/step-generation/src/__tests__/aspirate.test.ts index 36b296eb517..7731f5e389e 100644 --- a/step-generation/src/__tests__/aspirate.test.ts +++ b/step-generation/src/__tests__/aspirate.test.ts @@ -59,12 +59,15 @@ describe('aspirate', () => { }) it('aspirate normally (with tip)', () => { const params = { - ...flowRateAndOffsets, - pipette: DEFAULT_PIPETTE, - volume: 50, - labware: SOURCE_LABWARE, - well: 'A1', - } as AspDispAirgapParams + ...({ + ...flowRateAndOffsets, + pipette: DEFAULT_PIPETTE, + volume: 50, + labware: SOURCE_LABWARE, + well: 'A1', + } as AspDispAirgapParams), + tipRack: 'tiprack1Id', + } const result = aspirate(params, invariantContext, robotStateWithTip) expect(getSuccessResult(result).commands).toEqual([ { @@ -87,20 +90,23 @@ describe('aspirate', () => { ]) }) it('aspirate with volume > tip max volume should throw error', () => { - invariantContext.pipetteEntities[ - DEFAULT_PIPETTE - ].tiprackDefURI = getLabwareDefURI(fixtureTiprack10ul) - invariantContext.pipetteEntities[ - DEFAULT_PIPETTE - ].tiprackLabwareDef = fixtureTiprack10ul + invariantContext.pipetteEntities[DEFAULT_PIPETTE].tiprackDefURI = [ + getLabwareDefURI(fixtureTiprack10ul), + ] + invariantContext.pipetteEntities[DEFAULT_PIPETTE].tiprackLabwareDef = [ + fixtureTiprack10ul, + ] const result = aspirate( { - ...flowRateAndOffsets, - pipette: DEFAULT_PIPETTE, - volume: 201, - labware: SOURCE_LABWARE, - well: 'A1', - } as AspDispAirgapParams, + ...({ + ...flowRateAndOffsets, + pipette: DEFAULT_PIPETTE, + volume: 201, + labware: SOURCE_LABWARE, + well: 'A1', + } as AspDispAirgapParams), + tipRack: 'tiprack1Id', + }, invariantContext, robotStateWithTip ) @@ -111,20 +117,23 @@ describe('aspirate', () => { }) it('aspirate with volume > pipette max volume should throw error', () => { // NOTE: assigning p300 to a 1000uL tiprack is nonsense, just for this test - invariantContext.pipetteEntities[ - DEFAULT_PIPETTE - ].tiprackDefURI = getLabwareDefURI(fixtureTiprack1000ul) - invariantContext.pipetteEntities[ - DEFAULT_PIPETTE - ].tiprackLabwareDef = fixtureTiprack1000ul + invariantContext.pipetteEntities[DEFAULT_PIPETTE].tiprackDefURI = [ + getLabwareDefURI(fixtureTiprack1000ul), + ] + invariantContext.pipetteEntities[DEFAULT_PIPETTE].tiprackLabwareDef = [ + fixtureTiprack1000ul, + ] const result = aspirate( { - ...flowRateAndOffsets, - pipette: DEFAULT_PIPETTE, - volume: 301, - labware: SOURCE_LABWARE, - well: 'A1', - } as AspDispAirgapParams, + ...({ + ...flowRateAndOffsets, + pipette: DEFAULT_PIPETTE, + volume: 301, + labware: SOURCE_LABWARE, + well: 'A1', + } as AspDispAirgapParams), + tipRack: 'tipRack', + }, invariantContext, robotStateWithTip ) @@ -136,12 +145,15 @@ describe('aspirate', () => { it('aspirate with invalid pipette ID should return error', () => { const result = aspirate( { - ...flowRateAndOffsets, - pipette: 'badPipette', - volume: 50, - labware: SOURCE_LABWARE, - well: 'A1', - } as AspDispAirgapParams, + ...({ + ...flowRateAndOffsets, + pipette: 'badPipette', + volume: 50, + labware: SOURCE_LABWARE, + well: 'A1', + } as AspDispAirgapParams), + tipRack: 'tipRack', + }, invariantContext, robotStateWithTip ) @@ -150,12 +162,15 @@ describe('aspirate', () => { it('aspirate with no tip should return error', () => { const result = aspirate( { - ...flowRateAndOffsets, - pipette: DEFAULT_PIPETTE, - volume: 50, - labware: SOURCE_LABWARE, - well: 'A1', - } as AspDispAirgapParams, + ...({ + ...flowRateAndOffsets, + pipette: DEFAULT_PIPETTE, + volume: 50, + labware: SOURCE_LABWARE, + well: 'A1', + } as AspDispAirgapParams), + tipRack: 'tipRack', + }, invariantContext, initialRobotState ) @@ -167,41 +182,21 @@ describe('aspirate', () => { it('aspirate from nonexistent labware should return error', () => { const result = aspirate( { - ...flowRateAndOffsets, - pipette: DEFAULT_PIPETTE, - volume: 50, - labware: 'problematicLabwareId', - well: 'A1', - } as AspDispAirgapParams, - invariantContext, - robotStateWithTip - ) - expect(getErrorResult(result).errors).toHaveLength(1) - expect(getErrorResult(result).errors[0]).toMatchObject({ - type: 'LABWARE_DOES_NOT_EXIST', - }) - }) - it('should return an error when aspirating from the 4th column', () => { - robotStateWithTip = { - ...robotStateWithTip, - labware: { - [SOURCE_LABWARE]: { slot: 'A4' }, + ...({ + ...flowRateAndOffsets, + pipette: DEFAULT_PIPETTE, + volume: 50, + labware: 'problemaaticLabwareId', + well: 'A1', + } as AspDispAirgapParams), + tipRack: 'tipRack', }, - } - const result = aspirate( - { - ...flowRateAndOffsets, - pipette: DEFAULT_PIPETTE, - volume: 50, - labware: SOURCE_LABWARE, - well: 'A1', - } as AspDispAirgapParams, invariantContext, robotStateWithTip ) expect(getErrorResult(result).errors).toHaveLength(1) expect(getErrorResult(result).errors[0]).toMatchObject({ - type: 'PIPETTING_INTO_COLUMN_4', + type: 'LABWARE_DOES_NOT_EXIST', }) }) it('should return an error when aspirating from labware off deck', () => { @@ -211,12 +206,15 @@ describe('aspirate', () => { const result = aspirate( { - ...flowRateAndOffsets, - pipette: DEFAULT_PIPETTE, - volume: 50, - labware: SOURCE_LABWARE, - well: 'A1', - } as AspDispAirgapParams, + ...({ + ...flowRateAndOffsets, + pipette: DEFAULT_PIPETTE, + volume: 50, + labware: SOURCE_LABWARE, + well: 'A1', + } as AspDispAirgapParams), + tipRack: 'tipRack', + }, invariantContext, initialRobotState ) @@ -240,12 +238,15 @@ describe('aspirate', () => { ) const result = aspirate( { - ...flowRateAndOffsets, - pipette: DEFAULT_PIPETTE, - volume: 50, - labware: SOURCE_LABWARE, - well: 'A1', - } as AspDispAirgapParams, + ...({ + ...flowRateAndOffsets, + pipette: DEFAULT_PIPETTE, + volume: 50, + labware: SOURCE_LABWARE, + well: 'A1', + } as AspDispAirgapParams), + tipRack: 'tipRack', + }, invariantContext, robotStateWithTip ) @@ -269,12 +270,15 @@ describe('aspirate', () => { ) const result = aspirate( { - ...flowRateAndOffsets, - pipette: DEFAULT_PIPETTE, - volume: 50, - labware: SOURCE_LABWARE, - well: 'A1', - } as AspDispAirgapParams, + ...({ + ...flowRateAndOffsets, + pipette: DEFAULT_PIPETTE, + volume: 50, + labware: SOURCE_LABWARE, + well: 'A1', + } as AspDispAirgapParams), + tipRack: 'tipRack', + }, invariantContext, robotStateWithTip ) @@ -304,12 +308,15 @@ describe('aspirate', () => { ) const result = aspirate( { - ...flowRateAndOffsets, - pipette: DEFAULT_PIPETTE, - volume: 50, - labware: SOURCE_LABWARE, - well: 'A1', - } as AspDispAirgapParams, + ...({ + ...flowRateAndOffsets, + pipette: DEFAULT_PIPETTE, + volume: 50, + labware: SOURCE_LABWARE, + well: 'A1', + } as AspDispAirgapParams), + tipRack: 'tipRack', + }, invariantContext, robotStateWithTip ) @@ -333,12 +340,15 @@ describe('aspirate', () => { ) const result = aspirate( { - ...flowRateAndOffsets, - pipette: DEFAULT_PIPETTE, - volume: 50, - labware: SOURCE_LABWARE, - well: 'A1', - } as AspDispAirgapParams, + ...({ + ...flowRateAndOffsets, + pipette: DEFAULT_PIPETTE, + volume: 50, + labware: SOURCE_LABWARE, + well: 'A1', + } as AspDispAirgapParams), + tipRack: 'tipRack', + }, invariantContext, robotStateWithTip ) @@ -368,12 +378,15 @@ describe('aspirate', () => { ) const result = aspirate( { - ...flowRateAndOffsets, - pipette: DEFAULT_PIPETTE, - volume: 50, - labware: SOURCE_LABWARE, - well: 'A1', - } as AspDispAirgapParams, + ...({ + ...flowRateAndOffsets, + pipette: DEFAULT_PIPETTE, + volume: 50, + labware: SOURCE_LABWARE, + well: 'A1', + } as AspDispAirgapParams), + tipRack: 'tipRack', + }, invariantContext, robotStateWithTip ) @@ -393,12 +406,15 @@ describe('aspirate', () => { const result = aspirate( { - ...flowRateAndOffsets, - pipette: DEFAULT_PIPETTE, - volume: 50, - labware: SOURCE_LABWARE, - well: 'A1', - } as AspDispAirgapParams, + ...({ + ...flowRateAndOffsets, + pipette: DEFAULT_PIPETTE, + volume: 50, + labware: SOURCE_LABWARE, + well: 'A1', + } as AspDispAirgapParams), + tipRack: 'tipRack', + }, invariantContext, robotStateWithTip ) @@ -417,12 +433,15 @@ describe('aspirate', () => { const result = aspirate( { - ...flowRateAndOffsets, - pipette: DEFAULT_PIPETTE, - volume: 50, - labware: SOURCE_LABWARE, - well: 'A1', - } as AspDispAirgapParams, + ...({ + ...flowRateAndOffsets, + pipette: DEFAULT_PIPETTE, + volume: 50, + labware: SOURCE_LABWARE, + well: 'A1', + } as AspDispAirgapParams), + tipRack: 'tipRack', + }, invariantContext, robotStateWithTip ) @@ -441,12 +460,15 @@ describe('aspirate', () => { const result = aspirate( { - ...flowRateAndOffsets, - pipette: DEFAULT_PIPETTE, - volume: 50, - labware: SOURCE_LABWARE, - well: 'A1', - } as AspDispAirgapParams, + ...({ + ...flowRateAndOffsets, + pipette: DEFAULT_PIPETTE, + volume: 50, + labware: SOURCE_LABWARE, + well: 'A1', + } as AspDispAirgapParams), + tipRack: 'tipRack', + }, invariantContext, robotStateWithTip ) @@ -467,12 +489,15 @@ describe('aspirate', () => { const result = aspirate( { - ...flowRateAndOffsets, - pipette: DEFAULT_PIPETTE, - volume: 50, - labware: SOURCE_LABWARE, - well: 'A1', - } as AspDispAirgapParams, + ...({ + ...flowRateAndOffsets, + pipette: DEFAULT_PIPETTE, + volume: 50, + labware: SOURCE_LABWARE, + well: 'A1', + } as AspDispAirgapParams), + tipRack: 'tipRack', + }, invariantContext, robotStateWithTip ) diff --git a/step-generation/src/__tests__/consolidate.test.ts b/step-generation/src/__tests__/consolidate.test.ts index c462716dcce..219c7b51c54 100644 --- a/step-generation/src/__tests__/consolidate.test.ts +++ b/step-generation/src/__tests__/consolidate.test.ts @@ -97,6 +97,7 @@ beforeEach(() => { mixInDestination: null, blowoutLocation: null, dropTipLocation: FIXED_TRASH_ID, + tipRack: 'tiprack1Id', } }) @@ -3058,6 +3059,7 @@ describe('consolidate multi-channel', () => { const data: ConsolidateArgs = { ...args, volume: 140, + tipRack: 'tiprack1Id', changeTip: 'once', } as ConsolidateArgs const result = consolidate(data, invariantContext, initialRobotState) diff --git a/step-generation/src/__tests__/distribute.test.ts b/step-generation/src/__tests__/distribute.test.ts index e72059b4c38..2db91df01d2 100644 --- a/step-generation/src/__tests__/distribute.test.ts +++ b/step-generation/src/__tests__/distribute.test.ts @@ -69,7 +69,7 @@ beforeEach(() => { commandCreatorFnName: 'distribute', name: 'distribute test', description: 'test blah blah', - + tipRack: 'tiprack1Id', pipette: DEFAULT_PIPETTE, sourceLabware: SOURCE_LABWARE, destLabware: DEST_LABWARE, @@ -246,6 +246,7 @@ describe('tip handling for multiple distribute chunks', () => { destWells: ['A2', 'A3', 'A4', 'A5'], changeTip: 'always', volume: 150, + tipRack: 'tiprack1Id', } as DistributeArgs const result = distribute( diff --git a/step-generation/src/__tests__/mix.test.ts b/step-generation/src/__tests__/mix.test.ts index f0ef6f06c9a..c2392a94c98 100644 --- a/step-generation/src/__tests__/mix.test.ts +++ b/step-generation/src/__tests__/mix.test.ts @@ -41,7 +41,7 @@ beforeEach(() => { commandCreatorFnName: 'mix', name: 'mix test', description: 'test blah blah', - + tipRack: 'tiprack1Id', pipette: DEFAULT_PIPETTE, labware: SOURCE_LABWARE, diff --git a/step-generation/src/__tests__/ninetySixChannelCollision.test.ts b/step-generation/src/__tests__/ninetySixChannelCollision.test.ts index fe40f92a8d0..aae8c8acab9 100644 --- a/step-generation/src/__tests__/ninetySixChannelCollision.test.ts +++ b/step-generation/src/__tests__/ninetySixChannelCollision.test.ts @@ -9,6 +9,7 @@ let robotState: RobotState const mockSourceId = 'sourceId' const mockWestId = 'westId' const mockPipetteId = 'pipetteId' +const mockTiprackId = 'tiprackId' const mockSourceDef: LabwareDefinition2 = { dimensions: { zDimension: 100 }, } as any @@ -38,8 +39,8 @@ describe('getIsTallLabwareWestOf96Channel ', () => { [mockPipetteId]: { name: 'p1000_96', id: mockPipetteId, - tiprackDefURI: 'mockUri', - tiprackLabwareDef: mockTiprackDefinition, + tiprackDefURI: ['mockUri'], + tiprackLabwareDef: [mockTiprackDefinition], spec: {} as any, }, }, @@ -58,7 +59,8 @@ describe('getIsTallLabwareWestOf96Channel ', () => { robotState, invariantContext, mockSourceId, - mockPipetteId + mockPipetteId, + mockTiprackId ) ).toBe(false) }) @@ -78,7 +80,8 @@ describe('getIsTallLabwareWestOf96Channel ', () => { robotState, invariantContext, mockSourceId, - mockPipetteId + mockPipetteId, + mockTiprackId ) ).toBe(false) }) @@ -89,7 +92,8 @@ describe('getIsTallLabwareWestOf96Channel ', () => { robotState, invariantContext, mockSourceId, - mockPipetteId + mockPipetteId, + mockTiprackId ) ).toBe(false) }) @@ -111,7 +115,8 @@ describe('getIsTallLabwareWestOf96Channel ', () => { robotState, invariantContext, mockSourceId, - mockPipetteId + mockPipetteId, + mockTiprackId ) ).toBe(false) }) @@ -133,7 +138,8 @@ describe('getIsTallLabwareWestOf96Channel ', () => { robotState, invariantContext, mockSourceId, - mockPipetteId + mockPipetteId, + mockTiprackId ) ).toBe(true) }) diff --git a/step-generation/src/__tests__/replaceTip.test.ts b/step-generation/src/__tests__/replaceTip.test.ts index 7dce819f4c0..0cd85058ca4 100644 --- a/step-generation/src/__tests__/replaceTip.test.ts +++ b/step-generation/src/__tests__/replaceTip.test.ts @@ -38,6 +38,7 @@ describe('replaceTip', () => { { pipette: p300SingleId, dropTipLocation: FIXED_TRASH_ID, + tipRack: tiprack1Id, }, invariantContext, initialRobotState @@ -50,6 +51,7 @@ describe('replaceTip', () => { { pipette: p300SingleId, dropTipLocation: FIXED_TRASH_ID, + tipRack: tiprack1Id, }, invariantContext, merge({}, initialRobotState, { @@ -83,6 +85,7 @@ describe('replaceTip', () => { { pipette: p300SingleId, dropTipLocation: FIXED_TRASH_ID, + tipRack: tiprack1Id, }, invariantContext, initialTestRobotState @@ -107,6 +110,7 @@ describe('replaceTip', () => { { pipette: p300SingleId, dropTipLocation: FIXED_TRASH_ID, + tipRack: tiprack1Id, }, invariantContext, initialTestRobotState @@ -132,6 +136,7 @@ describe('replaceTip', () => { { pipette: p300SingleId, dropTipLocation: FIXED_TRASH_ID, + tipRack: tiprack1Id, }, invariantContext, initialTestRobotState @@ -170,6 +175,7 @@ describe('replaceTip', () => { { pipette: p300SingleId, dropTipLocation: 'wasteChuteId', + tipRack: tiprack1Id, }, invariantContext, initialTestRobotState @@ -188,6 +194,7 @@ describe('replaceTip', () => { { pipette: p300MultiId, dropTipLocation: FIXED_TRASH_ID, + tipRack: tiprack1Id, }, invariantContext, initialRobotState @@ -214,6 +221,7 @@ describe('replaceTip', () => { { pipette: p300MultiId, dropTipLocation: FIXED_TRASH_ID, + tipRack: tiprack1Id, }, invariantContext, robotStateWithTipA1Missing @@ -239,6 +247,7 @@ describe('replaceTip', () => { { pipette: p300MultiId, dropTipLocation: FIXED_TRASH_ID, + tipRack: tiprack1Id, }, invariantContext, robotStateWithTipsOnMulti @@ -283,6 +292,7 @@ describe('replaceTip', () => { { pipette: p100096Id, dropTipLocation: 'wasteChuteId', + tipRack: tiprack5Id, nozzles: COLUMN, }, invariantContext, diff --git a/step-generation/src/__tests__/robotStateSelectors.test.ts b/step-generation/src/__tests__/robotStateSelectors.test.ts index 105b7cfc155..e74549a87ed 100644 --- a/step-generation/src/__tests__/robotStateSelectors.test.ts +++ b/step-generation/src/__tests__/robotStateSelectors.test.ts @@ -22,6 +22,7 @@ import { InvariantContext } from '../types' let invariantContext: InvariantContext const fixtureTiprack300ul = _fixtureTiprack300ul as LabwareDefinition2 +const mockTiprackId = 'tiprack1Id' beforeEach(() => { invariantContext = makeContext() @@ -150,7 +151,12 @@ describe('getNextTiprack - single-channel', () => { robotState.tipState.tipracks.tiprack1Id.A1 = false - const result = getNextTiprack(DEFAULT_PIPETTE, invariantContext, robotState) + const result = getNextTiprack( + DEFAULT_PIPETTE, + mockTiprackId, + invariantContext, + robotState + ) expect(result && result.nextTiprack?.tiprackId).toEqual('tiprack1Id') expect(result && result.nextTiprack?.well).toEqual('B1') @@ -164,7 +170,12 @@ describe('getNextTiprack - single-channel', () => { tiprackSetting: { tiprack1Id: false }, }) - const result = getNextTiprack(DEFAULT_PIPETTE, invariantContext, robotState) + const result = getNextTiprack( + DEFAULT_PIPETTE, + mockTiprackId, + invariantContext, + robotState + ) expect(result.nextTiprack).toEqual(null) }) @@ -178,7 +189,12 @@ describe('getNextTiprack - single-channel', () => { }, tiprackSetting: { tiprack1Id: true, tiprack2Id: true }, }) - const result = getNextTiprack(DEFAULT_PIPETTE, invariantContext, robotState) + const result = getNextTiprack( + DEFAULT_PIPETTE, + mockTiprackId, + invariantContext, + robotState + ) expect(result && result.nextTiprack?.tiprackId).toEqual('tiprack1Id') expect(result && result.nextTiprack?.well).toEqual('A1') @@ -197,7 +213,12 @@ describe('getNextTiprack - single-channel', () => { // remove A1 tip from both racks robotState.tipState.tipracks.tiprack1Id.A1 = false robotState.tipState.tipracks.tiprack2Id.A1 = false - const result = getNextTiprack(DEFAULT_PIPETTE, invariantContext, robotState) + const result = getNextTiprack( + DEFAULT_PIPETTE, + mockTiprackId, + invariantContext, + robotState + ) expect(result && result.nextTiprack?.tiprackId).toEqual('tiprack1Id') expect(result && result.nextTiprack?.well).toEqual('B1') @@ -213,7 +234,12 @@ describe('getNextTiprack - single-channel', () => { }, tiprackSetting: { tiprack1Id: false, tiprack2Id: false }, }) - const result = getNextTiprack(DEFAULT_PIPETTE, invariantContext, robotState) + const result = getNextTiprack( + DEFAULT_PIPETTE, + mockTiprackId, + invariantContext, + robotState + ) expect(result.nextTiprack).toBe(null) }) @@ -230,7 +256,12 @@ describe('getNextTiprack - 8-channel', () => { tiprackSetting: { tiprack1Id: true }, }) - const result = getNextTiprack('p300MultiId', invariantContext, robotState) + const result = getNextTiprack( + 'p300MultiId', + mockTiprackId, + invariantContext, + robotState + ) expect(result && result.nextTiprack?.tiprackId).toEqual('tiprack1Id') expect(result && result.nextTiprack?.well).toEqual('A1') @@ -251,7 +282,12 @@ describe('getNextTiprack - 8-channel', () => { A2: false, A5: false, } - const result = getNextTiprack('p300MultiId', invariantContext, robotState) + const result = getNextTiprack( + 'p300MultiId', + mockTiprackId, + invariantContext, + robotState + ) expect(result && result.nextTiprack?.tiprackId).toEqual('tiprack1Id') expect(result && result.nextTiprack?.well).toEqual('A3') @@ -266,7 +302,12 @@ describe('getNextTiprack - 8-channel', () => { }, tiprackSetting: { tiprack1Id: false }, }) - const result = getNextTiprack('p300MultiId', invariantContext, robotState) + const result = getNextTiprack( + 'p300MultiId', + mockTiprackId, + invariantContext, + robotState + ) expect(result.nextTiprack).toEqual(null) }) @@ -296,7 +337,12 @@ describe('getNextTiprack - 8-channel', () => { F12: false, } - const result = getNextTiprack('p300MultiId', invariantContext, robotState) + const result = getNextTiprack( + 'p300MultiId', + mockTiprackId, + invariantContext, + robotState + ) expect(result.nextTiprack).toEqual(null) }) @@ -312,7 +358,12 @@ describe('getNextTiprack - 8-channel', () => { }, tiprackSetting: { tiprack1Id: true, tiprack2Id: true, tiprack3Id: true }, }) - const result = getNextTiprack('p300MultiId', invariantContext, robotState) + const result = getNextTiprack( + 'p300MultiId', + mockTiprackId, + invariantContext, + robotState + ) expect(result && result.nextTiprack?.tiprackId).toEqual('tiprack1Id') expect(result && result.nextTiprack?.well).toEqual('A1') @@ -367,7 +418,12 @@ describe('getNextTiprack - 8-channel', () => { A1: false, } - const result = getNextTiprack('p300MultiId', invariantContext, robotState) + const result = getNextTiprack( + 'p300MultiId', + mockTiprackId, + invariantContext, + robotState + ) expect(result && result.nextTiprack?.tiprackId).toEqual('tiprack3Id') expect(result && result.nextTiprack?.well).toEqual('A2') @@ -388,7 +444,12 @@ describe('getNextTiprack - 8-channel', () => { tiprack3Id: false, }, }) - const result = getNextTiprack('p300MultiId', invariantContext, robotState) + const result = getNextTiprack( + 'p300MultiId', + mockTiprackId, + invariantContext, + robotState + ) expect(result.nextTiprack).toEqual(null) }) }) diff --git a/step-generation/src/__tests__/transfer.test.ts b/step-generation/src/__tests__/transfer.test.ts index 533167ef61e..43b33ce0ca3 100644 --- a/step-generation/src/__tests__/transfer.test.ts +++ b/step-generation/src/__tests__/transfer.test.ts @@ -64,7 +64,7 @@ beforeEach(() => { name: 'Transfer Test', description: 'test blah blah', pipette: DEFAULT_PIPETTE, - + tipRack: 'tiprack1Id', sourceLabware: SOURCE_LABWARE, destLabware: DEST_LABWARE, @@ -136,7 +136,6 @@ describe('pick up tip if no tip on pipette', () => { const result = transfer(noTipArgs, invariantContext, robotStateWithTip) const res = getSuccessResult(result) - console.log(res.commands) expect(res.commands).toEqual([ pickUpTipHelper('A1'), aspirateHelper('A1', 30), diff --git a/step-generation/src/__tests__/utils.test.ts b/step-generation/src/__tests__/utils.test.ts index e4eb35c6a47..f5ff87703eb 100644 --- a/step-generation/src/__tests__/utils.test.ts +++ b/step-generation/src/__tests__/utils.test.ts @@ -274,15 +274,15 @@ describe('makeInitialRobotState', () => { id: 'p10SingleId', name: 'p10_single', spec: fixtureP10SingleV2Specs, - tiprackDefURI: getLabwareDefURI(fixtureTiprack10ul), - tiprackLabwareDef: fixtureTiprack10ul, + tiprackDefURI: [getLabwareDefURI(fixtureTiprack10ul)], + tiprackLabwareDef: [fixtureTiprack10ul], }, p300MultiId: { id: 'p300MultiId', name: 'p300_multi', spec: fixtureP300MultiV2Specs, - tiprackDefURI: getLabwareDefURI(fixtureTiprack300ul), - tiprackLabwareDef: fixtureTiprack300ul, + tiprackDefURI: [getLabwareDefURI(fixtureTiprack300ul)], + tiprackLabwareDef: [fixtureTiprack300ul], }, }, moduleEntities: { diff --git a/step-generation/src/commandCreators/atomic/aspirate.ts b/step-generation/src/commandCreators/atomic/aspirate.ts index 6a468e0b4fa..fb360c4cebf 100644 --- a/step-generation/src/commandCreators/atomic/aspirate.ts +++ b/step-generation/src/commandCreators/atomic/aspirate.ts @@ -17,8 +17,11 @@ import type { CreateCommand } from '@opentrons/shared-data' import type { AspirateParams } from '@opentrons/shared-data/protocol/types/schemaV3' import type { CommandCreator, CommandCreatorError } from '../../types' +export interface ExtendedAspirateParams extends AspirateParams { + tipRack: string +} /** Aspirate with given args. Requires tip. */ -export const aspirate: CommandCreator = ( +export const aspirate: CommandCreator = ( args, invariantContext, prevRobotState @@ -31,6 +34,7 @@ export const aspirate: CommandCreator = ( offsetFromBottomMm, flowRate, isAirGap, + tipRack, } = args const actionName = 'aspirate' const errors: CommandCreatorError[] = [] @@ -169,8 +173,11 @@ export const aspirate: CommandCreator = ( } if (errors.length === 0 && pipetteSpec) { - const tipMaxVolume = getPipetteWithTipMaxVol(pipette, invariantContext) - + const tipMaxVolume = getPipetteWithTipMaxVol( + pipette, + invariantContext, + tipRack + ) if (tipMaxVolume < volume) { errors.push( errorCreators.tipVolumeExceeded({ diff --git a/step-generation/src/commandCreators/atomic/replaceTip.ts b/step-generation/src/commandCreators/atomic/replaceTip.ts index d90165cebce..85160be713c 100644 --- a/step-generation/src/commandCreators/atomic/replaceTip.ts +++ b/step-generation/src/commandCreators/atomic/replaceTip.ts @@ -62,6 +62,7 @@ const _pickUpTip: CommandCreator = ( interface ReplaceTipArgs { pipette: string dropTipLocation: string + tipRack: string | null nozzles?: NozzleConfigurationStyle } @@ -75,9 +76,16 @@ export const replaceTip: CommandCreator = ( invariantContext, prevRobotState ) => { - const { pipette, dropTipLocation, nozzles } = args + const { pipette, dropTipLocation, nozzles, tipRack } = args + + if (tipRack == null) { + return { + errors: [errorCreators.noTipSelected()], + } + } const { nextTiprack, tipracks } = getNextTiprack( pipette, + tipRack, invariantContext, prevRobotState, nozzles @@ -156,7 +164,8 @@ export const replaceTip: CommandCreator = ( prevRobotState, invariantContext, nextTiprack.tiprackId, - pipette + pipette, + tipRack ) ) { return { diff --git a/step-generation/src/commandCreators/compound/consolidate.ts b/step-generation/src/commandCreators/compound/consolidate.ts index e43e482084b..09c1b02a9ae 100644 --- a/step-generation/src/commandCreators/compound/consolidate.ts +++ b/step-generation/src/commandCreators/compound/consolidate.ts @@ -95,7 +95,8 @@ export const consolidate: CommandCreator = ( prevRobotState, invariantContext, args.sourceLabware, - args.pipette + args.pipette, + args.tipRack ) ) { return { @@ -117,7 +118,8 @@ export const consolidate: CommandCreator = ( prevRobotState, invariantContext, args.destLabware, - args.pipette + args.pipette, + args.tipRack ) ) { return { @@ -153,7 +155,7 @@ export const consolidate: CommandCreator = ( } = args const aspirateAirGapVolume = args.aspirateAirGapVolume || 0 const maxWellsPerChunk = Math.floor( - getPipetteWithTipMaxVol(args.pipette, invariantContext) / + getPipetteWithTipMaxVol(args.pipette, invariantContext, args.tipRack) / (args.volume + aspirateAirGapVolume) ) const sourceLabwareDef = @@ -217,6 +219,7 @@ export const consolidate: CommandCreator = ( flowRate: aspirateFlowRateUlSec, offsetFromBottomMm: airGapOffsetSourceWell, isAirGap: true, + tipRack: args.tipRack, }), ...(aspirateDelay != null ? [ @@ -273,6 +276,7 @@ export const consolidate: CommandCreator = ( well: sourceWell, flowRate: aspirateFlowRateUlSec, offsetFromBottomMm: aspirateOffsetFromBottomMm, + tipRack: args.tipRack, }), ...delayAfterAspirateCommands, ...touchTipAfterAspirateCommand, @@ -290,6 +294,7 @@ export const consolidate: CommandCreator = ( curryCommandCreator(replaceTip, { pipette: args.pipette, dropTipLocation, + tipRack: args.tipRack, }), ] } @@ -320,6 +325,7 @@ export const consolidate: CommandCreator = ( dispenseFlowRateUlSec, aspirateDelaySeconds: aspirateDelay?.seconds, dispenseDelaySeconds: dispenseDelay?.seconds, + tipRack: args.tipRack, }) : [] const preWetTipCommands = args.preWetTip // Pre-wet tip is equivalent to a single mix, with volume equal to the consolidate volume. @@ -335,6 +341,7 @@ export const consolidate: CommandCreator = ( dispenseFlowRateUlSec, aspirateDelaySeconds: aspirateDelay?.seconds, dispenseDelaySeconds: dispenseDelay?.seconds, + tipRack: args.tipRack, }) : [] // can not mix in a waste chute @@ -352,6 +359,7 @@ export const consolidate: CommandCreator = ( dispenseFlowRateUlSec, aspirateDelaySeconds: aspirateDelay?.seconds, dispenseDelaySeconds: dispenseDelay?.seconds, + tipRack: args.tipRack, }) : [] @@ -423,6 +431,7 @@ export const consolidate: CommandCreator = ( destWell: destinationWell, flowRate: aspirateFlowRateUlSec, offsetFromBottomMm: airGapOffsetDestWell, + tipRack: args.tipRack, }), ...(aspirateDelay != null ? [ diff --git a/step-generation/src/commandCreators/compound/distribute.ts b/step-generation/src/commandCreators/compound/distribute.ts index 12c93ce9a3e..9662a07d959 100644 --- a/step-generation/src/commandCreators/compound/distribute.ts +++ b/step-generation/src/commandCreators/compound/distribute.ts @@ -95,7 +95,8 @@ export const distribute: CommandCreator = ( prevRobotState, invariantContext, args.sourceLabware, - args.pipette + args.pipette, + args.tipRack ) ) { errors.push( @@ -115,7 +116,8 @@ export const distribute: CommandCreator = ( prevRobotState, invariantContext, args.destLabware, - args.pipette + args.pipette, + args.tipRack ) ) { errors.push( @@ -152,7 +154,7 @@ export const distribute: CommandCreator = ( const disposalVolume = args.disposalVolume && args.disposalVolume > 0 ? args.disposalVolume : 0 const maxVolume = - getPipetteWithTipMaxVol(args.pipette, invariantContext) - + getPipetteWithTipMaxVol(args.pipette, invariantContext, args.tipRack) - aspirateAirGapVolume const maxWellsPerChunk = Math.floor( (maxVolume - disposalVolume) / args.volume @@ -209,6 +211,7 @@ export const distribute: CommandCreator = ( flowRate: aspirateFlowRateUlSec, offsetFromBottomMm: airGapOffsetSourceWell, isAirGap: true, + tipRack: args.tipRack, }), ...(aspirateDelay != null ? [ @@ -304,6 +307,7 @@ export const distribute: CommandCreator = ( curryCommandCreator(replaceTip, { pipette: args.pipette, dropTipLocation: args.dropTipLocation, + tipRack: args.tipRack, }), ] } @@ -332,6 +336,7 @@ export const distribute: CommandCreator = ( flowRate: aspirateFlowRateUlSec, offsetFromBottomMm: airGapOffsetDestWell, isAirGap: true, + tipRack: args.tipRack, }), ...(aspirateDelay != null ? [ @@ -433,6 +438,7 @@ export const distribute: CommandCreator = ( dispenseFlowRateUlSec, aspirateDelaySeconds: aspirateDelay?.seconds, dispenseDelaySeconds: dispenseDelay?.seconds, + tipRack: args.tipRack, }) : [] @@ -471,6 +477,7 @@ export const distribute: CommandCreator = ( well: args.sourceWell, flowRate: aspirateFlowRateUlSec, offsetFromBottomMm: aspirateOffsetFromBottomMm, + tipRack: args.tipRack, }), ...delayAfterAspirateCommands, ...touchTipAfterAspirateCommand, diff --git a/step-generation/src/commandCreators/compound/mix.ts b/step-generation/src/commandCreators/compound/mix.ts index 01d870eeb4b..4a918da5a0d 100644 --- a/step-generation/src/commandCreators/compound/mix.ts +++ b/step-generation/src/commandCreators/compound/mix.ts @@ -34,6 +34,7 @@ export function mixUtil(args: { dispenseOffsetFromBottomMm: number aspirateFlowRateUlSec: number dispenseFlowRateUlSec: number + tipRack: string aspirateDelaySeconds?: number | null | undefined dispenseDelaySeconds?: number | null | undefined }): CurriedCommandCreator[] { @@ -49,6 +50,7 @@ export function mixUtil(args: { dispenseFlowRateUlSec, aspirateDelaySeconds, dispenseDelaySeconds, + tipRack, } = args const getDelayCommand = (seconds?: number | null): CurriedCommandCreator[] => @@ -73,6 +75,7 @@ export function mixUtil(args: { well, offsetFromBottomMm: aspirateOffsetFromBottomMm, flowRate: aspirateFlowRateUlSec, + tipRack, }), ...getDelayCommand(aspirateDelaySeconds), curryCommandCreator(dispense, { @@ -119,6 +122,7 @@ export const mix: CommandCreator = ( blowoutFlowRateUlSec, blowoutOffsetFromTopMm, dropTipLocation, + tipRack, } = data const is96Channel = @@ -165,7 +169,8 @@ export const mix: CommandCreator = ( prevRobotState, invariantContext, labware, - pipette + pipette, + tipRack ) ) { return { @@ -212,6 +217,7 @@ export const mix: CommandCreator = ( pipette, dropTipLocation, nozzles: data.nozzles ?? undefined, + tipRack, }), ] } @@ -250,6 +256,7 @@ export const mix: CommandCreator = ( dispenseFlowRateUlSec, aspirateDelaySeconds, dispenseDelaySeconds, + tipRack, }) return [ ...configureNozzleLayoutCommand, diff --git a/step-generation/src/commandCreators/compound/transfer.ts b/step-generation/src/commandCreators/compound/transfer.ts index 9bf32757408..6d57f7ee457 100644 --- a/step-generation/src/commandCreators/compound/transfer.ts +++ b/step-generation/src/commandCreators/compound/transfer.ts @@ -134,7 +134,8 @@ export const transfer: CommandCreator = ( prevRobotState, invariantContext, args.sourceLabware, - args.pipette + args.pipette, + args.tipRack ) ) { errors.push( @@ -154,7 +155,8 @@ export const transfer: CommandCreator = ( prevRobotState, invariantContext, args.destLabware, - args.pipette + args.pipette, + args.tipRack ) ) { errors.push( @@ -202,11 +204,12 @@ export const transfer: CommandCreator = ( blowoutOffsetFromTopMm, dispenseFlowRateUlSec, dispenseOffsetFromBottomMm, + tipRack, } = args const aspirateAirGapVolume = args.aspirateAirGapVolume || 0 const dispenseAirGapVolume = args.dispenseAirGapVolume || 0 const effectiveTransferVol = - getPipetteWithTipMaxVol(args.pipette, invariantContext) - + getPipetteWithTipMaxVol(args.pipette, invariantContext, tipRack) - aspirateAirGapVolume const liquidMinVolumes = Object.values(pipetteSpec.liquids).map( liquid => liquid.minVolume @@ -307,6 +310,7 @@ export const transfer: CommandCreator = ( pipette: args.pipette, nozzles: args.nozzles ?? undefined, dropTipLocation: args.dropTipLocation, + tipRack: args.tipRack, }), ] : [] @@ -324,6 +328,7 @@ export const transfer: CommandCreator = ( dispenseFlowRateUlSec, aspirateDelaySeconds: aspirateDelay?.seconds, dispenseDelaySeconds: dispenseDelay?.seconds, + tipRack, }) : [] const mixBeforeAspirateCommands = @@ -340,6 +345,7 @@ export const transfer: CommandCreator = ( dispenseFlowRateUlSec, aspirateDelaySeconds: aspirateDelay?.seconds, dispenseDelaySeconds: dispenseDelay?.seconds, + tipRack, }) : [] const delayAfterAspirateCommands = @@ -403,6 +409,7 @@ export const transfer: CommandCreator = ( dispenseFlowRateUlSec, aspirateDelaySeconds: aspirateDelay?.seconds, dispenseDelaySeconds: dispenseDelay?.seconds, + tipRack, }) : [] @@ -417,6 +424,7 @@ export const transfer: CommandCreator = ( flowRate: aspirateFlowRateUlSec, offsetFromBottomMm: airGapOffsetSourceWell, isAirGap: true, + tipRack, }), ...(aspirateDelay != null ? [ @@ -477,6 +485,7 @@ export const transfer: CommandCreator = ( well: sourceWell, flowRate: aspirateFlowRateUlSec, offsetFromBottomMm: aspirateOffsetFromBottomMm, + tipRack, }), ] const dispenseCommand = [ @@ -535,6 +544,7 @@ export const transfer: CommandCreator = ( destWell: destinationWell, flowRate: aspirateFlowRateUlSec, offsetFromBottomMm: airGapOffsetDestWell, + tipRack, }), ...(aspirateDelay != null ? [ diff --git a/step-generation/src/errorCreators.ts b/step-generation/src/errorCreators.ts index 97f6caf9beb..50a271effe0 100644 --- a/step-generation/src/errorCreators.ts +++ b/step-generation/src/errorCreators.ts @@ -256,3 +256,10 @@ export const cannotMoveWithGripper = (): CommandCreatorError => { message: 'The gripper cannot move aluminum blocks', } } + +export const noTipSelected = (): CommandCreatorError => { + return { + type: 'NO_TIP_SELECTED', + message: 'No tips were selected for this step', + } +} diff --git a/step-generation/src/fixtures/robotStateFixtures.ts b/step-generation/src/fixtures/robotStateFixtures.ts index 8f65913f3e8..a3a7e47062d 100644 --- a/step-generation/src/fixtures/robotStateFixtures.ts +++ b/step-generation/src/fixtures/robotStateFixtures.ts @@ -149,40 +149,40 @@ export function makeContext(): InvariantContext { name: 'p10_single', id: 'p10SingleId', - tiprackDefURI: getLabwareDefURI(fixtureTiprack10ul), - tiprackLabwareDef: fixtureTiprack10ul, + tiprackDefURI: [getLabwareDefURI(fixtureTiprack10ul)], + tiprackLabwareDef: [fixtureTiprack10ul], spec: fixtureP10SingleV2Specs, }, p10MultiId: { name: 'p10_multi', id: 'p10MultiId', - tiprackDefURI: getLabwareDefURI(fixtureTiprack10ul), - tiprackLabwareDef: fixtureTiprack10ul, + tiprackDefURI: [getLabwareDefURI(fixtureTiprack10ul)], + tiprackLabwareDef: [fixtureTiprack10ul], spec: fixtureP10MultiV2Specs, }, [DEFAULT_PIPETTE]: { name: 'p300_single', id: DEFAULT_PIPETTE, - tiprackDefURI: getLabwareDefURI(fixtureTiprack300ul), - tiprackLabwareDef: fixtureTiprack300ul, + tiprackDefURI: [getLabwareDefURI(fixtureTiprack300ul)], + tiprackLabwareDef: [fixtureTiprack300ul], spec: fixtureP300SingleV2Specs, }, [MULTI_PIPETTE]: { name: 'p300_multi', id: MULTI_PIPETTE, - tiprackDefURI: getLabwareDefURI(fixtureTiprack300ul), - tiprackLabwareDef: fixtureTiprack300ul, + tiprackDefURI: [getLabwareDefURI(fixtureTiprack300ul)], + tiprackLabwareDef: [fixtureTiprack300ul], spec: fixtureP300MultiV2Specs, }, [PIPETTE_96]: { name: 'p1000_96', id: PIPETTE_96, - tiprackDefURI: getLabwareDefURI(fixtureTiprack1000ul), - tiprackLabwareDef: fixtureTiprack1000ul, + tiprackDefURI: [getLabwareDefURI(fixtureTiprack1000ul)], + tiprackLabwareDef: [fixtureTiprack1000ul], spec: fixtureP100096V2Specs, }, } diff --git a/step-generation/src/robotStateSelectors.ts b/step-generation/src/robotStateSelectors.ts index 397d527ed70..b9dc676275d 100644 --- a/step-generation/src/robotStateSelectors.ts +++ b/step-generation/src/robotStateSelectors.ts @@ -3,6 +3,7 @@ import assert from 'assert' import min from 'lodash/min' import { getTiprackVolume, + getLabwareDefURI, THERMOCYCLER_MODULE_TYPE, orderWells, NozzleConfigurationStyle, @@ -88,6 +89,7 @@ interface NextTiprackInfo { } export function getNextTiprack( pipetteId: string, + tipRack: string, invariantContext: InvariantContext, robotState: RobotState, nozzles?: NozzleConfigurationStyle @@ -113,11 +115,11 @@ export function getNextTiprack( `cannot getNextTiprack, no labware entity for "${labwareId}"` ) const isOnDeck = robotState.labware[labwareId].slot != null - return ( - isOnDeck && - pipetteEntity.tiprackDefURI === - invariantContext.labwareEntities[labwareId]?.labwareDefURI - ) + const labwareIdDefUri = + invariantContext.labwareEntities[labwareId].labwareDefURI + const tipRackDefUri = + invariantContext.labwareEntities[tipRack].labwareDefURI + return isOnDeck && labwareIdDefUri === tipRackDefUri } ) const is96Channel = pipetteEntity.spec.channels === 96 @@ -181,14 +183,23 @@ export function getNextTiprack( } export function getPipetteWithTipMaxVol( pipetteId: string, - invariantContext: InvariantContext + invariantContext: InvariantContext, + tipRack: string ): number { // 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.liquids.default.maxVolume const tiprackDef = pipetteEntity.tiprackLabwareDef - const tiprackTipVol = getTiprackVolume(tiprackDef) + const tipRackDefUri = invariantContext.labwareEntities[tipRack].labwareDefURI + let chosenTipRack = null + for (const def of tiprackDef) { + if (getLabwareDefURI(def) === tipRackDefUri) { + chosenTipRack = def + break + } + } + const tiprackTipVol = getTiprackVolume(chosenTipRack ?? tiprackDef[0]) if (!pipetteMaxVol || !tiprackTipVol) { assert( diff --git a/step-generation/src/types.ts b/step-generation/src/types.ts index 34d1d01a215..98e1e8ec90c 100644 --- a/step-generation/src/types.ts +++ b/step-generation/src/types.ts @@ -108,7 +108,7 @@ export interface NormalizedPipetteById { [pipetteId: string]: { name: PipetteName id: string - tiprackDefURI: string + tiprackDefURI: string[] } } @@ -131,7 +131,7 @@ export type NormalizedPipette = NormalizedPipetteById[keyof NormalizedPipetteByI // when they are de-normalized, the definitions they reference are baked in // =========== PIPETTES ======== export type PipetteEntity = NormalizedPipette & { - tiprackLabwareDef: LabwareDefinition2 + tiprackLabwareDef: LabwareDefinition2[] spec: PipetteV2Specs } @@ -166,6 +166,7 @@ interface CommonArgs { // ===== Processed form types. Used as args to call command creator fns ===== export type SharedTransferLikeArgs = CommonArgs & { + tipRack: string // tipRackDefUri pipette: string // PipetteId nozzles: NozzleConfigurationStyle | null // setting for 96-channel sourceLabware: string @@ -261,6 +262,7 @@ export type DistributeArgs = SharedTransferLikeArgs & { export type MixArgs = CommonArgs & { commandCreatorFnName: 'mix' + tipRack: string // tipRackDefUri labware: string pipette: string nozzles: NozzleConfigurationStyle | null // setting for 96-channel @@ -518,6 +520,7 @@ export type ErrorType = | 'MISSING_TEMPERATURE_STEP' | 'MODULE_PIPETTE_COLLISION_DANGER' | 'NO_TIP_ON_PIPETTE' + | 'NO_TIP_SELECTED' | 'PIPETTE_DOES_NOT_EXIST' | 'PIPETTE_HAS_TIP' | 'PIPETTE_VOLUME_EXCEEDED' diff --git a/step-generation/src/utils/misc.ts b/step-generation/src/utils/misc.ts index f6e46fcfeee..c9f36587213 100644 --- a/step-generation/src/utils/misc.ts +++ b/step-generation/src/utils/misc.ts @@ -604,6 +604,7 @@ interface AirGapArgs { destWell: string | null flowRate: number offsetFromBottomMm: number + tipRack: string pipetteId: string volume: number blowOutLocation?: string | null @@ -622,6 +623,7 @@ export const airGapHelper: CommandCreator = ( flowRate, offsetFromBottomMm, pipetteId, + tipRack, sourceId, sourceWell, volume, @@ -657,6 +659,7 @@ export const airGapHelper: CommandCreator = ( flowRate, offsetFromBottomMm, isAirGap: true, + tipRack, }), ] // when aspirating out of multi wells for consolidate @@ -670,6 +673,7 @@ export const airGapHelper: CommandCreator = ( flowRate, offsetFromBottomMm, isAirGap: true, + tipRack, }), ] } diff --git a/step-generation/src/utils/ninetySixChannelCollision.ts b/step-generation/src/utils/ninetySixChannelCollision.ts index 60dc39dc15f..7a2b7f3e0c1 100644 --- a/step-generation/src/utils/ninetySixChannelCollision.ts +++ b/step-generation/src/utils/ninetySixChannelCollision.ts @@ -9,17 +9,14 @@ export const getIsTallLabwareWestOf96Channel = ( robotState: RobotState, invariantContext: InvariantContext, sourceLabwareId: string, - pipetteId: string + pipetteId: string, + tipRackId: string ): boolean => { - const { - labwareEntities, - additionalEquipmentEntities, - pipetteEntities, - } = invariantContext + const { labwareEntities, additionalEquipmentEntities } = invariantContext const { labware: labwareState, tipState } = robotState const pipetteHasTip = tipState.pipettes[pipetteId] const tipLength = pipetteHasTip - ? pipetteEntities[pipetteId].tiprackLabwareDef.parameters.tipLength ?? 0 + ? labwareEntities[tipRackId].def.parameters.tipLength ?? 0 : 0 // early exit if source labware is the waste chute or trash bin if (additionalEquipmentEntities[sourceLabwareId] != null) {