diff --git a/protocol-designer/cypress/integration/mixSettings.spec.js b/protocol-designer/cypress/integration/mixSettings.spec.js index 809c92237b3..60fabb65d78 100644 --- a/protocol-designer/cypress/integration/mixSettings.spec.js +++ b/protocol-designer/cypress/integration/mixSettings.spec.js @@ -59,7 +59,7 @@ describe('Advanced Settings for Mix Form', () => { cy.get('input[name="aspirate_flowRate"]').should('be.disabled') // TipPosition Aspirate should be disabled - cy.get('[id=TipPositionField_mix_mmFromBottom]').should('be.disabled') + cy.get('[id=TipPositionIcon_mix_mmFromBottom]').should('not.be.enabled') // Dispense Flowrate disbled cy.get('input[name="dispense_flowRate"]').should('be.disabled') @@ -91,7 +91,7 @@ describe('Advanced Settings for Mix Form', () => { cy.get('input[name="dispense_flowRate"]').should('be.enabled') // TipPosition Aspirate should be enabled - cy.get('[id=TipPositionField_mix_mmFromBottom]').should('be.enabled') + cy.get('[id=TipPositionIcon_mix_mmFromBottom]').should('not.be.disabled') // Delay in aspirate and Dispense settings is enabled cy.get('input[name="aspirate_delay_checkbox"]').should('be.enabled') diff --git a/protocol-designer/cypress/integration/transferSettings.spec.js b/protocol-designer/cypress/integration/transferSettings.spec.js index a4c831fddd4..82fa26f8dae 100644 --- a/protocol-designer/cypress/integration/transferSettings.spec.js +++ b/protocol-designer/cypress/integration/transferSettings.spec.js @@ -53,7 +53,7 @@ describe('Advanced Settings for Transfer Form', () => { it('Verify functionality of advanced settings with different pipette and labware', () => { enterBatchEdit() - // Different Pipette disbales aspirate and dispense Flowrate and Mix settings + // Different Pipette disables aspirate and dispense Flowrate and Mix settings // step 6 has different pipette than step 1 cy.get('[data-test="StepItem_6"]').click(batchEditClickOptions) @@ -68,10 +68,14 @@ describe('Advanced Settings for Transfer Form', () => { cy.get('input[name="aspirate_mix_checkbox"]').should('be.disabled') // TipPosition Aspirate and Dispense should be disabled - cy.get('[id=TipPositionField_aspirate_mmFromBottom]').should('be.disabled') - cy.get('[id=TipPositionField_dispense_mmFromBottom]').should('be.disabled') + cy.get('[id=TipPositionIcon_aspirate_mmFromBottom]').should( + 'not.be.enabled' + ) + cy.get('[id=TipPositionIcon_dispense_mmFromBottom]').should( + 'not.be.enabled' + ) - // Dispense Flowrate and mix diabled + // Dispense Flowrate and mix disabled cy.get('input[name="dispense_flowRate"]').should('be.disabled') cy.get('input[name="dispense_mix_checkbox"]').should('be.disabled') @@ -108,8 +112,12 @@ describe('Advanced Settings for Transfer Form', () => { .should('be.empty') // TipPosition Aspirate and Dispense should be enabled - cy.get('[id=TipPositionField_aspirate_mmFromBottom]').should('be.enabled') - cy.get('[id=TipPositionField_dispense_mmFromBottom]').should('be.enabled') + cy.get('[id=TipPositionIcon_aspirate_mmFromBottom]').should( + 'not.be.disabled' + ) + cy.get('[id=TipPositionIcon_dispense_mmFromBottom]').should( + 'not.be.disabled' + ) // Delay in aspirate and Dispense settings is enabled cy.get('input[name="aspirate_delay_checkbox"]').should('be.enabled') diff --git a/protocol-designer/fixtures/protocol/8/doItAllV3MigratedToV8.json b/protocol-designer/fixtures/protocol/8/doItAllV3MigratedToV8.json index 9bc7b9e44ed..340c594e596 100644 --- a/protocol-designer/fixtures/protocol/8/doItAllV3MigratedToV8.json +++ b/protocol-designer/fixtures/protocol/8/doItAllV3MigratedToV8.json @@ -6,7 +6,7 @@ "author": "Fixture", "description": "Test all v3 commands", "created": 1585930833548, - "lastModified": 1709303240330, + "lastModified": 1711742442671, "category": null, "subcategory": null, "tags": [] @@ -15,7 +15,7 @@ "name": "opentrons/protocol-designer", "version": "8.1.0", "data": { - "_internalAppBuildDate": "Fri, 01 Mar 2024 14:22:27 GMT", + "_internalAppBuildDate": "Fri, 29 Mar 2024 20:00:04 GMT", "defaultValues": { "aspirate_mmFromBottom": 1, "dispense_mmFromBottom": 0.5, @@ -116,6 +116,10 @@ "dispense_delay_mmFromBottom": "0.5", "dropTip_location": "8053a205-f2dc-4b1d-8d05-bf8233949e2e:trashBin", "nozzles": null, + "dispense_x_position": 0, + "dispense_y_position": 0, + "aspirate_x_position": 0, + "aspirate_y_position": 0, "id": "3961e4c0-75c7-11ea-b42f-4b64e50f43e5", "stepType": "moveLiquid", "stepName": "transfer", @@ -170,6 +174,8 @@ "dropTip_location": "8053a205-f2dc-4b1d-8d05-bf8233949e2e:trashBin", "nozzles": null, "tipRack": "0b44c760-75c7-11ea-b42f-4b64e50f43e5:opentrons/opentrons_96_tiprack_300ul/1", + "mix_x_position": 0, + "mix_y_position": 0, "id": "a4cee9a0-75dc-11ea-b42f-4b64e50f43e5", "stepType": "mix", "stepName": "mix", @@ -2518,7 +2524,7 @@ "commandSchemaId": "opentronsCommandSchemaV8", "commands": [ { - "key": "db2d2973-9059-41a8-a6f7-3b70b747cb2d", + "key": "d371b7e2-71a8-4a60-90bc-7e865d9881b9", "commandType": "loadPipette", "params": { "pipetteName": "p300_single_gen2", @@ -2527,7 +2533,7 @@ } }, { - "key": "d9bb5f59-77e8-4794-af52-5ac18181a1c9", + "key": "424963b7-59f8-434a-bedc-9597e7b72c9f", "commandType": "loadLabware", "params": { "displayName": "Opentrons 96 Tip Rack 300 µL", @@ -2539,7 +2545,7 @@ } }, { - "key": "e375681d-7284-4f0c-9921-d16e4ce0649e", + "key": "05ef86f7-dec0-4134-a15d-5e38ef81cf8e", "commandType": "loadLabware", "params": { "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", @@ -2551,7 +2557,7 @@ } }, { - "key": "9455cd08-4d3a-45e4-8614-7485193e824e", + "key": "ddefc5ef-b69a-4172-921b-959ba5e8d8d2", "commandType": "loadLabware", "params": { "displayName": "Opentrons 24 Well Aluminum Block with Generic 2 mL Screwcap", @@ -2564,7 +2570,7 @@ }, { "commandType": "loadLiquid", - "key": "27c67940-a745-41b9-b4d8-01a8dba8b4e9", + "key": "2a2084d5-67d8-4806-b919-5962a6258c1f", "params": { "liquidId": "0", "labwareId": "1e610d40-75c7-11ea-b42f-4b64e50f43e5:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1", @@ -2590,12 +2596,12 @@ }, { "commandType": "waitForDuration", - "key": "b7c8d36b-c9d6-4fa3-a696-da35a3cc5981", + "key": "c1a1eff4-7ef7-46be-aee7-ebca5924ace8", "params": { "seconds": 62, "message": "" } }, { "commandType": "pickUpTip", - "key": "d97988e7-e386-4965-a915-f4776a0d7720", + "key": "63ca0ab5-4cb6-4531-b912-1ba22e1b1a03", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "labwareId": "0b44c760-75c7-11ea-b42f-4b64e50f43e5:opentrons/opentrons_96_tiprack_300ul/1", @@ -2604,67 +2610,82 @@ }, { "commandType": "aspirate", - "key": "a60e86c1-8bf0-477f-8748-24ce798eb1de", + "key": "5ead7532-0eb2-4ad9-b704-856422fc9408", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 30, "labwareId": "1e610d40-75c7-11ea-b42f-4b64e50f43e5:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 46.43 } }, { "commandType": "dispense", - "key": "61afaad0-0566-4435-b03a-94498d2fc2aa", + "key": "3838f7d1-3450-49cc-a222-c8113eecf108", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 30, "labwareId": "1e610d40-75c7-11ea-b42f-4b64e50f43e5:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 46.43 } }, { "commandType": "aspirate", - "key": "4ccf6427-d404-4b4b-9974-935a6676d8d2", + "key": "25697ae7-169d-447a-906c-4e7f02950fe9", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 30, "labwareId": "1e610d40-75c7-11ea-b42f-4b64e50f43e5:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 46.43 } }, { "commandType": "dispense", - "key": "bcdd9d53-ff68-4264-bd61-e11422149144", + "key": "49a139f4-87ba-421d-9ef4-4ebe13beb987", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 30, "labwareId": "1e610d40-75c7-11ea-b42f-4b64e50f43e5:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 46.43 } }, { "commandType": "aspirate", - "key": "ce51dbac-b2ed-4edd-9657-33c106288844", + "key": "4e96faa5-c669-4b60-b15c-9d2f01c9c3fe", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 100, "labwareId": "1e610d40-75c7-11ea-b42f-4b64e50f43e5:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 46.43 } }, { "commandType": "touchTip", - "key": "a1993756-c789-4804-8ff0-f3f9577d68f4", + "key": "8eff88a1-fec9-46d7-b292-f6ce378e5ad9", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "labwareId": "1e610d40-75c7-11ea-b42f-4b64e50f43e5:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1", @@ -2674,19 +2695,22 @@ }, { "commandType": "dispense", - "key": "270e73e1-719a-4338-9a8d-7ef8cdab558e", + "key": "c95e323c-be69-4460-8acf-d1d4b74384bd", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 40, "labwareId": "21ed8f60-75c7-11ea-b42f-4b64e50f43e5:opentrons/opentrons_24_aluminumblock_generic_2ml_screwcap/1", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 0.5, "x": 0, "y": 0 } + }, "flowRate": 46.43 } }, { "commandType": "touchTip", - "key": "45fd9725-1bef-4333-bce3-e4e81fc94fd4", + "key": "0da25745-5e25-4138-b67c-dfc4c89c8949", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "labwareId": "21ed8f60-75c7-11ea-b42f-4b64e50f43e5:opentrons/opentrons_24_aluminumblock_generic_2ml_screwcap/1", @@ -2696,19 +2720,22 @@ }, { "commandType": "dispense", - "key": "ede9c8e0-ced4-4a60-841e-c28476d28ab8", + "key": "28eeb3d1-6e83-4414-8c0d-e8761ca2f75a", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 40, "labwareId": "21ed8f60-75c7-11ea-b42f-4b64e50f43e5:opentrons/opentrons_24_aluminumblock_generic_2ml_screwcap/1", "wellName": "A2", - "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 0.5, "x": 0, "y": 0 } + }, "flowRate": 46.43 } }, { "commandType": "touchTip", - "key": "d7fb1df9-ee04-4a6d-98e0-1ded591260bc", + "key": "8cd5d90d-df0b-4c3b-8cb3-cea6f1849fef", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "labwareId": "21ed8f60-75c7-11ea-b42f-4b64e50f43e5:opentrons/opentrons_24_aluminumblock_generic_2ml_screwcap/1", @@ -2718,7 +2745,7 @@ }, { "commandType": "moveToAddressableArea", - "key": "35f1f9b9-78f2-4a1a-9b7b-3c488881db2b", + "key": "35643d1f-ae0b-4a90-9de4-c9eb3c9b775e", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "addressableAreaName": "fixedTrash", @@ -2727,7 +2754,7 @@ }, { "commandType": "blowOutInPlace", - "key": "7dbec34d-5da6-41aa-9ff9-9368efa23407", + "key": "d540a57a-6968-44a0-8645-b221a9b7bfd7", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "flowRate": 46.43 @@ -2735,7 +2762,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "7c10381b-bee1-4908-94c5-11d76a966a12", + "key": "c721cfd7-fef8-4fcb-9d6f-1d78f2317729", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "addressableAreaName": "fixedTrash", @@ -2745,17 +2772,17 @@ }, { "commandType": "dropTipInPlace", - "key": "fb84a594-b8b9-4950-81f0-cc2be260346e", + "key": "a18788f3-cd5f-4470-8831-455d14883d1c", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5" } }, { "commandType": "waitForResume", - "key": "340df2fa-adf0-4b43-90d7-2e1d8f09ba71", + "key": "a54eb58b-ce5c-4a59-ba85-ed75438146a7", "params": { "message": "Wait until user intervention" } }, { "commandType": "pickUpTip", - "key": "9ff49b09-2860-4955-bd6f-a68ab3797208", + "key": "c1bddcd0-d5cf-4d7c-b830-a5b27a5a71cb", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "labwareId": "0b44c760-75c7-11ea-b42f-4b64e50f43e5:opentrons/opentrons_96_tiprack_300ul/1", @@ -2764,79 +2791,97 @@ }, { "commandType": "aspirate", - "key": "249a56b1-e68b-449d-aad1-9a4bd9113a34", + "key": "1660f6c2-9072-4348-b034-cb45712f8cd7", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 35, "labwareId": "1e610d40-75c7-11ea-b42f-4b64e50f43e5:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1", "wellName": "D2", - "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 0.5, "x": 0, "y": 0 } + }, "flowRate": 40 } }, { "commandType": "dispense", - "key": "5503460e-fc28-4ebf-b476-88d2517ec4c5", + "key": "c3683fde-b4e0-4432-ad96-932292f2ebcd", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 35, "labwareId": "1e610d40-75c7-11ea-b42f-4b64e50f43e5:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1", "wellName": "D2", - "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 0.5, "x": 0, "y": 0 } + }, "flowRate": 35 } }, { "commandType": "aspirate", - "key": "75c377d3-a93f-4310-9c06-1ee6e1d2fdb1", + "key": "59251222-f64d-400b-98a6-71f95f24bec7", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 35, "labwareId": "1e610d40-75c7-11ea-b42f-4b64e50f43e5:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1", "wellName": "D2", - "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 0.5, "x": 0, "y": 0 } + }, "flowRate": 40 } }, { "commandType": "dispense", - "key": "c0ad7408-1f69-4092-8de0-524a0c3991e4", + "key": "a370936b-c12f-4039-88d0-97bb262cb80e", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 35, "labwareId": "1e610d40-75c7-11ea-b42f-4b64e50f43e5:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1", "wellName": "D2", - "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 0.5, "x": 0, "y": 0 } + }, "flowRate": 35 } }, { "commandType": "aspirate", - "key": "2c04b095-4f0c-4cd7-a1bc-8daee4e05f38", + "key": "8f428646-3bd6-4a90-9674-23d3e3be8a63", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 35, "labwareId": "1e610d40-75c7-11ea-b42f-4b64e50f43e5:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1", "wellName": "D2", - "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 0.5, "x": 0, "y": 0 } + }, "flowRate": 40 } }, { "commandType": "dispense", - "key": "8ead30e3-b057-4994-b00c-c18a838d86ad", + "key": "445797f5-5799-486a-b0e2-299e2f23ca2a", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 35, "labwareId": "1e610d40-75c7-11ea-b42f-4b64e50f43e5:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1", "wellName": "D2", - "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 0.5, "x": 0, "y": 0 } + }, "flowRate": 35 } }, { "commandType": "moveToAddressableArea", - "key": "41dc50be-94fb-49f6-9ac6-9c8948622640", + "key": "d740d713-a3cb-4bdb-81a5-798059db8be7", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "addressableAreaName": "fixedTrash", @@ -2845,7 +2890,7 @@ }, { "commandType": "blowOutInPlace", - "key": "4147917f-bca1-4ef4-b055-0610002a3572", + "key": "ba227a58-a0b1-4d83-93f8-4a3566cbedf1", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "flowRate": 35 @@ -2853,7 +2898,7 @@ }, { "commandType": "touchTip", - "key": "5692383d-d3c3-4969-9b76-c5dfd265e4c5", + "key": "68b765bb-a232-49ec-b6be-fc6b375b0a15", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "labwareId": "1e610d40-75c7-11ea-b42f-4b64e50f43e5:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1", @@ -2863,7 +2908,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "e389e5ae-8109-4a68-a8e5-58d96f453a85", + "key": "1464952c-cb00-48eb-a9db-8a4367d3ce0b", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "addressableAreaName": "fixedTrash", @@ -2873,12 +2918,12 @@ }, { "commandType": "dropTipInPlace", - "key": "82048ca4-6ad6-4de9-ad94-4fc698e3aaff", + "key": "2d96c742-46d0-4efa-8e94-3118e975bdd4", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5" } }, { "commandType": "pickUpTip", - "key": "b868a416-8074-4e21-8483-39b0bbc89ba2", + "key": "75a6817c-7f41-4a8c-a184-5e6e7aad51e9", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "labwareId": "0b44c760-75c7-11ea-b42f-4b64e50f43e5:opentrons/opentrons_96_tiprack_300ul/1", @@ -2887,79 +2932,97 @@ }, { "commandType": "aspirate", - "key": "677f3413-0fb0-428d-875a-32d3c8971ca1", + "key": "3e1db7e3-a5eb-473c-a98b-1c91e9b70c3d", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 35, "labwareId": "1e610d40-75c7-11ea-b42f-4b64e50f43e5:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1", "wellName": "E2", - "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 0.5, "x": 0, "y": 0 } + }, "flowRate": 40 } }, { "commandType": "dispense", - "key": "6cafa525-b6f6-4ab4-8919-6398ecdcad50", + "key": "d37facff-0753-4d92-9599-93141c97a90f", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 35, "labwareId": "1e610d40-75c7-11ea-b42f-4b64e50f43e5:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1", "wellName": "E2", - "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 0.5, "x": 0, "y": 0 } + }, "flowRate": 35 } }, { "commandType": "aspirate", - "key": "ef66610b-0d69-405b-91e9-9d46ef6f9e49", + "key": "df03e618-352a-44e8-8890-859f53229f10", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 35, "labwareId": "1e610d40-75c7-11ea-b42f-4b64e50f43e5:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1", "wellName": "E2", - "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 0.5, "x": 0, "y": 0 } + }, "flowRate": 40 } }, { "commandType": "dispense", - "key": "88fbf912-ebaf-4148-9339-2b8fe5d8381d", + "key": "0b93f43f-b456-47fa-b9d7-89086cd9c20b", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 35, "labwareId": "1e610d40-75c7-11ea-b42f-4b64e50f43e5:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1", "wellName": "E2", - "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 0.5, "x": 0, "y": 0 } + }, "flowRate": 35 } }, { "commandType": "aspirate", - "key": "86107fa6-c935-4123-bf58-76643dc888d5", + "key": "310303b6-76e3-4765-bd82-042eac727669", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 35, "labwareId": "1e610d40-75c7-11ea-b42f-4b64e50f43e5:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1", "wellName": "E2", - "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 0.5, "x": 0, "y": 0 } + }, "flowRate": 40 } }, { "commandType": "dispense", - "key": "2c8d07b1-3f65-4554-99aa-3bc8899a5bd6", + "key": "9881ac40-2932-4197-a03b-77c936651a3b", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 35, "labwareId": "1e610d40-75c7-11ea-b42f-4b64e50f43e5:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1", "wellName": "E2", - "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 0.5, "x": 0, "y": 0 } + }, "flowRate": 35 } }, { "commandType": "moveToAddressableArea", - "key": "52740457-0f28-44b5-a053-80a7b8be7932", + "key": "f521a11f-1676-4dc2-a022-f5eba1c5d22e", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "addressableAreaName": "fixedTrash", @@ -2968,7 +3031,7 @@ }, { "commandType": "blowOutInPlace", - "key": "cff38f29-4334-4fe3-a361-465f2ce46be5", + "key": "daede461-9d74-4259-91e6-ecf7ddaa4897", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "flowRate": 35 @@ -2976,7 +3039,7 @@ }, { "commandType": "touchTip", - "key": "e9c841a0-f8e2-4f07-9eb6-6d03764259a6", + "key": "0cde152c-2aeb-4e86-9745-3732e0074ba7", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "labwareId": "1e610d40-75c7-11ea-b42f-4b64e50f43e5:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1", @@ -2986,7 +3049,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "f1dc8237-78ef-4116-88f5-42d426086e63", + "key": "cb24aade-655e-4f6f-83d7-1b60457b56e6", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "addressableAreaName": "fixedTrash", @@ -2996,7 +3059,7 @@ }, { "commandType": "dropTipInPlace", - "key": "c7ebd1ef-9d28-43dc-9fdd-6142a1b22c70", + "key": "6970ad16-6e47-4f5c-afba-3704abe0eabb", "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 6a3d3888cba..1e87c78fe87 100644 --- a/protocol-designer/fixtures/protocol/8/doItAllV4MigratedToV8.json +++ b/protocol-designer/fixtures/protocol/8/doItAllV4MigratedToV8.json @@ -6,7 +6,7 @@ "author": "Fixture", "description": "Test all v4 commands", "created": 1585930833548, - "lastModified": 1709303209919, + "lastModified": 1711742493128, "category": null, "subcategory": null, "tags": [] @@ -15,7 +15,7 @@ "name": "opentrons/protocol-designer", "version": "8.1.0", "data": { - "_internalAppBuildDate": "Fri, 01 Mar 2024 14:22:27 GMT", + "_internalAppBuildDate": "Fri, 29 Mar 2024 20:00:04 GMT", "defaultValues": { "aspirate_mmFromBottom": 1, "dispense_mmFromBottom": 0.5, @@ -150,6 +150,10 @@ "dispense_delay_mmFromBottom": "0.5", "dropTip_location": "84882326-9cd3-428e-8352-89f133a1fe5d:trashBin", "nozzles": null, + "dispense_x_position": 0, + "dispense_y_position": 0, + "aspirate_x_position": 0, + "aspirate_y_position": 0, "id": "3961e4c0-75c7-11ea-b42f-4b64e50f43e5", "stepType": "moveLiquid", "stepName": "transfer", @@ -2546,7 +2550,7 @@ "commandSchemaId": "opentronsCommandSchemaV8", "commands": [ { - "key": "ee3dbe0a-f7b1-4995-8449-dea339f61737", + "key": "b7185c84-9b15-4b6e-a315-e331249569fa", "commandType": "loadPipette", "params": { "pipetteName": "p300_single_gen2", @@ -2555,7 +2559,7 @@ } }, { - "key": "248415e4-9ae5-4741-9799-9184775c2d31", + "key": "0d1f6599-70d5-4e99-9608-7d249135b5a9", "commandType": "loadModule", "params": { "model": "magneticModuleV2", @@ -2564,7 +2568,7 @@ } }, { - "key": "94f5969a-7e98-47bc-aa0b-eea46b0271a8", + "key": "2ee81ffe-c8fa-4cac-be56-62a902e301f7", "commandType": "loadModule", "params": { "model": "temperatureModuleV2", @@ -2573,7 +2577,7 @@ } }, { - "key": "2ee5efc8-5c75-4cc6-8bea-0f258478f0af", + "key": "e1da2e62-ac25-405f-b896-99384ab081d8", "commandType": "loadLabware", "params": { "displayName": "Opentrons 96 Tip Rack 300 µL", @@ -2585,7 +2589,7 @@ } }, { - "key": "352f2e8e-87e1-4658-a86e-153e5307f35c", + "key": "2895d8a7-239c-4d6b-afc8-69defe261790", "commandType": "loadLabware", "params": { "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", @@ -2599,7 +2603,7 @@ } }, { - "key": "95ee1321-124a-4e78-8b9a-517455c40ab0", + "key": "46b84345-0c06-41f8-860d-1dfafa424e80", "commandType": "loadLabware", "params": { "displayName": "Opentrons 24 Well Aluminum Block with Generic 2 mL Screwcap", @@ -2614,7 +2618,7 @@ }, { "commandType": "loadLiquid", - "key": "44de4f93-8550-465d-b26b-6a2f95d411c1", + "key": "25dd8768-7731-4dee-9f5a-d54b9eb0983c", "params": { "liquidId": "0", "labwareId": "1e610d40-75c7-11ea-b42f-4b64e50f43e5:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1", @@ -2640,7 +2644,7 @@ }, { "commandType": "magneticModule/engage", - "key": "eb54de80-449c-4287-ae26-5fe7cae3fa3a", + "key": "3471fe25-a3a8-4be0-b6d8-545819c4aea0", "params": { "moduleId": "0b419310-75c7-11ea-b42f-4b64e50f43e5:magneticModuleType", "height": 6 @@ -2648,7 +2652,7 @@ }, { "commandType": "temperatureModule/setTargetTemperature", - "key": "a0123190-8242-4c09-bb02-6f78d8c5e493", + "key": "610ae127-200b-48ae-8cbc-7ba4b5ca7b30", "params": { "moduleId": "0b4319b0-75c7-11ea-b42f-4b64e50f43e5:temperatureModuleType", "celsius": 25 @@ -2656,12 +2660,12 @@ }, { "commandType": "waitForDuration", - "key": "6eb18da1-b4ae-4adc-8384-a06b4c21d898", + "key": "94aa4488-7792-49bc-ac3d-6a260bad0f86", "params": { "seconds": 62, "message": "" } }, { "commandType": "pickUpTip", - "key": "ff0fb666-871c-43b8-87d9-9c71fdc0efc9", + "key": "1a838ef5-ea1a-4680-bac0-6eaf473465a4", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "labwareId": "0b44c760-75c7-11ea-b42f-4b64e50f43e5:opentrons/opentrons_96_tiprack_300ul/1", @@ -2670,31 +2674,37 @@ }, { "commandType": "aspirate", - "key": "398bbf30-90e7-4e50-b630-fb02ddd00160", + "key": "f74c2687-f02c-4034-aa03-9a73c1ee47af", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 30, "labwareId": "1e610d40-75c7-11ea-b42f-4b64e50f43e5:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 46.43 } }, { "commandType": "dispense", - "key": "0b0ff1c4-0167-4980-b710-794df0799956", + "key": "507c7fff-1193-4c14-a0b1-e4bb9fe9d96e", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 30, "labwareId": "21ed8f60-75c7-11ea-b42f-4b64e50f43e5:opentrons/opentrons_24_aluminumblock_generic_2ml_screwcap/1", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 0.5, "x": 0, "y": 0 } + }, "flowRate": 46.43 } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "7c8d4e34-5282-4ee8-bcae-36604b949bde", + "key": "5a050ced-d1a9-4031-bf16-ed49cb561e60", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "addressableAreaName": "fixedTrash", @@ -2704,12 +2714,12 @@ }, { "commandType": "dropTipInPlace", - "key": "7ba94010-e87e-448b-8535-70ad404a5f19", + "key": "8083dcbe-8c00-4178-90c0-4d4a921bca9c", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5" } }, { "commandType": "pickUpTip", - "key": "ceab71fc-ea60-4cbe-8302-7e38a8d27847", + "key": "e6db98b2-7239-4f6b-9e41-02e1dd108ad6", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "labwareId": "0b44c760-75c7-11ea-b42f-4b64e50f43e5:opentrons/opentrons_96_tiprack_300ul/1", @@ -2718,31 +2728,37 @@ }, { "commandType": "aspirate", - "key": "eda46364-da03-4582-9998-dd91945f08fc", + "key": "47cf3011-68e2-40cd-8563-145e460f93aa", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 30, "labwareId": "1e610d40-75c7-11ea-b42f-4b64e50f43e5:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/1", "wellName": "B1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 46.43 } }, { "commandType": "dispense", - "key": "42d98996-7605-4d70-b3be-e6a802022a32", + "key": "1f1d966a-9095-4857-9137-36131c91bfd2", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "volume": 30, "labwareId": "21ed8f60-75c7-11ea-b42f-4b64e50f43e5:opentrons/opentrons_24_aluminumblock_generic_2ml_screwcap/1", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 0.5, "x": 0, "y": 0 } + }, "flowRate": 46.43 } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "97c7e6ee-b6c5-4708-bc85-e5cba1c93a1b", + "key": "ac6074f6-2f28-4012-914b-d3b28eb8453d", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5", "addressableAreaName": "fixedTrash", @@ -2752,12 +2768,12 @@ }, { "commandType": "dropTipInPlace", - "key": "11b30838-4205-4141-9d81-7e2bbde8c7aa", + "key": "074050d3-0c4c-4fc0-8036-a5dc9afe99ef", "params": { "pipetteId": "0b3f2210-75c7-11ea-b42f-4b64e50f43e5" } }, { "commandType": "temperatureModule/waitForTemperature", - "key": "3748a664-b9d8-49fa-9f6b-3ad35eec5c2b", + "key": "89672a34-bd2f-4e2a-bacc-407bb5f563a1", "params": { "moduleId": "0b4319b0-75c7-11ea-b42f-4b64e50f43e5:temperatureModuleType", "celsius": 25 @@ -2765,19 +2781,19 @@ }, { "commandType": "magneticModule/disengage", - "key": "a1c763ef-3712-495f-998b-651566f3e759", + "key": "26603c88-f0a7-49b3-a65c-37e9e23ac2ff", "params": { "moduleId": "0b419310-75c7-11ea-b42f-4b64e50f43e5:magneticModuleType" } }, { "commandType": "waitForResume", - "key": "f4c1a79c-d774-4a04-9858-2c58f77c93fd", + "key": "f0e0a8c0-01df-47d7-92e5-c3c16e962f4f", "params": { "message": "Wait until user intervention" } }, { "commandType": "temperatureModule/deactivate", - "key": "bb2a6fad-2767-45ad-bc5f-bac249004c00", + "key": "bde12c91-d991-4d57-8d7b-172706f3aa2a", "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 bddc1313927..1d78ba01433 100644 --- a/protocol-designer/fixtures/protocol/8/doItAllV7MigratedToV8.json +++ b/protocol-designer/fixtures/protocol/8/doItAllV7MigratedToV8.json @@ -6,7 +6,7 @@ "author": "", "description": "", "created": 1689346890165, - "lastModified": 1711047167434, + "lastModified": 1711742514037, "category": null, "subcategory": null, "tags": [] @@ -15,7 +15,7 @@ "name": "opentrons/protocol-designer", "version": "8.1.0", "data": { - "_internalAppBuildDate": "Fri, 01 Mar 2024 14:22:27 GMT", + "_internalAppBuildDate": "Fri, 29 Mar 2024 20:00:04 GMT", "defaultValues": { "aspirate_mmFromBottom": 1, "dispense_mmFromBottom": 0.5, @@ -194,6 +194,10 @@ "dispense_delay_mmFromBottom": null, "dropTip_location": "4824b094-5999-4549-9e6b-7098a9b30a8b:trashBin", "nozzles": null, + "dispense_x_position": 0, + "dispense_y_position": 0, + "aspirate_x_position": 0, + "aspirate_y_position": 0, "id": "f9a294f1-f42b-4cae-893a-592405349d56", "stepType": "moveLiquid", "stepName": "transfer", @@ -222,6 +226,8 @@ "dropTip_location": "4824b094-5999-4549-9e6b-7098a9b30a8b:trashBin", "nozzles": null, "tipRack": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", + "mix_x_position": 0, + "mix_y_position": 0, "id": "5fdb9a12-fab4-42fd-886f-40af107b15d6", "stepType": "mix", "stepName": "mix", @@ -3753,7 +3759,7 @@ "commandSchemaId": "opentronsCommandSchemaV8", "commands": [ { - "key": "6e489e69-6adb-4874-ad9f-4da035825829", + "key": "17a2f6e6-dc06-4c3a-8e97-52728d96dbd5", "commandType": "loadPipette", "params": { "pipetteName": "p1000_single_flex", @@ -3762,7 +3768,7 @@ } }, { - "key": "7536b20c-1416-4e5a-9e0a-2ac13f805fcd", + "key": "23762a87-4d05-4ce1-adaf-b2e7288bfef9", "commandType": "loadPipette", "params": { "pipetteName": "p50_multi_flex", @@ -3771,7 +3777,7 @@ } }, { - "key": "67136a9e-c10f-40ce-80de-920e33d78d44", + "key": "74ed5557-4813-4892-a2e3-4f7710b70d1c", "commandType": "loadModule", "params": { "model": "magneticBlockV1", @@ -3780,7 +3786,7 @@ } }, { - "key": "469e8246-7e19-4654-acdd-7c29a79ce67b", + "key": "00beb9a8-59c7-4c99-b386-0f4214d61350", "commandType": "loadModule", "params": { "model": "heaterShakerModuleV1", @@ -3789,7 +3795,7 @@ } }, { - "key": "29533de7-bd35-458c-9f60-6b9be67bd64b", + "key": "347f3697-2728-4c24-9067-8e9b7d9bd1d6", "commandType": "loadModule", "params": { "model": "temperatureModuleV2", @@ -3798,7 +3804,7 @@ } }, { - "key": "85e3ebf2-4d2f-49e2-8335-cf8c69d58372", + "key": "89c6d0b5-71ed-4bf9-9d94-15375788b86a", "commandType": "loadModule", "params": { "model": "thermocyclerModuleV2", @@ -3807,7 +3813,7 @@ } }, { - "key": "d05c0cc2-d6c2-4fd3-9918-33f7d07bd2fd", + "key": "07ba1a3a-9161-47ee-bf63-501e847bc84d", "commandType": "loadLabware", "params": { "displayName": "Opentrons 96 Flat Bottom Heater-Shaker Adapter", @@ -3821,7 +3827,7 @@ } }, { - "key": "7b515b7c-9d35-4d4e-a19c-1a73de8fdc65", + "key": "c9aafdba-c777-4609-b99f-87405a76a7ec", "commandType": "loadLabware", "params": { "displayName": "Opentrons Flex 96 Filter Tip Rack 50 µL", @@ -3833,7 +3839,7 @@ } }, { - "key": "583e9796-64e7-411e-b3e4-ce3c5f18a39a", + "key": "008af3b3-4557-4755-af65-4e263bcd4d52", "commandType": "loadLabware", "params": { "displayName": "NEST 96 Well Plate 100 µL PCR Full Skirt", @@ -3847,7 +3853,7 @@ } }, { - "key": "bb089d2b-b8f8-4306-b0b8-e5d38d81aba6", + "key": "df64c3d8-c74b-468e-b663-f88c59ed927c", "commandType": "loadLabware", "params": { "displayName": "Opentrons 24 Well Aluminum Block with NEST 1.5 mL Snapcap", @@ -3861,7 +3867,7 @@ } }, { - "key": "aa80f4db-d94f-407c-9ea1-6df86119d200", + "key": "23249708-2910-493b-aa56-a05e687f13ee", "commandType": "loadLabware", "params": { "displayName": "NEST 96 Well Plate 200 µL Flat", @@ -3876,7 +3882,7 @@ }, { "commandType": "loadLiquid", - "key": "52dfe64f-29b5-4d3e-838d-aecf6c0df8e0", + "key": "46b4c996-8800-432b-824a-9f9fb2ae033e", "params": { "liquidId": "1", "labwareId": "a793a135-06aa-4ed6-a1d3-c176c7810afa:opentrons/opentrons_24_aluminumblock_nest_1.5ml_snapcap/1", @@ -3885,7 +3891,7 @@ }, { "commandType": "loadLiquid", - "key": "68e4b018-1e5b-48d4-b858-93b3154e63a5", + "key": "b8e21e25-5da0-426b-a1da-8d87751e48cc", "params": { "liquidId": "0", "labwareId": "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", @@ -3903,7 +3909,7 @@ }, { "commandType": "temperatureModule/setTargetTemperature", - "key": "18dcba87-324d-4483-a9be-e561c9b47bf0", + "key": "0b60938b-1bd4-4ffb-89f6-dac42a87ac0e", "params": { "moduleId": "ef44ad7f-0fd9-46d6-8bc0-c70785644cc8:temperatureModuleType", "celsius": 4 @@ -3911,7 +3917,7 @@ }, { "commandType": "heaterShaker/waitForTemperature", - "key": "84ae2f28-38f6-4314-9d34-3ff9af5a875c", + "key": "7d5fd109-43cd-4dea-b0fb-2efa3f727e38", "params": { "moduleId": "c19dffa3-cb34-4702-bcf6-dcea786257d1:heaterShakerModuleType", "celsius": 4 @@ -3919,14 +3925,14 @@ }, { "commandType": "thermocycler/closeLid", - "key": "0ec55f7b-4f82-46ad-a450-aac71d8ca198", + "key": "31bb9bbe-9c53-407a-ac73-e789b800466d", "params": { "moduleId": "627b7a27-5bb7-46de-a530-67af45652e3b:thermocyclerModuleType" } }, { "commandType": "thermocycler/setTargetLidTemperature", - "key": "883d4fba-7b4c-410d-aeff-79ce4c3d106e", + "key": "0d83be22-5cec-4603-b42c-03ffb6e6d8ba", "params": { "moduleId": "627b7a27-5bb7-46de-a530-67af45652e3b:thermocyclerModuleType", "celsius": 40 @@ -3934,14 +3940,14 @@ }, { "commandType": "thermocycler/waitForLidTemperature", - "key": "8da2d0c4-c9b2-4acb-8230-6b68f33b92b7", + "key": "1ac36b4e-b0df-4d43-9cfc-a10cc64ccda3", "params": { "moduleId": "627b7a27-5bb7-46de-a530-67af45652e3b:thermocyclerModuleType" } }, { "commandType": "thermocycler/runProfile", - "key": "6df23192-439c-429c-89ab-c932751096f0", + "key": "0917c6de-9fd8-4afa-b496-f62ae18fa290", "params": { "moduleId": "627b7a27-5bb7-46de-a530-67af45652e3b:thermocyclerModuleType", "profile": [ @@ -3953,28 +3959,28 @@ }, { "commandType": "thermocycler/deactivateBlock", - "key": "c99151db-add8-41e4-9e5b-0516198f06b4", + "key": "4e5e9302-fac9-438d-83c9-fabd4c65791f", "params": { "moduleId": "627b7a27-5bb7-46de-a530-67af45652e3b:thermocyclerModuleType" } }, { "commandType": "thermocycler/deactivateLid", - "key": "2cf60177-6b03-4706-a2fb-7a211eb974e1", + "key": "a0fe06fa-e4cc-4de2-97a9-388a3df08111", "params": { "moduleId": "627b7a27-5bb7-46de-a530-67af45652e3b:thermocyclerModuleType" } }, { "commandType": "thermocycler/openLid", - "key": "968e4a04-1cda-4730-a26d-810c0af827ad", + "key": "8706cf32-b7c8-41ee-901a-6e62ef7b6824", "params": { "moduleId": "627b7a27-5bb7-46de-a530-67af45652e3b:thermocyclerModuleType" } }, { "commandType": "pickUpTip", - "key": "39f9b118-55f7-4b32-b28a-689255ecf69a", + "key": "90d3558e-e3ef-4e11-8e18-9e1312b212b0", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -3983,31 +3989,37 @@ }, { "commandType": "aspirate", - "key": "cbd4de4c-8de3-407e-aace-9d0993c48214", + "key": "c7ac4218-4698-48f4-b00d-8eeb1ffddb3a", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "a793a135-06aa-4ed6-a1d3-c176c7810afa:opentrons/opentrons_24_aluminumblock_nest_1.5ml_snapcap/1", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 6 } }, { "commandType": "dispense", - "key": "df9dcd8b-54a2-4ea3-9014-8d1e5a8769c7", + "key": "604c9a1d-1ada-4159-850f-3bc9e4f802bc", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 0.5, "x": 0, "y": 0 } + }, "flowRate": 6 } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "41586872-d7ba-47a4-b545-aca0f924e1e5", + "key": "c120780c-b4f4-4b11-a7f6-ab3b2621106f", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", @@ -4017,12 +4029,12 @@ }, { "commandType": "dropTipInPlace", - "key": "1a253e2c-f44c-414b-929e-fb071233caa5", + "key": "2b9bb184-749e-4652-a2cb-31e427ae0472", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } }, { "commandType": "pickUpTip", - "key": "903f0cbd-36fc-46ad-9629-af0e713a2551", + "key": "24425f50-40ff-453a-9c3e-ba35f07a4b93", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4031,31 +4043,37 @@ }, { "commandType": "aspirate", - "key": "15e1819f-a75f-4a99-b248-ef9c44f742bb", + "key": "3eacc9b8-99bf-448b-b178-1638c2217d4f", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "a793a135-06aa-4ed6-a1d3-c176c7810afa:opentrons/opentrons_24_aluminumblock_nest_1.5ml_snapcap/1", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 6 } }, { "commandType": "dispense", - "key": "1746f838-436c-4524-99ca-79a89807e7c6", + "key": "b2f71d3b-13b3-4ba5-9672-3a5ae85b402e", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 0.5, "x": 0, "y": 0 } + }, "flowRate": 6 } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "139ac8eb-77bc-4dd5-8358-5cd3352b2841", + "key": "982eb315-0f07-4db4-804d-3650a7ef3371", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", @@ -4065,12 +4083,12 @@ }, { "commandType": "dropTipInPlace", - "key": "7d3f53de-e3e9-4cce-aca3-a1c84ec8e4f5", + "key": "fd1e4fcb-3f57-4e0e-9a07-f5710d713b2b", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } }, { "commandType": "pickUpTip", - "key": "519b1444-568a-49af-87cc-d251a28d5c74", + "key": "d1aa96b8-8218-497f-92d1-9d145d65cacd", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4079,31 +4097,37 @@ }, { "commandType": "aspirate", - "key": "eef96aa3-ed34-4a6c-a121-9bb1556016aa", + "key": "49b8562e-7d04-409e-b96e-60c04d82f890", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "a793a135-06aa-4ed6-a1d3-c176c7810afa:opentrons/opentrons_24_aluminumblock_nest_1.5ml_snapcap/1", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 6 } }, { "commandType": "dispense", - "key": "ee44942b-3da5-43c1-ad0b-17fc2ea46b68", + "key": "16da2628-d7fa-45e9-9911-cb06a61e488e", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", "wellName": "B1", - "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 0.5, "x": 0, "y": 0 } + }, "flowRate": 6 } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "1cad272e-a562-4abe-975a-209d5b29f6b8", + "key": "a7a1c2f8-6fdf-4322-a216-ca06fe064299", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", @@ -4113,12 +4137,12 @@ }, { "commandType": "dropTipInPlace", - "key": "b25eeb63-22a3-4a45-9a34-2588f6e28034", + "key": "dcfb2a3c-fec6-467e-8ea4-0655e070857c", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } }, { "commandType": "pickUpTip", - "key": "3b4257ba-7e37-4dc7-8630-628695a993b0", + "key": "c54b1b14-a78e-4b3b-a7fd-df600c143996", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4127,31 +4151,37 @@ }, { "commandType": "aspirate", - "key": "9ee178b8-6918-477a-ac4a-3b94b3257ded", + "key": "1f586aaa-a2c3-4f35-98d4-514f30f8afde", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "a793a135-06aa-4ed6-a1d3-c176c7810afa:opentrons/opentrons_24_aluminumblock_nest_1.5ml_snapcap/1", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 6 } }, { "commandType": "dispense", - "key": "5b1fa15c-d50a-465e-99d6-d3c5631ba18b", + "key": "8491a928-c8ae-4b73-8fd3-43e6e520ea7d", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", "wellName": "B1", - "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 0.5, "x": 0, "y": 0 } + }, "flowRate": 6 } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "8ca34094-5af4-4c19-bbc9-e6a95ebe7dc7", + "key": "3ddc68fb-3f9e-4395-b234-a8f00b35cf97", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", @@ -4161,12 +4191,12 @@ }, { "commandType": "dropTipInPlace", - "key": "ed570c7c-bec9-4320-92c6-c5dc4e8ea039", + "key": "c1596fb8-587a-4a9c-9dd0-252dd821085c", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } }, { "commandType": "pickUpTip", - "key": "24af8dc9-1d39-4ead-9fb7-c106cf81c4ca", + "key": "9e130b45-4d49-4588-adef-2e4055be2e09", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4175,31 +4205,37 @@ }, { "commandType": "aspirate", - "key": "3fb7136f-156c-4ef2-ba9c-4010cbee7c45", + "key": "7e014576-f260-4b18-aad5-f45423adb35f", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "a793a135-06aa-4ed6-a1d3-c176c7810afa:opentrons/opentrons_24_aluminumblock_nest_1.5ml_snapcap/1", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 6 } }, { "commandType": "dispense", - "key": "70415053-47db-400e-a765-59930e782fba", + "key": "07e28184-9669-432a-9b68-8dd692680fa5", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", "wellName": "C1", - "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 0.5, "x": 0, "y": 0 } + }, "flowRate": 6 } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "6bc262a7-6619-4c1d-90ab-694881833ef2", + "key": "4f591d38-4cc1-496b-90dc-fdcff81d3155", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", @@ -4209,12 +4245,12 @@ }, { "commandType": "dropTipInPlace", - "key": "61c26a5d-05d6-490b-9881-2505f334e148", + "key": "fab6cdf0-a1c5-4643-9d0c-4fce01d88c7f", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } }, { "commandType": "pickUpTip", - "key": "e7db6545-1f4f-40bd-a440-08afc48c8a6d", + "key": "7407659a-a612-4209-967b-af9750324a07", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4223,31 +4259,37 @@ }, { "commandType": "aspirate", - "key": "a6a1af44-5a04-4fdf-aecb-afec57d49809", + "key": "3d307bba-026c-4a9a-8d01-ae93e8cdce1f", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "a793a135-06aa-4ed6-a1d3-c176c7810afa:opentrons/opentrons_24_aluminumblock_nest_1.5ml_snapcap/1", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 6 } }, { "commandType": "dispense", - "key": "fa36f3c3-8a96-4643-adc3-1c856446c432", + "key": "f45088fb-f102-4edf-ad26-5d1d0ac4f215", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", "wellName": "C1", - "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 0.5, "x": 0, "y": 0 } + }, "flowRate": 6 } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "a3b84d03-7b16-4c8b-ab04-5e80d53c5008", + "key": "3b44aeec-fd56-4fcf-badf-5cdc42ed42c7", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", @@ -4257,12 +4299,12 @@ }, { "commandType": "dropTipInPlace", - "key": "b3b763fc-d538-4b1c-9a72-8a1c85238e55", + "key": "7a58db8b-f053-46b5-bd89-3a7cba9c1af1", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } }, { "commandType": "pickUpTip", - "key": "aeb3764a-c819-4151-acb9-77d07399b13d", + "key": "6449dbc6-430e-468c-863d-3233689c8a63", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4271,31 +4313,37 @@ }, { "commandType": "aspirate", - "key": "9b15d50e-e1a3-4966-8584-5e32da3afa4c", + "key": "fe2b869a-8d1f-47bf-9688-2deae97b30f9", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "a793a135-06aa-4ed6-a1d3-c176c7810afa:opentrons/opentrons_24_aluminumblock_nest_1.5ml_snapcap/1", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 6 } }, { "commandType": "dispense", - "key": "ada5949a-0085-4f09-b65e-db092a2ddab6", + "key": "e9a20fb6-f0ba-4e25-b1e5-67dbef00f2d0", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", "wellName": "D1", - "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 0.5, "x": 0, "y": 0 } + }, "flowRate": 6 } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "fbfd8391-eb1e-416f-97b0-4ea4e631b8b5", + "key": "c0c7ae2d-6b13-4ce7-b170-5a2ffb3cc066", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", @@ -4305,12 +4353,12 @@ }, { "commandType": "dropTipInPlace", - "key": "edc2c62c-4f1e-4b9d-958c-1f9d4594759b", + "key": "eea51b62-8fd2-4c34-8929-48e26c670640", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } }, { "commandType": "pickUpTip", - "key": "e9f79e00-bc1f-4f92-9299-401a7d85d78b", + "key": "0a59af4d-5196-4c16-b609-98c565c320da", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4319,31 +4367,37 @@ }, { "commandType": "aspirate", - "key": "f361f6e5-a558-48dd-b808-383d48305944", + "key": "cc1387fe-4e22-407f-b1f6-8e57153d24d1", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "a793a135-06aa-4ed6-a1d3-c176c7810afa:opentrons/opentrons_24_aluminumblock_nest_1.5ml_snapcap/1", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 6 } }, { "commandType": "dispense", - "key": "ad9f20e5-c018-4241-8ee4-0b94bd4b4b13", + "key": "fdbb2c46-7e42-4dc9-95dd-528397fe2a49", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", "wellName": "D1", - "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 0.5, "x": 0, "y": 0 } + }, "flowRate": 6 } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "c41c44f9-7969-4b9d-966f-7133927d1746", + "key": "f8000789-3db0-4edc-adaa-234a89c0a2e8", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", @@ -4353,12 +4407,12 @@ }, { "commandType": "dropTipInPlace", - "key": "e2deb31d-b531-46a0-95b9-894c6143b51e", + "key": "4a6423a4-3fb3-41cb-a2bb-769f882da188", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } }, { "commandType": "pickUpTip", - "key": "ad15920f-80f3-4b31-8c69-7a9753760ac5", + "key": "58db6a04-8af4-4580-8b3b-71d27448d36c", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4367,31 +4421,37 @@ }, { "commandType": "aspirate", - "key": "ee11c611-bd0f-4039-b631-738aceae4b8b", + "key": "6c053630-6298-4bae-8b1b-b7c0fd60cd64", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "a793a135-06aa-4ed6-a1d3-c176c7810afa:opentrons/opentrons_24_aluminumblock_nest_1.5ml_snapcap/1", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 6 } }, { "commandType": "dispense", - "key": "dace1ad5-22a3-4731-8a0e-54378e936e41", + "key": "60bddd52-347b-4e97-af4f-227172c9e383", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", "wellName": "E1", - "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 0.5, "x": 0, "y": 0 } + }, "flowRate": 6 } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "c0075e01-b1d6-41fc-a482-541eba3dd9ce", + "key": "dcc5e7a5-ce62-40b0-94a8-19ccd9ec7783", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", @@ -4401,12 +4461,12 @@ }, { "commandType": "dropTipInPlace", - "key": "287153c4-baee-46c6-81e0-db0cd90a8d7b", + "key": "2d0d4405-02e0-44d3-9aa9-093b2bcf8693", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } }, { "commandType": "pickUpTip", - "key": "e956cb88-1387-4014-aea0-06237c9ea125", + "key": "8f943b62-e5cc-423b-962d-c9f06a3c39e6", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4415,31 +4475,37 @@ }, { "commandType": "aspirate", - "key": "3d870b55-af49-42b0-b877-7a3777fea82d", + "key": "d38287f1-db91-4479-a811-6190c472a797", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "a793a135-06aa-4ed6-a1d3-c176c7810afa:opentrons/opentrons_24_aluminumblock_nest_1.5ml_snapcap/1", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 6 } }, { "commandType": "dispense", - "key": "8d06248a-65a5-4372-a666-70ec956df1d4", + "key": "10074111-ee60-4602-8749-326cc7c978ef", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", "wellName": "E1", - "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 0.5, "x": 0, "y": 0 } + }, "flowRate": 6 } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "3304feb9-69e8-4e70-a3b6-308706f06d0c", + "key": "f0b5078d-30e7-4ae8-bd9c-2380a2acc248", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", @@ -4449,12 +4515,12 @@ }, { "commandType": "dropTipInPlace", - "key": "2f73eac1-8a7a-4bb2-b634-3c938bb6a541", + "key": "babbd4a6-95d0-46ef-9616-15435bf83e0c", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } }, { "commandType": "pickUpTip", - "key": "b08587bf-ac3a-4322-baa4-2d54ab4c74d8", + "key": "44873109-2a10-4925-a393-b3f05ac65cc8", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4463,31 +4529,37 @@ }, { "commandType": "aspirate", - "key": "627b7b39-4646-42e5-8a6b-ab85c073631a", + "key": "956b196e-e6a0-4e04-9fe4-e54e8f366cd3", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "a793a135-06aa-4ed6-a1d3-c176c7810afa:opentrons/opentrons_24_aluminumblock_nest_1.5ml_snapcap/1", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 6 } }, { "commandType": "dispense", - "key": "f96068bb-8730-46d2-9649-e77060a67d96", + "key": "d9fe1d4f-558e-48e9-9c4f-3349a513da68", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", "wellName": "F1", - "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 0.5, "x": 0, "y": 0 } + }, "flowRate": 6 } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "717da31c-723f-4761-8a9e-c46e3a0d95d9", + "key": "3410b8d0-d4be-4009-be92-13d7165fa45d", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", @@ -4497,12 +4569,12 @@ }, { "commandType": "dropTipInPlace", - "key": "9b69289d-3b6c-4caa-ab71-eee65591d5d7", + "key": "b610b324-aa96-44ed-95d0-fa7b6b2771f7", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } }, { "commandType": "pickUpTip", - "key": "61f66087-286a-4309-8f56-e95e1d3450db", + "key": "37fe97fb-40d5-449a-ab57-995eb34db25b", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4511,31 +4583,37 @@ }, { "commandType": "aspirate", - "key": "fcd20bdc-8cd3-4dc4-88ff-572317dfeafa", + "key": "f8fe5dca-1294-4f9a-8b05-7b818317070a", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "a793a135-06aa-4ed6-a1d3-c176c7810afa:opentrons/opentrons_24_aluminumblock_nest_1.5ml_snapcap/1", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 6 } }, { "commandType": "dispense", - "key": "cc4e76bc-f89a-45e5-8200-1bfd3ba3c950", + "key": "9ae4ac38-6188-4e0a-82b1-c8682052eab7", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", "wellName": "F1", - "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 0.5, "x": 0, "y": 0 } + }, "flowRate": 6 } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "f98a9dd9-6368-45ad-bf34-374ebd304017", + "key": "5a3d6103-e920-419f-8541-6f42aead55b4", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", @@ -4545,12 +4623,12 @@ }, { "commandType": "dropTipInPlace", - "key": "28f596a5-d900-4335-82d1-c69c2a4f3476", + "key": "ae7fa272-1052-4b9b-9141-832de7f191ae", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } }, { "commandType": "pickUpTip", - "key": "cf3e0222-4b78-4c11-8f7c-853edb173ef0", + "key": "001e1eff-7e3a-4762-889b-81bbdd95624e", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4559,31 +4637,37 @@ }, { "commandType": "aspirate", - "key": "87bf3bc3-d986-4d4e-9303-531db931ecf2", + "key": "4c857bd6-9ee5-4abc-b8f1-93f263421d4f", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "a793a135-06aa-4ed6-a1d3-c176c7810afa:opentrons/opentrons_24_aluminumblock_nest_1.5ml_snapcap/1", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 6 } }, { "commandType": "dispense", - "key": "7d4a2f34-efc4-4c69-ac95-12e90da24846", + "key": "d54ee4e1-019a-4043-a9d6-73f2728ade40", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", "wellName": "G1", - "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 0.5, "x": 0, "y": 0 } + }, "flowRate": 6 } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "c26ac9f4-f86a-410b-9524-3a107df76154", + "key": "b3d1a836-8198-4543-9c69-5af4340f5e7b", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", @@ -4593,12 +4677,12 @@ }, { "commandType": "dropTipInPlace", - "key": "cc9ad177-40b1-4063-904f-bdcd5f534ba3", + "key": "d09a4c10-5d65-46b2-aa72-04ebd1e69616", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } }, { "commandType": "pickUpTip", - "key": "6f27f601-b3a2-4d72-b1c7-d29fbef1e2fb", + "key": "a18317f2-d1e8-4960-8294-d041900be78c", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4607,31 +4691,37 @@ }, { "commandType": "aspirate", - "key": "0d614bd3-9723-467a-a8f4-6793875071a6", + "key": "7b5f0098-2f53-4e57-b60a-46c06f4fe167", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "a793a135-06aa-4ed6-a1d3-c176c7810afa:opentrons/opentrons_24_aluminumblock_nest_1.5ml_snapcap/1", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 6 } }, { "commandType": "dispense", - "key": "321bc387-8de7-4456-99d2-f61e31f49ac4", + "key": "e6497c4f-50da-481e-b76d-a6787df6a779", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", "wellName": "G1", - "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 0.5, "x": 0, "y": 0 } + }, "flowRate": 6 } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "23c76ed2-6751-4f8d-b061-02e54bae4b92", + "key": "7c357bd8-9b73-43d0-a143-57d9b24d651f", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", @@ -4641,12 +4731,12 @@ }, { "commandType": "dropTipInPlace", - "key": "a33f1f9c-c1eb-42c5-b2d2-dc81d0c92207", + "key": "5ea9d3e3-5c64-4610-bbfc-b71d7e4d3282", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } }, { "commandType": "pickUpTip", - "key": "fa8827df-09aa-41df-b2af-794dafab3f36", + "key": "17f52737-8fa4-45df-95e1-e95011c308fd", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4655,31 +4745,37 @@ }, { "commandType": "aspirate", - "key": "222b1e4d-81fb-44c5-beff-d39ae967766c", + "key": "43f318b4-d316-462b-9d38-d4969cac5494", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "a793a135-06aa-4ed6-a1d3-c176c7810afa:opentrons/opentrons_24_aluminumblock_nest_1.5ml_snapcap/1", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 6 } }, { "commandType": "dispense", - "key": "d6644b59-fd5b-44cf-a5b4-da4bec2ffcd1", + "key": "ed84c3b2-b095-49bc-939b-fd1f5faa6ddd", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", "wellName": "H1", - "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 0.5, "x": 0, "y": 0 } + }, "flowRate": 6 } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "62a05dff-fd3d-47ec-a852-7ec365fdc60a", + "key": "bdde31de-c35d-403a-bc01-d249c21100dd", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", @@ -4689,12 +4785,12 @@ }, { "commandType": "dropTipInPlace", - "key": "dcbbb300-64a6-4deb-9733-19b86574106a", + "key": "2d5caff3-718e-4835-90c1-3a0d2ec57a20", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } }, { "commandType": "pickUpTip", - "key": "882ee6ef-f2a3-4478-b88a-fd650c11cbc9", + "key": "a9e33581-f053-47cb-9bc4-069dca4fbc1c", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4703,31 +4799,37 @@ }, { "commandType": "aspirate", - "key": "4745b4e5-0fed-427b-961a-c1e346e5f591", + "key": "5b34a48a-fdf2-4ad1-8c14-3da9ffb680ed", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "a793a135-06aa-4ed6-a1d3-c176c7810afa:opentrons/opentrons_24_aluminumblock_nest_1.5ml_snapcap/1", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 6 } }, { "commandType": "dispense", - "key": "916ce3bf-32a1-45e1-b704-32b75db4e572", + "key": "13cfa89d-7337-4358-86d2-0da34380835d", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "volume": 50, "labwareId": "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", "wellName": "H1", - "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 0.5, "x": 0, "y": 0 } + }, "flowRate": 6 } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "62fc2bbb-ee9f-4769-9c6d-7eae1d56b7f3", + "key": "ec94b555-dba0-4757-be27-7b8634c55a9a", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe", "addressableAreaName": "movableTrashA3", @@ -4737,12 +4839,12 @@ }, { "commandType": "dropTipInPlace", - "key": "459eed51-26e1-4f67-946c-5f281d9ff5c4", + "key": "efba76a3-5a32-4f02-9dfc-2f1e5ff3e9b6", "params": { "pipetteId": "2e7c6344-58ab-465c-b542-489883cb63fe" } }, { "commandType": "pickUpTip", - "key": "a11d26ea-07d0-4fbe-95a8-3229bf3a7974", + "key": "844f8618-5db6-48ba-b0af-ffc12e84eea7", "params": { "pipetteId": "6d1e53c3-2db3-451b-ad60-3fe13781a193", "labwareId": "23ed35de-5bfd-4bb0-8f54-da99a2804ed9:opentrons/opentrons_flex_96_filtertiprack_50ul/1", @@ -4751,7 +4853,7 @@ }, { "commandType": "configureForVolume", - "key": "8355523c-68f9-4d67-b7f0-c19b39a20d58", + "key": "5d899711-013e-460b-845b-9a8ef207dc24", "params": { "pipetteId": "6d1e53c3-2db3-451b-ad60-3fe13781a193", "volume": 10 @@ -4759,55 +4861,67 @@ }, { "commandType": "aspirate", - "key": "cb6f6fd9-ce96-4788-930a-bcb4fc73cab8", + "key": "71923e56-ac8f-486c-9509-c809a994e006", "params": { "pipetteId": "6d1e53c3-2db3-451b-ad60-3fe13781a193", "volume": 10, "labwareId": "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 0.5, "x": 0, "y": 0 } + }, "flowRate": 8 } }, { "commandType": "dispense", - "key": "d72adc76-8ece-47d3-86d2-5ccec5b507a4", + "key": "abde93a4-98e5-428c-9dd9-2a65dc3d99bf", "params": { "pipetteId": "6d1e53c3-2db3-451b-ad60-3fe13781a193", "volume": 10, "labwareId": "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 0.5, "x": 0, "y": 0 } + }, "flowRate": 8 } }, { "commandType": "aspirate", - "key": "aefc83b0-fcba-4010-b71a-9b79e6134779", + "key": "f9a0576f-5764-478e-bf16-03ef8ab46d3b", "params": { "pipetteId": "6d1e53c3-2db3-451b-ad60-3fe13781a193", "volume": 10, "labwareId": "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 0.5, "x": 0, "y": 0 } + }, "flowRate": 8 } }, { "commandType": "dispense", - "key": "955873e5-8fcd-43d4-9f6c-3281922fc97d", + "key": "e1e8644f-f0d0-4946-b599-55d62174b5af", "params": { "pipetteId": "6d1e53c3-2db3-451b-ad60-3fe13781a193", "volume": 10, "labwareId": "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 0.5, "x": 0, "y": 0 } + }, "flowRate": 8 } }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "a237c669-fe56-434a-a5fc-225ba5403b28", + "key": "9bb9217e-3c87-4b11-81f4-01aeb6d12bcd", "params": { "pipetteId": "6d1e53c3-2db3-451b-ad60-3fe13781a193", "addressableAreaName": "movableTrashA3", @@ -4817,12 +4931,12 @@ }, { "commandType": "dropTipInPlace", - "key": "87d1c5d5-c40e-480a-a0bf-4a8a63bae3cd", + "key": "dd0506d4-cd19-4fa3-85db-64aef25d8f75", "params": { "pipetteId": "6d1e53c3-2db3-451b-ad60-3fe13781a193" } }, { "commandType": "moveLabware", - "key": "98e741c6-01c6-43d5-8d98-e3950b7dabda", + "key": "bd579612-fa2a-4808-ade0-8e38b9d8b7da", "params": { "labwareId": "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", "strategy": "usingGripper", @@ -4831,12 +4945,12 @@ }, { "commandType": "waitForDuration", - "key": "da873c66-a7e4-4810-b2d1-ab037e9156d1", + "key": "da8a328a-2870-4259-b3be-89d3255154fb", "params": { "seconds": 60, "message": "" } }, { "commandType": "moveLabware", - "key": "58ced158-ae4d-4275-814b-cf29bacda1c0", + "key": "64ac3bcc-4ab8-4d15-9b42-d2462686153d", "params": { "labwareId": "fcba73e7-b88e-438e-963e-f8b9a5de0983:opentrons/nest_96_wellplate_100ul_pcr_full_skirt/2", "strategy": "usingGripper", @@ -4845,21 +4959,21 @@ }, { "commandType": "heaterShaker/closeLabwareLatch", - "key": "2706f0f9-5898-47e3-b53f-06df74598b4e", + "key": "cd0e65dc-cd6c-4d0f-b05f-3d8a979d7d09", "params": { "moduleId": "c19dffa3-cb34-4702-bcf6-dcea786257d1:heaterShakerModuleType" } }, { "commandType": "heaterShaker/deactivateHeater", - "key": "073eac12-998e-4075-bcb5-feb215d5f251", + "key": "c980a10c-a99c-4583-831b-8f09f89822fd", "params": { "moduleId": "c19dffa3-cb34-4702-bcf6-dcea786257d1:heaterShakerModuleType" } }, { "commandType": "heaterShaker/setAndWaitForShakeSpeed", - "key": "37fedb11-cfa0-494d-905f-e5539c2960e6", + "key": "15a3aeed-9bd0-49d6-8a6e-43f226e7acfe", "params": { "moduleId": "c19dffa3-cb34-4702-bcf6-dcea786257d1:heaterShakerModuleType", "rpm": 500 @@ -4867,28 +4981,28 @@ }, { "commandType": "heaterShaker/deactivateHeater", - "key": "6431c63c-608d-4f82-bc68-ade76b8c1cc2", + "key": "001d2bdd-b8a2-4285-8aa3-9d9318566b47", "params": { "moduleId": "c19dffa3-cb34-4702-bcf6-dcea786257d1:heaterShakerModuleType" } }, { "commandType": "heaterShaker/deactivateShaker", - "key": "a22834db-00b7-4f66-a681-9cc5dd17031e", + "key": "609e5b71-9dda-47d7-a7c4-0da3802e7e99", "params": { "moduleId": "c19dffa3-cb34-4702-bcf6-dcea786257d1:heaterShakerModuleType" } }, { "commandType": "heaterShaker/openLabwareLatch", - "key": "af548bbd-5620-405a-bda0-ac08ca06fbbd", + "key": "bb80d557-573b-4b09-a0b8-5d73ea22e4a4", "params": { "moduleId": "c19dffa3-cb34-4702-bcf6-dcea786257d1:heaterShakerModuleType" } }, { "commandType": "moveLabware", - "key": "ffb00dfa-99db-4744-9bde-538d0aa7b1a7", + "key": "a37c38e0-7abe-433f-ab9d-adf0774565f6", "params": { "labwareId": "a793a135-06aa-4ed6-a1d3-c176c7810afa:opentrons/opentrons_24_aluminumblock_nest_1.5ml_snapcap/1", "strategy": "manualMoveWithPause", @@ -4897,14 +5011,14 @@ }, { "commandType": "temperatureModule/deactivate", - "key": "8e0e035d-33a2-4995-a557-26c7951de915", + "key": "1558d15f-e4b6-48bb-8c9c-c3ff69812504", "params": { "moduleId": "ef44ad7f-0fd9-46d6-8bc0-c70785644cc8:temperatureModuleType" } }, { "commandType": "moveLabware", - "key": "36c8ae59-9d10-428a-b6fd-3e3b6b49ed09", + "key": "d805d58b-f6e7-406d-8262-5bf3d03448b6", "params": { "labwareId": "239ceac8-23ec-4900-810a-70aeef880273:opentrons/nest_96_wellplate_200ul_flat/2", "strategy": "manualMoveWithPause", diff --git a/protocol-designer/fixtures/protocol/8/doItAllV8.json b/protocol-designer/fixtures/protocol/8/doItAllV8.json index 79c866f5399..a6b1f61a737 100644 --- a/protocol-designer/fixtures/protocol/8/doItAllV8.json +++ b/protocol-designer/fixtures/protocol/8/doItAllV8.json @@ -6,7 +6,7 @@ "author": "", "description": "", "created": 1701659107408, - "lastModified": 1711047424926, + "lastModified": 1711742533084, "category": null, "subcategory": null, "tags": [] @@ -15,7 +15,7 @@ "name": "opentrons/protocol-designer", "version": "8.1.0", "data": { - "_internalAppBuildDate": "Thu, 21 Mar 2024 18:51:59 GMT", + "_internalAppBuildDate": "Fri, 29 Mar 2024 20:00:04 GMT", "defaultValues": { "aspirate_mmFromBottom": 1, "dispense_mmFromBottom": 0.5, @@ -154,6 +154,10 @@ "dispense_delay_mmFromBottom": null, "dropTip_location": "9d61f642-8f9b-467d-b2f7-b67fb162fd26:wasteChute", "nozzles": null, + "dispense_x_position": 0, + "dispense_y_position": 0, + "aspirate_x_position": 0, + "aspirate_y_position": 0, "id": "d2f74144-a7bf-4ba2-aaab-30d70b2b62c7", "stepType": "moveLiquid", "stepName": "transfer", @@ -3421,7 +3425,7 @@ "commandSchemaId": "opentronsCommandSchemaV8", "commands": [ { - "key": "1809fd39-db28-4928-8773-31bc536fe765", + "key": "f8a4cabe-7cb9-4e38-b937-6655680e2a31", "commandType": "loadPipette", "params": { "pipetteName": "p1000_single_flex", @@ -3430,7 +3434,7 @@ } }, { - "key": "3a5f75b2-15c9-404f-9b87-f102beeb1a45", + "key": "cd2e6185-8d57-4881-9b0c-ebcbd2468c55", "commandType": "loadModule", "params": { "model": "heaterShakerModuleV1", @@ -3439,7 +3443,7 @@ } }, { - "key": "a13ba2f1-e557-4d2f-a304-87847ce68887", + "key": "b2d44cd2-73db-45b3-ab22-e9e765beed75", "commandType": "loadModule", "params": { "model": "thermocyclerModuleV2", @@ -3448,7 +3452,7 @@ } }, { - "key": "e3f1abb9-b076-4b56-a593-0b4033462fea", + "key": "bbd3ee7e-35b8-4168-9df5-13b871c6dfba", "commandType": "loadLabware", "params": { "displayName": "Opentrons 96 PCR Heater-Shaker Adapter", @@ -3462,7 +3466,7 @@ } }, { - "key": "9d92792f-e5d1-4259-8e4b-da8ea83f28df", + "key": "198896f6-4d0e-49ee-b060-bc9d17fbb9bc", "commandType": "loadLabware", "params": { "displayName": "Opentrons Flex 96 Tip Rack 1000 µL", @@ -3474,7 +3478,7 @@ } }, { - "key": "d03df580-7915-4bba-9d34-e92039cfe24d", + "key": "880af66e-2905-4102-b655-0351b30252b1", "commandType": "loadLabware", "params": { "displayName": "Opentrons Tough 96 Well Plate 200 µL PCR Full Skirt", @@ -3488,7 +3492,7 @@ } }, { - "key": "d1e4cf27-a1db-48c4-b784-a21014bb234b", + "key": "478e31cc-12f4-4a30-9cd4-03181a538513", "commandType": "loadLabware", "params": { "displayName": "Axygen 1 Well Reservoir 90 mL", @@ -3501,7 +3505,7 @@ }, { "commandType": "loadLiquid", - "key": "64129bfd-92d7-4c70-9380-33785a6041ff", + "key": "56bffeaa-ee2b-4cb8-91dc-a9e21e8f1655", "params": { "liquidId": "1", "labwareId": "54370838-4fca-4a14-b88a-7840e4903649:opentrons/opentrons_96_wellplate_200ul_pcr_full_skirt/2", @@ -3519,7 +3523,7 @@ }, { "commandType": "loadLiquid", - "key": "ac47f11d-0d9c-48d7-b45b-9ecb269a9a50", + "key": "e95ef8f9-fef7-4dfe-b5db-86a5dff7e5b5", "params": { "liquidId": "0", "labwareId": "8bacda22-9e05-45e8-bef4-cc04414a204f:opentrons/axygen_1_reservoir_90ml/1", @@ -3528,14 +3532,14 @@ }, { "commandType": "thermocycler/openLid", - "key": "bfa8af0c-4cb2-49d3-912b-b07e90a1f752", + "key": "63d31323-1217-4a56-9392-c1c28dc703d7", "params": { "moduleId": "fd6da9f1-d63b-414b-929e-c646b64790e9:thermocyclerModuleType" } }, { "commandType": "moveLabware", - "key": "a991e2d5-5be6-43b1-9a71-2f229aea392f", + "key": "716ec050-c597-490d-b261-20ac8e3b4c2f", "params": { "labwareId": "8bacda22-9e05-45e8-bef4-cc04414a204f:opentrons/axygen_1_reservoir_90ml/1", "strategy": "usingGripper", @@ -3544,7 +3548,7 @@ }, { "commandType": "pickUpTip", - "key": "55826f7b-111e-4768-a6d3-d0a4c4a5e20d", + "key": "635b128e-5cdc-4bdc-9975-c04a49fb7670", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "labwareId": "f2d371ea-5146-4c89-8200-9c056a7f321a:opentrons/opentrons_flex_96_tiprack_1000ul/1", @@ -3553,31 +3557,37 @@ }, { "commandType": "aspirate", - "key": "bb5688fe-2909-4755-be74-1850d4d05735", + "key": "1a26a0e0-11c2-4940-b32d-8c747e6969a7", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, "labwareId": "8bacda22-9e05-45e8-bef4-cc04414a204f:opentrons/axygen_1_reservoir_90ml/1", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 160 } }, { "commandType": "dispense", - "key": "33f7aa0b-80e4-41f0-a841-d8aacb4c7f32", + "key": "17f82c54-3e03-46f4-9c65-666aacc5bab3", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, "labwareId": "54370838-4fca-4a14-b88a-7840e4903649:opentrons/opentrons_96_wellplate_200ul_pcr_full_skirt/2", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 0.5, "x": 0, "y": 0 } + }, "flowRate": 160 } }, { "commandType": "moveToAddressableArea", - "key": "650a3b63-379d-4327-ae55-9752d04497ab", + "key": "d38dc37e-e466-47c9-a7bc-85322487af8c", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "addressableAreaName": "1ChannelWasteChute", @@ -3586,12 +3596,12 @@ }, { "commandType": "dropTipInPlace", - "key": "40c51d0f-5a80-4355-91c1-aaaba7489f37", + "key": "69952335-9a0e-4b69-a903-00454f162e8f", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc" } }, { "commandType": "pickUpTip", - "key": "006d7584-e3ad-43a9-8fa1-0688f1d74304", + "key": "2a6d6805-bb22-42c6-9d38-321bdbd9f941", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "labwareId": "f2d371ea-5146-4c89-8200-9c056a7f321a:opentrons/opentrons_flex_96_tiprack_1000ul/1", @@ -3600,31 +3610,37 @@ }, { "commandType": "aspirate", - "key": "562c0ad9-1f97-4e74-af40-107e12019e41", + "key": "087e94b5-a8f7-4637-a830-eb99e2d3a631", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, "labwareId": "8bacda22-9e05-45e8-bef4-cc04414a204f:opentrons/axygen_1_reservoir_90ml/1", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 160 } }, { "commandType": "dispense", - "key": "cbd55dd4-a746-4bf5-bf43-73afd95ebff2", + "key": "6edf7c6f-858c-4170-9b69-9f230144ba8a", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, "labwareId": "54370838-4fca-4a14-b88a-7840e4903649:opentrons/opentrons_96_wellplate_200ul_pcr_full_skirt/2", "wellName": "B1", - "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 0.5, "x": 0, "y": 0 } + }, "flowRate": 160 } }, { "commandType": "moveToAddressableArea", - "key": "1bac0a50-7a55-4abe-905c-547f006fd62c", + "key": "129a19fb-6a84-4196-a712-7400142cfff2", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "addressableAreaName": "1ChannelWasteChute", @@ -3633,12 +3649,12 @@ }, { "commandType": "dropTipInPlace", - "key": "480d48a6-b825-406a-bc6c-b95b457a1eba", + "key": "46e0edd9-a8eb-4dc4-840d-496ce6ecb732", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc" } }, { "commandType": "pickUpTip", - "key": "aed7d916-7957-4608-8678-895cd03f2bb8", + "key": "2c31e97a-5821-4fd9-b171-d29ac18cda36", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "labwareId": "f2d371ea-5146-4c89-8200-9c056a7f321a:opentrons/opentrons_flex_96_tiprack_1000ul/1", @@ -3647,31 +3663,37 @@ }, { "commandType": "aspirate", - "key": "6c2a45d8-449f-4d46-858d-01c349ec7481", + "key": "c5d54202-b261-497f-aa71-3bbdb73f2441", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, "labwareId": "8bacda22-9e05-45e8-bef4-cc04414a204f:opentrons/axygen_1_reservoir_90ml/1", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 160 } }, { "commandType": "dispense", - "key": "2259e5af-9e35-45bc-b869-105e0d6bda3e", + "key": "df57bdd7-104c-4923-a561-002043500c74", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, "labwareId": "54370838-4fca-4a14-b88a-7840e4903649:opentrons/opentrons_96_wellplate_200ul_pcr_full_skirt/2", "wellName": "C1", - "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 0.5, "x": 0, "y": 0 } + }, "flowRate": 160 } }, { "commandType": "moveToAddressableArea", - "key": "4422ed17-8cf6-47f4-b945-352f17a81fb0", + "key": "eddd8f7b-ccd6-4919-885d-bf20bbbc675f", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "addressableAreaName": "1ChannelWasteChute", @@ -3680,12 +3702,12 @@ }, { "commandType": "dropTipInPlace", - "key": "33bf2ffd-b472-4d01-a063-e6d78cd10f6e", + "key": "2f5e18c4-1436-47f1-9010-975fe41ca901", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc" } }, { "commandType": "pickUpTip", - "key": "0b9fe44a-1d94-48ed-9d52-058fb8639425", + "key": "c4508229-340b-42af-850c-f8d4d10caeae", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "labwareId": "f2d371ea-5146-4c89-8200-9c056a7f321a:opentrons/opentrons_flex_96_tiprack_1000ul/1", @@ -3694,31 +3716,37 @@ }, { "commandType": "aspirate", - "key": "d617d4ec-ae3c-4517-acea-7ff57af655ef", + "key": "7b548807-dd81-479e-a00f-b4cd9d2080ff", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, "labwareId": "8bacda22-9e05-45e8-bef4-cc04414a204f:opentrons/axygen_1_reservoir_90ml/1", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 160 } }, { "commandType": "dispense", - "key": "99bf9993-2553-4adc-9131-be9fe370b9df", + "key": "8d8053f6-f155-416c-986c-1893f87d979f", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, "labwareId": "54370838-4fca-4a14-b88a-7840e4903649:opentrons/opentrons_96_wellplate_200ul_pcr_full_skirt/2", "wellName": "D1", - "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 0.5, "x": 0, "y": 0 } + }, "flowRate": 160 } }, { "commandType": "moveToAddressableArea", - "key": "4f05b8d1-319d-40b5-a006-31a41ad5742f", + "key": "92fa7df4-7cd5-42fd-8405-7baf417b46e3", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "addressableAreaName": "1ChannelWasteChute", @@ -3727,12 +3755,12 @@ }, { "commandType": "dropTipInPlace", - "key": "8faee0ed-2458-45d7-b09f-8021317417cd", + "key": "b2cc5f6e-dc14-4a5e-8f54-1fbcf779e850", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc" } }, { "commandType": "pickUpTip", - "key": "bf3176ac-63db-4218-8042-d5683092a66d", + "key": "149f4bc1-ecb0-49c8-bf2a-9e1dc7d241dc", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "labwareId": "f2d371ea-5146-4c89-8200-9c056a7f321a:opentrons/opentrons_flex_96_tiprack_1000ul/1", @@ -3741,31 +3769,37 @@ }, { "commandType": "aspirate", - "key": "fbea3f6f-0421-428a-bf21-6cda35b30407", + "key": "43ee041e-de88-4f88-8d40-700334aaf355", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, "labwareId": "8bacda22-9e05-45e8-bef4-cc04414a204f:opentrons/axygen_1_reservoir_90ml/1", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 160 } }, { "commandType": "dispense", - "key": "fedd8c6f-777b-4913-afd9-63c919394a5c", + "key": "779c450d-0d43-4b71-aa73-5f29ed51f5dd", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, "labwareId": "54370838-4fca-4a14-b88a-7840e4903649:opentrons/opentrons_96_wellplate_200ul_pcr_full_skirt/2", "wellName": "E1", - "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 0.5, "x": 0, "y": 0 } + }, "flowRate": 160 } }, { "commandType": "moveToAddressableArea", - "key": "a1934186-6d8b-4fdf-b17a-8f9e93f63417", + "key": "b2be4778-5e00-4bc1-8431-cdecb7ad74ad", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "addressableAreaName": "1ChannelWasteChute", @@ -3774,12 +3808,12 @@ }, { "commandType": "dropTipInPlace", - "key": "4fb7ea89-471a-47c4-8af8-0a6bfdae1d74", + "key": "4fa0e93d-1f79-4af5-9bbf-c0e41f131053", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc" } }, { "commandType": "pickUpTip", - "key": "f66afc4e-9476-4ca4-9cdc-a66257031413", + "key": "77a07fa4-8e68-49c2-aad8-74f04328a34b", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "labwareId": "f2d371ea-5146-4c89-8200-9c056a7f321a:opentrons/opentrons_flex_96_tiprack_1000ul/1", @@ -3788,31 +3822,37 @@ }, { "commandType": "aspirate", - "key": "a629a9e7-e34f-4693-8479-3cb27d44d0b6", + "key": "06c28a5b-53c6-4aa5-89e0-30b509d2c68f", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, "labwareId": "8bacda22-9e05-45e8-bef4-cc04414a204f:opentrons/axygen_1_reservoir_90ml/1", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 160 } }, { "commandType": "dispense", - "key": "f831d4dd-c2c2-4429-9314-2fbef18546d6", + "key": "0caa3ced-9327-48aa-b59f-07ea65a81702", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, "labwareId": "54370838-4fca-4a14-b88a-7840e4903649:opentrons/opentrons_96_wellplate_200ul_pcr_full_skirt/2", "wellName": "F1", - "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 0.5, "x": 0, "y": 0 } + }, "flowRate": 160 } }, { "commandType": "moveToAddressableArea", - "key": "e05ddba8-7f1b-45a6-a8d9-9de8b01146bc", + "key": "592051e7-385f-49eb-aeb2-aca173c7e8d4", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "addressableAreaName": "1ChannelWasteChute", @@ -3821,12 +3861,12 @@ }, { "commandType": "dropTipInPlace", - "key": "059f01dc-eb9f-4cfd-92cf-0b67113e4c2d", + "key": "10c97227-329e-453d-bc1c-16b929cc7ad5", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc" } }, { "commandType": "pickUpTip", - "key": "2d85f593-c882-45b2-89ec-f3bd9cd7c645", + "key": "a85a3cb6-68e8-43d4-8c87-218bca8fe3ae", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "labwareId": "f2d371ea-5146-4c89-8200-9c056a7f321a:opentrons/opentrons_flex_96_tiprack_1000ul/1", @@ -3835,31 +3875,37 @@ }, { "commandType": "aspirate", - "key": "860d1800-6f8d-46d6-a939-81569e9641fc", + "key": "8804e9b7-b0e6-4814-bf38-48a5b05fb106", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, "labwareId": "8bacda22-9e05-45e8-bef4-cc04414a204f:opentrons/axygen_1_reservoir_90ml/1", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 160 } }, { "commandType": "dispense", - "key": "1d9ef0b0-926e-446c-b0df-c57dfc97f34e", + "key": "5cf8eaf7-c60d-41e2-bb90-c10b3dcb092f", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, "labwareId": "54370838-4fca-4a14-b88a-7840e4903649:opentrons/opentrons_96_wellplate_200ul_pcr_full_skirt/2", "wellName": "G1", - "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 0.5, "x": 0, "y": 0 } + }, "flowRate": 160 } }, { "commandType": "moveToAddressableArea", - "key": "c2954781-c45e-46ff-a8fa-36faea77630c", + "key": "f3e72ab1-d7ea-4857-aa42-8f25b2ec5d1b", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "addressableAreaName": "1ChannelWasteChute", @@ -3868,12 +3914,12 @@ }, { "commandType": "dropTipInPlace", - "key": "05db8e46-e6c4-4039-84ca-cf7a11042eb9", + "key": "2a0395ec-7363-407b-a391-e8e361d5098b", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc" } }, { "commandType": "pickUpTip", - "key": "2cbabc82-4412-4bc5-a7d2-12b74b39b641", + "key": "3246289c-9e03-43d4-8451-e6736a8a709d", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "labwareId": "f2d371ea-5146-4c89-8200-9c056a7f321a:opentrons/opentrons_flex_96_tiprack_1000ul/1", @@ -3882,31 +3928,37 @@ }, { "commandType": "aspirate", - "key": "9f9e94a0-4a33-441c-8864-e64f9a0fda07", + "key": "470b2170-edec-412a-beeb-56de7f85c0ea", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, "labwareId": "8bacda22-9e05-45e8-bef4-cc04414a204f:opentrons/axygen_1_reservoir_90ml/1", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 160 } }, { "commandType": "dispense", - "key": "d2144ca8-ca39-484a-a8a0-9c70e613be8a", + "key": "dec80858-857c-4ca9-89d1-235affcdfbc8", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "volume": 100, "labwareId": "54370838-4fca-4a14-b88a-7840e4903649:opentrons/opentrons_96_wellplate_200ul_pcr_full_skirt/2", "wellName": "H1", - "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 0.5, "x": 0, "y": 0 } + }, "flowRate": 160 } }, { "commandType": "moveToAddressableArea", - "key": "e8f7d982-7346-4e25-81b1-98e0412553d2", + "key": "998c55f5-86d6-4ba3-ac30-33d818357753", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc", "addressableAreaName": "1ChannelWasteChute", @@ -3915,19 +3967,19 @@ }, { "commandType": "dropTipInPlace", - "key": "880baa31-8fdb-4e11-9183-d90052fca1e2", + "key": "47eadfc8-8244-4509-9462-2fa624b8488a", "params": { "pipetteId": "9fcd50d9-92b2-45ac-acf1-e2cf773feffc" } }, { "commandType": "thermocycler/closeLid", - "key": "e1c31c80-51e8-47db-be63-29d861843b56", + "key": "15e90989-96e1-4e86-9381-d56db11b7659", "params": { "moduleId": "fd6da9f1-d63b-414b-929e-c646b64790e9:thermocyclerModuleType" } }, { "commandType": "thermocycler/setTargetBlockTemperature", - "key": "ae59fc04-b753-482e-87f0-8680cdccb6c4", + "key": "0dc52334-283f-458d-91a7-3b19c722a8f6", "params": { "moduleId": "fd6da9f1-d63b-414b-929e-c646b64790e9:thermocyclerModuleType", "celsius": 40 @@ -3935,47 +3987,47 @@ }, { "commandType": "thermocycler/waitForBlockTemperature", - "key": "66261c91-97d7-4170-b2f6-462ad85b660e", + "key": "78800364-855d-467f-8f52-8838892375d2", "params": { "moduleId": "fd6da9f1-d63b-414b-929e-c646b64790e9:thermocyclerModuleType" } }, { "commandType": "waitForDuration", - "key": "d09638c2-a49c-4b38-b22f-d581fb68feca", + "key": "264eed35-aa11-454f-83e1-3771ca54b87a", "params": { "seconds": 60, "message": "" } }, { "commandType": "thermocycler/openLid", - "key": "b5017439-7aa1-483a-a475-3b03ce1a4505", + "key": "80009058-c8ad-4da4-80da-9167e79188aa", "params": { "moduleId": "fd6da9f1-d63b-414b-929e-c646b64790e9:thermocyclerModuleType" } }, { "commandType": "thermocycler/deactivateBlock", - "key": "b9e78735-3881-4493-82cb-4bd628bd288d", + "key": "e8109b8f-f380-44b5-965a-40867be7765b", "params": { "moduleId": "fd6da9f1-d63b-414b-929e-c646b64790e9:thermocyclerModuleType" } }, { "commandType": "heaterShaker/deactivateHeater", - "key": "af91feaf-c12a-4059-abbf-91d33820a1c0", + "key": "389a88e8-7267-4cd8-bd5b-22e86d06150d", "params": { "moduleId": "23347241-80bb-4a7e-9c91-5d9727a9e483:heaterShakerModuleType" } }, { "commandType": "heaterShaker/openLabwareLatch", - "key": "7a7352ad-9879-4b2e-bc48-540ac0b2ad3b", + "key": "de12dc4b-89b8-42be-801d-02b70e3b04ff", "params": { "moduleId": "23347241-80bb-4a7e-9c91-5d9727a9e483:heaterShakerModuleType" } }, { "commandType": "moveLabware", - "key": "a2fe52a9-4acf-4599-afc3-5ed26bd579a8", + "key": "8822ab1b-89a9-4b0c-abac-1e3abb792d63", "params": { "labwareId": "54370838-4fca-4a14-b88a-7840e4903649:opentrons/opentrons_96_wellplate_200ul_pcr_full_skirt/2", "strategy": "usingGripper", @@ -3986,21 +4038,21 @@ }, { "commandType": "heaterShaker/closeLabwareLatch", - "key": "b057b4d6-57ae-4443-b798-2e6d9103c2e5", + "key": "91e9ed0e-4d2e-4eb9-b49b-0e30e5b5ea9d", "params": { "moduleId": "23347241-80bb-4a7e-9c91-5d9727a9e483:heaterShakerModuleType" } }, { "commandType": "heaterShaker/deactivateHeater", - "key": "cb6fba71-dfd4-468b-a351-22279bfad1c1", + "key": "1c03bbae-0989-4d1a-87c9-ee73003298ab", "params": { "moduleId": "23347241-80bb-4a7e-9c91-5d9727a9e483:heaterShakerModuleType" } }, { "commandType": "heaterShaker/setAndWaitForShakeSpeed", - "key": "a8c7211e-11f9-41e2-b977-68b513a2db5d", + "key": "af3f5cbc-801c-425f-a4c7-04c5bac0826c", "params": { "moduleId": "23347241-80bb-4a7e-9c91-5d9727a9e483:heaterShakerModuleType", "rpm": 200 @@ -4008,40 +4060,40 @@ }, { "commandType": "waitForDuration", - "key": "91be8718-5404-496e-957d-011a33f9cfe0", + "key": "af1c659a-fcbb-46aa-9c1b-6f233dee281e", "params": { "seconds": 60 } }, { "commandType": "heaterShaker/deactivateShaker", - "key": "11592571-7419-4880-b987-ace8edf90b8a", + "key": "ca120664-8293-4e0f-b8fd-2feb4c75cbf9", "params": { "moduleId": "23347241-80bb-4a7e-9c91-5d9727a9e483:heaterShakerModuleType" } }, { "commandType": "heaterShaker/deactivateHeater", - "key": "3da43478-0315-4c19-aaf2-087b174e1ecf", + "key": "abb2cb21-1848-4b51-a769-0bb74b8b0aa0", "params": { "moduleId": "23347241-80bb-4a7e-9c91-5d9727a9e483:heaterShakerModuleType" } }, { "commandType": "heaterShaker/deactivateHeater", - "key": "7038cc9a-87e9-4554-a69d-3828d1cf9273", + "key": "bd384e07-ddc3-430b-aa2d-04c9b874b130", "params": { "moduleId": "23347241-80bb-4a7e-9c91-5d9727a9e483:heaterShakerModuleType" } }, { "commandType": "heaterShaker/openLabwareLatch", - "key": "4a2c5d7f-31c0-40ff-ab77-b5eb167f4008", + "key": "25b0e4d1-ebd9-419f-ba55-691724c6ab66", "params": { "moduleId": "23347241-80bb-4a7e-9c91-5d9727a9e483:heaterShakerModuleType" } }, { "commandType": "moveLabware", - "key": "b2f3676b-da1a-411e-b106-fc761a5ce11b", + "key": "26c1f526-457b-46c2-9fe6-30fd595feabc", "params": { "labwareId": "54370838-4fca-4a14-b88a-7840e4903649:opentrons/opentrons_96_wellplate_200ul_pcr_full_skirt/2", "strategy": "usingGripper", @@ -4050,7 +4102,7 @@ }, { "commandType": "moveLabware", - "key": "f76dccda-5917-48cf-97eb-efd0ae2138f2", + "key": "b64778b0-86e3-495a-809d-90a4a636c3ff", "params": { "labwareId": "f2d371ea-5146-4c89-8200-9c056a7f321a:opentrons/opentrons_flex_96_tiprack_1000ul/1", "strategy": "usingGripper", diff --git a/protocol-designer/fixtures/protocol/8/example_1_1_0MigratedToV8.json b/protocol-designer/fixtures/protocol/8/example_1_1_0MigratedToV8.json index 531adb047e9..ed550749d7a 100644 --- a/protocol-designer/fixtures/protocol/8/example_1_1_0MigratedToV8.json +++ b/protocol-designer/fixtures/protocol/8/example_1_1_0MigratedToV8.json @@ -6,7 +6,7 @@ "author": "Author name", "description": "Description here", "created": 1560957631666, - "lastModified": 1711650670235, + "lastModified": 1711902162091, "category": null, "subcategory": null, "tags": [] @@ -15,7 +15,7 @@ "name": "opentrons/protocol-designer", "version": "8.1.0", "data": { - "_internalAppBuildDate": "Thu, 28 Mar 2024 18:30:23 GMT", + "_internalAppBuildDate": "Sun, 31 Mar 2024 16:22:18 GMT", "defaultValues": { "aspirate_mmFromBottom": 1, "dispense_mmFromBottom": 0.5, @@ -114,7 +114,7 @@ "disposalVolume_checkbox": true, "disposalVolume_volume": "1", "blowout_checkbox": true, - "blowout_location": "a1a3a3ee-84f5-44f2-b6c5-015be69c0208:trashBin", + "blowout_location": "9b1c0d01-9d4f-4016-afe6-9e08b46acf5e:trashBin", "preWetTip": false, "aspirate_airGap_checkbox": false, "aspirate_airGap_volume": null, @@ -126,8 +126,12 @@ "dispense_delay_checkbox": false, "dispense_delay_seconds": "1", "dispense_delay_mmFromBottom": "0.5", - "dropTip_location": "a1a3a3ee-84f5-44f2-b6c5-015be69c0208:trashBin", + "dropTip_location": "9b1c0d01-9d4f-4016-afe6-9e08b46acf5e:trashBin", "nozzles": null, + "dispense_x_position": 0, + "dispense_y_position": 0, + "aspirate_x_position": 0, + "aspirate_y_position": 0, "id": "e7d36200-92a5-11e9-ac62-1b173f839d9e", "stepType": "moveLiquid", "stepName": "transfer things", @@ -153,9 +157,11 @@ "dispense_delay_seconds": "1", "mix_touchTip_checkbox": true, "mix_touchTip_mmFromBottom": 30.5, - "dropTip_location": "a1a3a3ee-84f5-44f2-b6c5-015be69c0208:trashBin", + "dropTip_location": "9b1c0d01-9d4f-4016-afe6-9e08b46acf5e:trashBin", "nozzles": null, "tipRack": "c6f4ec70-92a5-11e9-ac62-1b173f839d9e:tiprack-10ul", + "mix_x_position": 0, + "mix_y_position": 0, "id": "18113c80-92a6-11e9-ac62-1b173f839d9e", "stepType": "mix", "stepName": "mix", @@ -3336,7 +3342,7 @@ "commandSchemaId": "opentronsCommandSchemaV8", "commands": [ { - "key": "6f4d2d94-4cab-4ead-9827-36a729f06652", + "key": "818878e2-9a2b-498e-be2d-1d317f6f7af8", "commandType": "loadPipette", "params": { "pipetteName": "p10_single", @@ -3345,7 +3351,7 @@ } }, { - "key": "fc0d5cb8-d53b-4629-abf6-b0935b8b4812", + "key": "1ae8e180-58c4-4970-b372-9a8f1869f297", "commandType": "loadPipette", "params": { "pipetteName": "p50_single", @@ -3354,7 +3360,7 @@ } }, { - "key": "a7c0b1ac-b2c6-4e2a-9e4a-b6a7787b48f9", + "key": "ce9f8375-8577-4062-a9ff-12bc33d3bec5", "commandType": "loadLabware", "params": { "displayName": "tiprack 10ul (1)", @@ -3366,7 +3372,7 @@ } }, { - "key": "55d92dea-5339-4f0b-b771-fb1089f281ed", + "key": "8f2f7622-476b-40ff-b692-768a69158aa2", "commandType": "loadLabware", "params": { "displayName": "tiprack 200ul (1)", @@ -3378,7 +3384,7 @@ } }, { - "key": "bfdd6d43-a127-48a5-9bd2-0e2693edf78e", + "key": "6802ec5e-204e-4a63-87a9-c6066788e537", "commandType": "loadLabware", "params": { "displayName": "96 deep well (1)", @@ -3391,7 +3397,7 @@ }, { "commandType": "loadLiquid", - "key": "73a8dbd7-47e8-441a-8c8f-1dbeee57241d", + "key": "c63af547-a330-4e04-96ea-f04ef3c93ca1", "params": { "liquidId": "1", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", @@ -3400,7 +3406,7 @@ }, { "commandType": "loadLiquid", - "key": "c1c5b6cf-8bb5-49a0-b887-2a4b0cddfefc", + "key": "d1af9a18-bb2f-4929-b952-7b1e21eadac8", "params": { "liquidId": "0", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", @@ -3415,7 +3421,7 @@ }, { "commandType": "pickUpTip", - "key": "ee2227a1-11d2-447c-b97b-9079725370ca", + "key": "24f9ab3b-48fd-42cb-8e0d-2128427459fe", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "c6f4ec70-92a5-11e9-ac62-1b173f839d9e:tiprack-10ul", @@ -3424,91 +3430,112 @@ }, { "commandType": "aspirate", - "key": "7dccc871-ae50-4281-a55d-71628dd2475d", + "key": "426ca672-56a0-430d-bdba-23632ad728b0", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "4b42680f-634b-47b5-95b9-293d73ef6f4a", + "key": "ea2eab58-723d-462e-ae8b-d0daa9462ece", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "c3a5efec-5dfc-41ce-98c2-983f31ca659d", + "key": "fa061fa1-e5d5-42cf-b9dd-d4b9a6b6eabe", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "5ce878dc-f20f-40fc-89d0-8b5551028f5a", + "key": "1e21ebe5-4e6f-4bc5-8dc3-1f1aa9158ff5", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "7ee113bc-9d41-470d-a909-bffb2510d00f", + "key": "7ad7bdad-84eb-42a0-b4ac-48949808a041", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "24cf716a-a105-4817-838c-817755dbb986", + "key": "dd723bb6-9eba-4ab6-bc80-03f6f6db17df", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "dbd9da16-cf9e-44ea-aabe-b6a0bf4f7a60", + "key": "eddfcde7-5497-42e7-bff4-56d2052bc552", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 0.6 } }, { "commandType": "touchTip", - "key": "7e8803d0-9788-4780-94fa-3a336747cb5a", + "key": "e3e8b3d6-a118-43de-9155-7d1a1da67dbd", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", @@ -3518,67 +3545,82 @@ }, { "commandType": "dispense", - "key": "7af6bccd-f70d-40fd-9026-146d24f45606", + "key": "080a9a26-92ba-48ba-84ed-0a10743b7918", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "E8", - "wellLocation": { "origin": "bottom", "offset": { "z": 2.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 2.5, "x": 0, "y": 0 } + }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "a2b37a9d-35ee-4151-ae60-221144efeaf9", + "key": "ac6f0caf-5fe8-4d45-9659-1265fd022295", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "E8", - "wellLocation": { "origin": "bottom", "offset": { "z": 2.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 2.5, "x": 0, "y": 0 } + }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "85d9b492-381f-4412-b9de-9343fabd06e2", + "key": "b9e03bec-0741-4dc9-b953-cadd7e7c40b6", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "E8", - "wellLocation": { "origin": "bottom", "offset": { "z": 2.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 2.5, "x": 0, "y": 0 } + }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "3eab4b4b-ff8f-4e99-a98e-0e8f181aaca1", + "key": "017fd13a-0e3a-4f54-94c3-8d5fc8eb4ba4", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "E8", - "wellLocation": { "origin": "bottom", "offset": { "z": 2.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 2.5, "x": 0, "y": 0 } + }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "83f8b202-581a-416b-863d-5cbc19d5cfdb", + "key": "7961e88d-1b9b-4615-bcbd-31320a03f81c", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "E8", - "wellLocation": { "origin": "bottom", "offset": { "z": 2.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 2.5, "x": 0, "y": 0 } + }, "flowRate": 10 } }, { "commandType": "moveToAddressableArea", - "key": "0f0d93dc-f745-46e5-a75d-7d939503d930", + "key": "4d60aa9f-e59b-491a-b494-aef4b877f6fa", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -3587,7 +3629,7 @@ }, { "commandType": "blowOutInPlace", - "key": "d3468c15-f33f-4bb2-aed2-571abb2a0195", + "key": "8bf8312b-7058-430e-8344-84ed35dda280", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "flowRate": 1000 @@ -3595,7 +3637,7 @@ }, { "commandType": "touchTip", - "key": "243f8f03-d546-48f3-8641-439e79bfef83", + "key": "728468cd-08a9-4811-b5a8-ce0649835d29", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", @@ -3605,7 +3647,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "631c7562-faa3-4ee2-95d7-6bdbefaec4bb", + "key": "1b5e20e3-85d5-4d87-89f9-7d9568696f6d", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -3615,12 +3657,12 @@ }, { "commandType": "dropTipInPlace", - "key": "fc391196-ed70-44b5-ba11-8abae97462eb", + "key": "3f520a13-6e4f-4ade-bbf8-2fdd35b875c3", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e" } }, { "commandType": "pickUpTip", - "key": "9e8eb31c-3e34-4281-aa18-5de6d0cd195e", + "key": "4b8db7a7-609e-431a-bf9d-7cf858c4b8f7", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "c6f4ec70-92a5-11e9-ac62-1b173f839d9e:tiprack-10ul", @@ -3629,91 +3671,112 @@ }, { "commandType": "aspirate", - "key": "c5e81bdb-1992-40f7-869a-ff0325c199de", + "key": "0355948e-57ca-4572-baa5-7a64b7ef28cc", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "8c0865e8-0d42-4f15-8b70-845e5d9b45fa", + "key": "193a745f-0698-4427-8d0d-d1e4fe24de24", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "97c816e1-3045-4f09-bc33-150e256cde65", + "key": "8d205199-aa0a-4640-9a23-b3adcca61be2", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "06d2d102-35f5-468d-b23c-900bd1df2789", + "key": "fe86a1bb-8c8e-4307-b06e-c92a8e231679", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "7556aad7-86b4-4606-a5cc-5f7f7b56f0d9", + "key": "1976e9d0-ee3f-4ca0-a039-147dd8c21399", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "edbbed85-7ab1-4aad-a603-06654028c9d0", + "key": "b75876f5-cbf6-43ae-8bb5-1b71641ccc6a", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "6ccfd5ad-d683-48e6-a4db-fd911a6803be", + "key": "c6ff48bc-a06c-4e5b-9172-986375d8a934", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 0.6 } }, { "commandType": "touchTip", - "key": "6b77c1fa-dbb6-4933-b04c-c043b8f183ac", + "key": "7a15666d-4676-41b5-8752-26cc8a07f17e", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", @@ -3723,67 +3786,82 @@ }, { "commandType": "dispense", - "key": "1ab3a31c-ee75-4918-a89c-443b6a160d9b", + "key": "ec56b383-c163-402e-9996-d4cc69a1cffd", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "D8", - "wellLocation": { "origin": "bottom", "offset": { "z": 2.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 2.5, "x": 0, "y": 0 } + }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "d38199b9-9ea1-4994-8124-af29d5bacd69", + "key": "cabfdd05-1309-43e2-bfbd-d04bc7de85c9", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "D8", - "wellLocation": { "origin": "bottom", "offset": { "z": 2.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 2.5, "x": 0, "y": 0 } + }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "39df2363-edb6-4b3f-9226-3e1e40f49a83", + "key": "05cb631d-9092-46e9-b802-6175fbae1e1f", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "D8", - "wellLocation": { "origin": "bottom", "offset": { "z": 2.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 2.5, "x": 0, "y": 0 } + }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "05046dbb-2bd5-4d5f-9029-592630619967", + "key": "ea50ada1-23d9-4ecf-af9d-3246930afd26", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "D8", - "wellLocation": { "origin": "bottom", "offset": { "z": 2.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 2.5, "x": 0, "y": 0 } + }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "04bd6a9a-012a-49cb-ba87-e96e3b42febc", + "key": "2523b9ed-ef76-40c9-8947-18c039e50939", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "D8", - "wellLocation": { "origin": "bottom", "offset": { "z": 2.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 2.5, "x": 0, "y": 0 } + }, "flowRate": 10 } }, { "commandType": "moveToAddressableArea", - "key": "4381a5c3-9f62-44f0-9030-cecbd7116762", + "key": "58c4751a-5628-4596-a171-1ac260259c28", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -3792,7 +3870,7 @@ }, { "commandType": "blowOutInPlace", - "key": "bca261f2-6071-4457-a47c-2bb76109e746", + "key": "ba5016a9-cd7a-41c8-bf17-aadb64664190", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "flowRate": 1000 @@ -3800,7 +3878,7 @@ }, { "commandType": "touchTip", - "key": "5f923682-3cae-4d33-9dfc-29ac10adb4ae", + "key": "1314e2d9-8d46-4663-9bf3-458a300b0add", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", @@ -3810,7 +3888,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "65c6a620-3fbb-41f0-b185-91c6fa6dbda6", + "key": "8527d992-4185-4f20-99a9-864541aaa7b6", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -3820,12 +3898,12 @@ }, { "commandType": "dropTipInPlace", - "key": "d063d2b8-234c-4e38-b66a-85a4011cbf94", + "key": "8c564bbd-34dd-44d2-ace8-995097f571b9", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e" } }, { "commandType": "pickUpTip", - "key": "432b72d6-f0c8-4cea-8bc2-b98fdae69445", + "key": "5377f188-8a31-4ff3-8ed3-ff5b651e467b", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "c6f4ec70-92a5-11e9-ac62-1b173f839d9e:tiprack-10ul", @@ -3834,91 +3912,112 @@ }, { "commandType": "aspirate", - "key": "62c975b5-3adc-4900-9119-a87d8f7098b6", + "key": "70c291fd-f5c9-4216-9446-de8191fff376", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "10139a39-fb4a-4080-88ca-ebe511cb2d56", + "key": "7f1299ec-8930-457d-a2d9-c18876da3769", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "2bc81ba4-9b04-4e2c-88b7-f75f6c3dd3ec", + "key": "d04dee6f-90a4-4b4b-89b8-05f1104431fd", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "bf7df5f4-1c18-46b7-b8f1-cc0853d1244a", + "key": "c983ed9b-783b-411a-8df2-50ef254b4deb", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "b86464a1-ee5d-4fce-b073-f14730bff0aa", + "key": "678dc318-94d9-488b-b2e3-f04ed29a2863", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "9e4fb406-bf5e-4571-b4e5-dfb1ff8f2b98", + "key": "6aee8385-14b4-48fa-bef0-3a642d38c1cd", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "fb8ce4d1-79f9-4ddf-b11e-ebed2414333b", + "key": "c9e9500e-5c89-450c-a56e-7058720a74ce", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 0.6 } }, { "commandType": "touchTip", - "key": "4be36f15-e8e3-4d6b-84b7-fe64db61ead3", + "key": "eeabdbf7-0dda-4246-859f-de8b643184c0", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", @@ -3928,67 +4027,82 @@ }, { "commandType": "dispense", - "key": "e3fdb442-d127-4b6d-8829-b688b55397a6", + "key": "60f965e4-60af-4183-99de-15c77232416d", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "C8", - "wellLocation": { "origin": "bottom", "offset": { "z": 2.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 2.5, "x": 0, "y": 0 } + }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "55c1e1fa-78a6-4605-b6b5-8953cbbf7010", + "key": "7a40b467-9754-4c02-ae2e-4644cb997555", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "C8", - "wellLocation": { "origin": "bottom", "offset": { "z": 2.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 2.5, "x": 0, "y": 0 } + }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "61620e17-2c1f-4a35-a64c-ef224b5b2a52", + "key": "a24675b2-41c7-4908-97ce-6bcf04c3d149", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "C8", - "wellLocation": { "origin": "bottom", "offset": { "z": 2.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 2.5, "x": 0, "y": 0 } + }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "39adc386-6ab8-4664-a0f4-5196f475e19f", + "key": "71a467a6-4c67-46e1-b829-f9a02fb6669e", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "C8", - "wellLocation": { "origin": "bottom", "offset": { "z": 2.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 2.5, "x": 0, "y": 0 } + }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "e5349e3a-6d1f-481a-8f37-6716b88d93a5", + "key": "b58fb6c6-17f0-44cf-add2-5ad3a99a06fe", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "C8", - "wellLocation": { "origin": "bottom", "offset": { "z": 2.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 2.5, "x": 0, "y": 0 } + }, "flowRate": 10 } }, { "commandType": "moveToAddressableArea", - "key": "89ae9ed8-0d2c-4b64-af9c-cf0c7bda3fd9", + "key": "b97a7e69-13c0-444b-9405-c84d8ab431bf", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -3997,7 +4111,7 @@ }, { "commandType": "blowOutInPlace", - "key": "6ac0f84b-1da9-41e7-a9e7-e5d7c5823077", + "key": "7e767220-28ab-4b59-ae54-1df3a59ac491", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "flowRate": 1000 @@ -4005,7 +4119,7 @@ }, { "commandType": "touchTip", - "key": "0e94a3f7-0bc1-42ea-bf18-b03b600ec548", + "key": "a4329dfb-0547-498b-a132-5314bdc37453", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", @@ -4015,7 +4129,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "4e04ac60-3844-4f1c-afcb-753d8efa8073", + "key": "222528ae-afc3-459f-bd12-291fb6e92977", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -4025,12 +4139,12 @@ }, { "commandType": "dropTipInPlace", - "key": "9c27a051-f55a-4859-9ee0-12cb2e4cc127", + "key": "a2b1c413-6b6d-4db7-b39f-36e801bb67bf", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e" } }, { "commandType": "pickUpTip", - "key": "83b37a71-e721-4454-98ba-a0e4c3311b06", + "key": "ee7cca8e-9d5a-4308-b437-91b3ac59e95c", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "c6f4ec70-92a5-11e9-ac62-1b173f839d9e:tiprack-10ul", @@ -4039,91 +4153,112 @@ }, { "commandType": "aspirate", - "key": "193df488-664a-4f29-8d62-4165930cde80", + "key": "9c65eb65-086b-4535-8dd4-fcdc3b1ce711", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "81ab7f7a-4c7b-4b74-9749-9cd2d146716c", + "key": "de99e84e-c816-42d7-bbaf-c685cf196c84", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "96680762-7d73-4c16-98d4-6ae783afd729", + "key": "2bb3b611-e413-4866-9f88-2093be26c559", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "1be89f92-b2bd-4e14-b230-4e72ebc6fc77", + "key": "51c61ed1-215a-4304-b0bc-f7c0787d9759", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "f693e0d2-1aff-4dc7-b6e3-cdd6ef614c01", + "key": "a5cb7070-9db9-4d93-94a0-baafdb9e1246", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "7918d2ba-e312-438c-8f15-ca28e8724bae", + "key": "b4812aa0-2c04-4f9f-a060-dcddb31655eb", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "8ac0c540-ff45-4cfd-995b-3fb6870ba09f", + "key": "09657153-451a-4ce8-a0aa-d238e97b5d4a", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 0.6 } }, { "commandType": "touchTip", - "key": "4b930577-57af-4907-859a-f54bc71dc58d", + "key": "1ba61ffa-26f7-4258-806e-459483f8aee2", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", @@ -4133,67 +4268,82 @@ }, { "commandType": "dispense", - "key": "cdb0573e-5982-40c7-95c2-4d884d69a313", + "key": "3e54188d-9608-4976-b2a8-0262bc6cd9a8", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "E7", - "wellLocation": { "origin": "bottom", "offset": { "z": 2.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 2.5, "x": 0, "y": 0 } + }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "6a3055ee-44ca-43fd-b1ea-caac89343321", + "key": "12abbaa6-4354-4635-86c7-53da228b89e9", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "E7", - "wellLocation": { "origin": "bottom", "offset": { "z": 2.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 2.5, "x": 0, "y": 0 } + }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "d7d8b056-6979-4840-aa44-b527e116aeff", + "key": "75989dac-fb90-46e0-8510-05946f0bb820", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "E7", - "wellLocation": { "origin": "bottom", "offset": { "z": 2.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 2.5, "x": 0, "y": 0 } + }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "54dcd384-1fad-4071-bd6f-8f09a4eebb3d", + "key": "970cd398-3ad1-46ee-a917-9781c74964c8", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "E7", - "wellLocation": { "origin": "bottom", "offset": { "z": 2.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 2.5, "x": 0, "y": 0 } + }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "4710bca2-6bb3-4d86-8a27-192c431b525a", + "key": "224042a5-8347-4867-b30c-ea349eee0eb0", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "E7", - "wellLocation": { "origin": "bottom", "offset": { "z": 2.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 2.5, "x": 0, "y": 0 } + }, "flowRate": 10 } }, { "commandType": "moveToAddressableArea", - "key": "d3d0b4cd-c86a-43b2-99b0-9c9818dca0f3", + "key": "5bca8d87-fae2-4082-92f1-5da5e9b0b01a", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -4202,7 +4352,7 @@ }, { "commandType": "blowOutInPlace", - "key": "621e6320-03b1-4d3a-82f9-000c120042ce", + "key": "6a40c11f-2894-4c0d-ae8c-3069aa7a3ac6", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "flowRate": 1000 @@ -4210,7 +4360,7 @@ }, { "commandType": "touchTip", - "key": "23c285de-7aa1-4a16-a457-015e2fb7abb7", + "key": "9667d8ab-87f8-4af8-a61c-39fa46e15928", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", @@ -4220,7 +4370,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "b0268cc2-ae71-4f29-94cb-032b56e36252", + "key": "54efaffe-8b67-45b0-8a1b-34eb9929230b", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -4230,12 +4380,12 @@ }, { "commandType": "dropTipInPlace", - "key": "980de7a4-b9ad-40c5-af04-a989bf3ff807", + "key": "4732e9c8-8b22-447d-9e8a-04360782f50c", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e" } }, { "commandType": "pickUpTip", - "key": "3e68bb44-ba33-484e-88cc-c931435e0c48", + "key": "55fbea4b-e8d2-4cc9-84f1-e531eedc46c8", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "c6f4ec70-92a5-11e9-ac62-1b173f839d9e:tiprack-10ul", @@ -4244,91 +4394,112 @@ }, { "commandType": "aspirate", - "key": "b02f553c-c223-4fb7-8899-7db1a60186d0", + "key": "d735d944-73ff-4713-ac51-c1341e5cc1a9", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "b012ac38-0070-4ff4-acfe-d42b6c5f9674", + "key": "33e8c95b-801c-42c3-9048-fa14b6aa7f29", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "537bf097-77dd-43bd-a67b-77a146f5349e", + "key": "b25b278a-8b01-4bc2-a1f8-456c7bf8c526", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "2931c986-44ae-4ba2-bb36-bd705feb875c", + "key": "23d673c8-d769-480b-858b-43ac62636220", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "bc5af19c-0dd5-4791-a5b1-34002997cb3d", + "key": "3452e515-d862-40d0-99e1-34dd0404337f", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "dc5d2b3e-8efd-41a9-b84e-d7debee06ac9", + "key": "36c73f15-d9cd-410c-8699-f19396584618", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "0de5e018-4a9f-4cfe-9f58-f50901663c3c", + "key": "7b78234d-4513-49cc-83e7-10b662ff8675", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 0.6 } }, { "commandType": "touchTip", - "key": "af42fb71-74da-41b8-9b50-41048e949434", + "key": "b1b3ee6f-a9be-4220-8004-7296970de788", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", @@ -4338,67 +4509,82 @@ }, { "commandType": "dispense", - "key": "72efd216-e92f-4103-a71e-85be208865ec", + "key": "f7c5a31f-1a71-478f-a145-eb5c5c567c6d", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "D7", - "wellLocation": { "origin": "bottom", "offset": { "z": 2.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 2.5, "x": 0, "y": 0 } + }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "0387ffa2-40c4-4280-86d1-8c1fd39b6356", + "key": "5e4a8c3c-5a80-488b-898d-d1074f2c426c", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "D7", - "wellLocation": { "origin": "bottom", "offset": { "z": 2.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 2.5, "x": 0, "y": 0 } + }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "c09fbe67-3e6c-4f82-8bc5-25db6a3d5a50", + "key": "da0e8d29-8619-47e1-b8da-98ccaf2c56fc", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "D7", - "wellLocation": { "origin": "bottom", "offset": { "z": 2.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 2.5, "x": 0, "y": 0 } + }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "1939bb32-88c2-4d55-bb3f-7d31535a3403", + "key": "3fd622c1-93bc-4e5d-92cb-3dc40f38d92d", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "D7", - "wellLocation": { "origin": "bottom", "offset": { "z": 2.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 2.5, "x": 0, "y": 0 } + }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "b3bdd7bd-5cc2-42fa-b938-24fbc32931d6", + "key": "7fe8ecbf-6872-4c45-9f41-b3f5e31b8c42", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "D7", - "wellLocation": { "origin": "bottom", "offset": { "z": 2.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 2.5, "x": 0, "y": 0 } + }, "flowRate": 10 } }, { "commandType": "moveToAddressableArea", - "key": "ff827e3d-8136-44c1-a29a-33e0a0abf081", + "key": "7e7f40a5-1b19-414d-b1ec-b0f632ee81eb", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -4407,7 +4593,7 @@ }, { "commandType": "blowOutInPlace", - "key": "ee65b14e-529d-4116-81a7-ff50f28bc1a4", + "key": "e7d928ca-d918-43a1-973a-e56361029dcd", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "flowRate": 1000 @@ -4415,7 +4601,7 @@ }, { "commandType": "touchTip", - "key": "e31dd584-a774-41c7-9176-62749596b7e6", + "key": "1665f0f5-1778-49ed-a765-bcdcc3a9c13a", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", @@ -4425,7 +4611,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "cd354a43-9b7d-48d5-8e2a-f6c369ac10f4", + "key": "5f71c216-2dd4-4b3f-9958-feac1e0ba419", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -4435,12 +4621,12 @@ }, { "commandType": "dropTipInPlace", - "key": "a435f546-520d-4e38-bc22-f5f084f95d5d", + "key": "0d98fee0-4ada-4ddd-98cc-ee4f51763615", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e" } }, { "commandType": "pickUpTip", - "key": "ba2e7ee3-715f-4588-93e8-05d4b1eed1cc", + "key": "1eca1b12-6dda-4a57-84cc-48ed09a5dcc7", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "c6f4ec70-92a5-11e9-ac62-1b173f839d9e:tiprack-10ul", @@ -4449,91 +4635,112 @@ }, { "commandType": "aspirate", - "key": "1c2d5f90-6dbd-4b61-b97e-a4bf38f056d9", + "key": "6468842b-d755-431a-8f39-63390afc45aa", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "2fbc684b-57c7-4e89-8d53-85c7f6f806de", + "key": "3f19926d-5262-4869-8830-7eb13951f4fe", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "ef0f4077-3692-41b0-ad2d-0bcf94a1a075", + "key": "0816f07a-7ddf-41da-91a8-6c55bcf902ff", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "a386c011-855b-4f41-be57-623647498c1a", + "key": "6ac9d9b6-b45e-4b0a-90c5-835a680ab914", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "9dd98cc7-2557-48bd-baf9-2e54ab47883c", + "key": "2c0b977d-cc77-44bb-b0a3-62339279f8d4", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "3d57ac48-bf99-498b-b523-1be901efcc1e", + "key": "b15ab048-c8ae-491b-ba0a-ddb84af43b8a", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "e64a4b94-cd07-4eb2-9edc-ab83093fc4bc", + "key": "ebb52c59-bc4d-4f3a-b1b4-10ceea23ecd4", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 0.6 } }, { "commandType": "touchTip", - "key": "99567709-ebe8-4244-8252-dedb5aeb666c", + "key": "1c48b0b0-c786-4278-a95b-180d8bc8d7fb", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", @@ -4543,67 +4750,82 @@ }, { "commandType": "dispense", - "key": "94901710-b6db-4d27-b893-71108cc6186c", + "key": "6db1da99-4bfc-4723-a37b-db57a913a5a0", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "C7", - "wellLocation": { "origin": "bottom", "offset": { "z": 2.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 2.5, "x": 0, "y": 0 } + }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "0467798b-8ec8-4d1e-afee-2a73a8422bcd", + "key": "b040900a-f61c-462e-9238-87746a45c0b8", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "C7", - "wellLocation": { "origin": "bottom", "offset": { "z": 2.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 2.5, "x": 0, "y": 0 } + }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "fc858419-1723-4c54-85d1-2d2ef53637ee", + "key": "8e2de19c-a6b1-4af7-a614-8f692815d667", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "C7", - "wellLocation": { "origin": "bottom", "offset": { "z": 2.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 2.5, "x": 0, "y": 0 } + }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "b30572d5-f396-41f3-8662-a4285508710d", + "key": "a72f4e61-2874-4af0-a471-d97434970e2b", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "C7", - "wellLocation": { "origin": "bottom", "offset": { "z": 2.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 2.5, "x": 0, "y": 0 } + }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "5da67cc2-d056-4d4c-abc5-3a70269c38bc", + "key": "ff833f33-6c7e-417a-8293-f9a2c2eead8c", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "C7", - "wellLocation": { "origin": "bottom", "offset": { "z": 2.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 2.5, "x": 0, "y": 0 } + }, "flowRate": 10 } }, { "commandType": "moveToAddressableArea", - "key": "c847fdfb-bb85-4335-9821-8fded3c15f0e", + "key": "40d74de4-9953-43ae-b4bc-518d39005303", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -4612,7 +4834,7 @@ }, { "commandType": "blowOutInPlace", - "key": "d269fea9-b30e-488f-a2b2-37ae88547251", + "key": "7570e6a2-b2a3-4836-aaa0-13c90ceb08f4", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "flowRate": 1000 @@ -4620,7 +4842,7 @@ }, { "commandType": "touchTip", - "key": "da6ec212-7d12-411a-9f2b-2beff5ed197d", + "key": "5de67294-430d-4856-aa25-0177b32ef514", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", @@ -4630,7 +4852,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "d8bef8c0-954a-4293-a75f-2589a37fc982", + "key": "b25ac8f3-fe61-4f87-b5f2-40936132a6dd", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -4640,12 +4862,12 @@ }, { "commandType": "dropTipInPlace", - "key": "784c0470-5513-4f60-bb7e-f039db7b170f", + "key": "aa3d17b8-8d52-462f-9e39-b0d2d83e5407", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e" } }, { "commandType": "pickUpTip", - "key": "5729228a-64f0-443e-91fe-31179efbdd1a", + "key": "188da1f2-486b-4dfd-b2c8-e0903544fa8d", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "c6f4ec70-92a5-11e9-ac62-1b173f839d9e:tiprack-10ul", @@ -4654,91 +4876,112 @@ }, { "commandType": "aspirate", - "key": "288895f0-14c7-4909-a300-178801bd08b4", + "key": "df11a136-0f66-4502-ad52-443adc71ca2b", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "2f718ed4-0d72-45c4-bb4d-cc8265cbbf9a", + "key": "00502ab3-b649-4532-ba39-184ff41b00cb", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "7fde7d76-b68e-43d2-a00f-3203fdcfd95e", + "key": "cdc0749e-e66b-480e-afe0-3ad6c5e739e4", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "ca2845d1-33bf-49cf-8bfe-48bbe544419e", + "key": "65529980-e475-4f51-a8dc-cd1f7e5a5020", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "b5b15b72-dce1-430e-8050-e5e4b6fd9d54", + "key": "d9e94497-0439-4675-bb57-cc2e62ea7a84", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "c3bc77de-b5d0-43fa-a7a5-bc9e6b6fd765", + "key": "27bd35c9-4ef4-471f-954b-289db56992ad", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "c08f49f2-c0c8-488b-beab-160ad57f46c5", + "key": "9241c560-e1d0-4468-ac78-10c9511d0113", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 0.6 } }, { "commandType": "touchTip", - "key": "1d53f469-6c0b-4264-bb92-abb8299f650d", + "key": "67e511d9-8198-4c0d-808e-c9600f2aff6b", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", @@ -4748,67 +4991,82 @@ }, { "commandType": "dispense", - "key": "122d4fc9-e63d-430e-8ea0-6c1b17c3f1a7", + "key": "ea876b75-dbb7-445e-afb4-efa1fd12eda8", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "E6", - "wellLocation": { "origin": "bottom", "offset": { "z": 2.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 2.5, "x": 0, "y": 0 } + }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "7d9df411-c0a1-4e91-8716-c80643cbd868", + "key": "7551fb8d-3899-42f4-ba52-9e03c2410ae5", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "E6", - "wellLocation": { "origin": "bottom", "offset": { "z": 2.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 2.5, "x": 0, "y": 0 } + }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "73a6bb03-d083-475d-99de-452fb093e44b", + "key": "dae940af-8337-439f-83c5-39745994b216", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "E6", - "wellLocation": { "origin": "bottom", "offset": { "z": 2.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 2.5, "x": 0, "y": 0 } + }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "818098d4-ddd1-4853-875f-eeaf28898e12", + "key": "d9c4b87f-8e3f-415b-9c61-b14cff73fa6e", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "E6", - "wellLocation": { "origin": "bottom", "offset": { "z": 2.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 2.5, "x": 0, "y": 0 } + }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "4b43d7c0-d2cc-4721-8675-98c0357889fd", + "key": "6e1ae4be-0622-490d-811a-1442a54f38c6", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "E6", - "wellLocation": { "origin": "bottom", "offset": { "z": 2.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 2.5, "x": 0, "y": 0 } + }, "flowRate": 10 } }, { "commandType": "moveToAddressableArea", - "key": "4461238e-6823-489c-9b95-59529d34c5e6", + "key": "2172c551-8f66-49ec-b092-3cecb3ecd1e6", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -4817,7 +5075,7 @@ }, { "commandType": "blowOutInPlace", - "key": "abcefb59-b32e-4b9e-8ac3-fb8589565405", + "key": "70f94de0-45c2-4082-85c7-000a3c7d4e05", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "flowRate": 1000 @@ -4825,7 +5083,7 @@ }, { "commandType": "touchTip", - "key": "6e1c8052-ebab-401a-a3de-1a20d61a1b40", + "key": "7a8c6027-3547-4415-97e2-e4a8839cefcb", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", @@ -4835,7 +5093,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "72caf8d6-745c-4bb8-997b-c6b2685935b6", + "key": "9e76549d-de35-4be7-b42f-83e81eb148e5", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -4845,12 +5103,12 @@ }, { "commandType": "dropTipInPlace", - "key": "e4f6c6e4-58b0-466c-972a-56ee8b56735c", + "key": "edb7a124-0334-41a3-b82f-237bf2a63e37", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e" } }, { "commandType": "pickUpTip", - "key": "a5de52b2-a015-4377-9adc-2e784a8a3514", + "key": "f040345b-250f-4fa6-abc0-62e27fe59938", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "c6f4ec70-92a5-11e9-ac62-1b173f839d9e:tiprack-10ul", @@ -4859,91 +5117,112 @@ }, { "commandType": "aspirate", - "key": "f46ecf37-8a53-4f96-87b4-45b58807c754", + "key": "cd942842-7300-40c1-87a6-28f073ea3dc5", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "cbedd7bd-637c-4767-a6a6-694b76138850", + "key": "f6a45b15-269b-482d-983b-d3bc5db57d26", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "a200a845-574f-4f0b-9ad7-39f095b6d732", + "key": "7d61c0b4-4555-435c-b837-b559b360a82e", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "96a8c1d7-bd45-44a7-ba7c-44b4d1067f4e", + "key": "9f9dfc52-5ca3-42e2-b9d5-3bfa8521de49", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "b1aae64c-98fe-402a-8a6e-38046dc2d375", + "key": "11346b4b-af47-46f0-9461-52664eec0d39", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "9ec5ab4b-5da0-4859-b713-e849f806a4c7", + "key": "23982cac-52ae-484f-b3e7-c52c029b1e9a", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "f6849f46-5724-4643-92bf-b526f5e263fa", + "key": "148dd2de-1425-482f-8fec-32731007bbff", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 0.6 } }, { "commandType": "touchTip", - "key": "9dc1c842-947a-4e0f-8601-bae5edf58bd0", + "key": "41e664b1-6199-4a33-9857-76df944f516d", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", @@ -4953,67 +5232,82 @@ }, { "commandType": "dispense", - "key": "f9c66ebe-764a-4d16-975a-b9d275f7e6e3", + "key": "152340ce-cde0-469e-9882-a8ef3d4a1cde", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "D6", - "wellLocation": { "origin": "bottom", "offset": { "z": 2.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 2.5, "x": 0, "y": 0 } + }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "ccf1ab0e-c50f-4c41-9eb9-5f84ec9c8d8c", + "key": "e4e8529f-89fc-4a94-a49d-410b799aa539", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "D6", - "wellLocation": { "origin": "bottom", "offset": { "z": 2.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 2.5, "x": 0, "y": 0 } + }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "0f734cf9-c9d8-40ee-82f7-a34d97e43ed9", + "key": "01461514-1395-4f09-95db-29dea71c1f5b", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "D6", - "wellLocation": { "origin": "bottom", "offset": { "z": 2.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 2.5, "x": 0, "y": 0 } + }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "0139e4ec-529e-4080-8926-37c140621866", + "key": "ff195ab9-cb65-45d1-93a8-a071d0bbed98", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "D6", - "wellLocation": { "origin": "bottom", "offset": { "z": 2.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 2.5, "x": 0, "y": 0 } + }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "e3a5a1bf-0a24-4787-b3fe-2f60075de339", + "key": "8ba714b7-bcc2-48c3-8c57-0d0ac933b976", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "D6", - "wellLocation": { "origin": "bottom", "offset": { "z": 2.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 2.5, "x": 0, "y": 0 } + }, "flowRate": 10 } }, { "commandType": "moveToAddressableArea", - "key": "7b9216cc-c1d4-469e-a5d8-7683a943bb0c", + "key": "8c2017b4-9145-46bc-a91f-83f27cc0a828", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -5022,7 +5316,7 @@ }, { "commandType": "blowOutInPlace", - "key": "cdeb2bad-74b0-4160-9984-ebb55bb04bc3", + "key": "6dba0671-c83f-4fc2-8d9c-3e309448d0e9", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "flowRate": 1000 @@ -5030,7 +5324,7 @@ }, { "commandType": "touchTip", - "key": "8d938cfa-0484-4692-bac6-143f3f52e75b", + "key": "15c49bf0-ce06-4687-aeb5-a5dd0736f2f5", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", @@ -5040,7 +5334,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "ec4eb309-173d-452e-a601-6ea966a7254e", + "key": "5e494f88-ee95-42f1-bbd4-23b449649b93", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -5050,12 +5344,12 @@ }, { "commandType": "dropTipInPlace", - "key": "f92c4c88-0208-44f5-81b9-056546a45e49", + "key": "e1f4d20a-b36c-4da1-9b1f-529aef638f1f", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e" } }, { "commandType": "pickUpTip", - "key": "1ede6001-67c7-4d54-b866-4eb2d9b1d82b", + "key": "c3d944d3-abe8-4f4c-8e4d-70792c3303f2", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "c6f4ec70-92a5-11e9-ac62-1b173f839d9e:tiprack-10ul", @@ -5064,91 +5358,112 @@ }, { "commandType": "aspirate", - "key": "ccf06eed-b517-4b14-b31d-736dcdc8c3b4", + "key": "4432786d-94e4-4958-ae49-8d0679c97fc0", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "49f837ff-5dd9-4f54-b4a0-ffd492c4c969", + "key": "3efc13e5-aac5-4f23-b060-52003c8c827f", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "530ffdc6-b112-4f88-b25e-745bb9c86516", + "key": "5ec72861-9ac4-4a9b-91e2-907932819e58", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "515f7c58-c506-4bad-95c4-4adfcdadea5d", + "key": "994b0746-ea15-4cfb-afa7-d00ff124e0f1", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "fc5e49e8-cadb-4a8a-addb-4525a0640254", + "key": "2acee0bb-366c-4f1d-b165-f69a1c03b05f", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "26838934-eaf7-4a76-bb3b-070e3aab3bcb", + "key": "a44857c1-e5d2-4ce7-a428-41a68e426f3c", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 2, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "eef5c160-b9b0-43cf-8e8e-9b836431a606", + "key": "09f55bdd-61ff-4667-878f-c79e0a21b9c5", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 0.6 } }, { "commandType": "touchTip", - "key": "4e84dbb8-53b6-400f-8530-eb2ee326dc13", + "key": "4daa0f4c-e10e-488e-9d19-3a8602a548f4", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", @@ -5158,67 +5473,82 @@ }, { "commandType": "dispense", - "key": "19c3e661-d308-4544-babf-fd4cefd23331", + "key": "5f54be1c-fff2-41ae-b512-01a9bb28cc4a", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 6, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "C6", - "wellLocation": { "origin": "bottom", "offset": { "z": 2.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 2.5, "x": 0, "y": 0 } + }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "2bfda325-1526-4178-8fa5-338c9dc9d92b", + "key": "6e42ea13-01ed-461b-8dfa-9bd360982ddf", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "C6", - "wellLocation": { "origin": "bottom", "offset": { "z": 2.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 2.5, "x": 0, "y": 0 } + }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "adabc3a8-3e76-423d-949e-8d5146862421", + "key": "63d6f42e-0caa-47c4-9341-e3a950f85128", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "C6", - "wellLocation": { "origin": "bottom", "offset": { "z": 2.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 2.5, "x": 0, "y": 0 } + }, "flowRate": 10 } }, { "commandType": "aspirate", - "key": "957dda98-4628-4029-90bd-d1a2e0c280c3", + "key": "c8791232-20bd-4068-a778-4630548b49ae", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "C6", - "wellLocation": { "origin": "bottom", "offset": { "z": 2.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 2.5, "x": 0, "y": 0 } + }, "flowRate": 0.6 } }, { "commandType": "dispense", - "key": "538985a7-8e67-4abd-94cf-68387fd80e7d", + "key": "98e4d5e2-4b75-435f-8809-099806e98694", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 3, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "C6", - "wellLocation": { "origin": "bottom", "offset": { "z": 2.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 2.5, "x": 0, "y": 0 } + }, "flowRate": 10 } }, { "commandType": "moveToAddressableArea", - "key": "71eaf4c8-c8a5-400b-b094-46bdcaa60daf", + "key": "921371a0-2df9-4f3e-b28f-0282399e98a3", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -5227,7 +5557,7 @@ }, { "commandType": "blowOutInPlace", - "key": "f935fe77-d02e-4bb8-95e2-5f25e8312dad", + "key": "f9c7ae2a-b401-4c92-8e6a-4366ffb93643", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "flowRate": 1000 @@ -5235,7 +5565,7 @@ }, { "commandType": "touchTip", - "key": "6cbaaafd-f358-4779-9cb2-3622e3285ae1", + "key": "70fbf7e3-cae6-49e7-bfd3-65a5376b5e3e", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", @@ -5245,7 +5575,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "756c761d-66fe-4fc7-8e53-cf258c4b95c4", + "key": "74d53fee-f9c6-4a27-a54b-80a79e906b6c", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -5255,12 +5585,12 @@ }, { "commandType": "dropTipInPlace", - "key": "bfb11f03-bef0-4d98-a569-b21249c1f447", + "key": "28dc2329-937d-4d2c-8fc3-eecf3f321041", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e" } }, { "commandType": "pickUpTip", - "key": "7dec52bf-9c68-42ca-838b-1ebb9c4f325f", + "key": "5ad18635-8559-4904-8db4-4e2b19546238", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "c6f4ec70-92a5-11e9-ac62-1b173f839d9e:tiprack-10ul", @@ -5269,79 +5599,97 @@ }, { "commandType": "aspirate", - "key": "83e518c4-7a06-439f-b7f8-175feb33b528", + "key": "1227b40e-adda-4545-9724-5509ff790adf", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 5.5, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "F1", - "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 0.5, "x": 0, "y": 0 } + }, "flowRate": 8 } }, { "commandType": "dispense", - "key": "a79b3bc6-6e2c-4800-adf2-72f5b221e2d4", + "key": "b9c1000c-c52f-4b04-9790-9a2dec7dadd3", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 5.5, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "F1", - "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 0.5, "x": 0, "y": 0 } + }, "flowRate": 7 } }, { "commandType": "aspirate", - "key": "3fd83532-cf51-43d6-bd74-ca3fcd09f175", + "key": "0b5da711-8961-40d0-a294-b4d9eed6c77a", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 5.5, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "F1", - "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 0.5, "x": 0, "y": 0 } + }, "flowRate": 8 } }, { "commandType": "dispense", - "key": "48d023af-e120-4d61-8eb0-76a9433258a4", + "key": "12b3c883-f2b2-4651-816e-e38bb8cb5c85", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 5.5, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "F1", - "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 0.5, "x": 0, "y": 0 } + }, "flowRate": 7 } }, { "commandType": "aspirate", - "key": "54f4aba0-c8f0-463d-8bff-8e3311db6765", + "key": "b30463df-33e7-4038-97d6-298f7e9cef8e", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 5.5, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "F1", - "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 0.5, "x": 0, "y": 0 } + }, "flowRate": 8 } }, { "commandType": "dispense", - "key": "1589b195-68ec-47a4-baee-f27de214ef10", + "key": "b2c2c14c-6874-406a-b9d1-33bc02b7a74f", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "volume": 5.5, "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", "wellName": "F1", - "wellLocation": { "origin": "bottom", "offset": { "z": 0.5 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 0.5, "x": 0, "y": 0 } + }, "flowRate": 7 } }, { "commandType": "blowout", - "key": "0a4211db-4a8c-496a-9098-0a8547f4e39f", + "key": "98f8d095-46f4-4349-8c93-21eebfcf05d3", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", @@ -5352,7 +5700,7 @@ }, { "commandType": "touchTip", - "key": "0575a144-4887-4ccd-b64a-a1a18094a2f5", + "key": "d6985dc6-551c-4ceb-bcc9-c833301b1eac", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "labwareId": "dafd4000-92a5-11e9-ac62-1b173f839d9e:96-deep-well", @@ -5362,7 +5710,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "2551d68a-3a19-4283-84d9-fd285ee0f745", + "key": "cdf5e0f0-0598-4e4d-98e8-70a57ff83a4a", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e", "addressableAreaName": "fixedTrash", @@ -5372,12 +5720,12 @@ }, { "commandType": "dropTipInPlace", - "key": "981b6c74-860e-4c14-bb74-25c66d110508", + "key": "1c0dee1c-97fa-4f33-bb36-9b3b7a2ef73e", "params": { "pipetteId": "c6f45030-92a5-11e9-ac62-1b173f839d9e" } }, { "commandType": "waitForDuration", - "key": "a45e4cd0-d4b1-4042-9295-396f0e6b92df", + "key": "d306df0a-3ad2-48ac-9ac2-1151895982e0", "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 0cf5bc6679f..efa4b0ac6d6 100644 --- a/protocol-designer/fixtures/protocol/8/mix_8_0_0.json +++ b/protocol-designer/fixtures/protocol/8/mix_8_0_0.json @@ -6,7 +6,7 @@ "author": "", "description": "A test for 5.0.0 -> 5.1.0 migration", "created": 1600714068238, - "lastModified": 1709303322125, + "lastModified": 1711742569351, "category": null, "subcategory": null, "tags": [] @@ -15,7 +15,7 @@ "name": "opentrons/protocol-designer", "version": "8.1.0", "data": { - "_internalAppBuildDate": "Fri, 01 Mar 2024 14:22:27 GMT", + "_internalAppBuildDate": "Fri, 29 Mar 2024 20:00:04 GMT", "defaultValues": { "aspirate_mmFromBottom": 1, "dispense_mmFromBottom": 0.5, @@ -75,6 +75,8 @@ "dropTip_location": "5ba7047d-d3e2-4845-9eaa-1974af796ead:trashBin", "nozzles": null, "tipRack": "f1c677c0-fc3a-11ea-8809-e959e7d61d96:opentrons/opentrons_96_tiprack_10ul/1", + "mix_x_position": 0, + "mix_y_position": 0, "id": "fc4dc7c0-fc3a-11ea-8809-e959e7d61d96", "stepType": "mix", "stepName": "mix", @@ -2125,7 +2127,7 @@ "commandSchemaId": "opentronsCommandSchemaV8", "commands": [ { - "key": "87303141-a159-4390-ab9e-c737b5e29d2a", + "key": "3004b46c-2b41-4453-8ddc-1629ec3b5249", "commandType": "loadPipette", "params": { "pipetteName": "p20_single_gen2", @@ -2134,7 +2136,7 @@ } }, { - "key": "1dbb2e54-da06-4512-b02c-b3a4c2fc539f", + "key": "c318feee-5ec6-40a0-9ecc-554e67b30ce1", "commandType": "loadLabware", "params": { "displayName": "Opentrons OT-2 96 Tip Rack 10 µL", @@ -2146,7 +2148,7 @@ } }, { - "key": "7c5e3453-255c-4216-a5c3-7787fa4ef106", + "key": "3350dee6-aa60-4569-a801-0dfeb5baf8ed", "commandType": "loadLabware", "params": { "displayName": "Bio-Rad 96 Well Plate 200 µL PCR", @@ -2159,7 +2161,7 @@ }, { "commandType": "waitForDuration", - "key": "929f2a92-418b-411d-aa33-27db0788e1ff", + "key": "797e70f3-5310-48c2-ba06-12adb92a7b4e", "params": { "seconds": 3723, "message": "" } } ], diff --git a/protocol-designer/fixtures/protocol/8/ninetySixChannelFullAndColumn.json b/protocol-designer/fixtures/protocol/8/ninetySixChannelFullAndColumn.json index abc2d223176..07384926f57 100644 --- a/protocol-designer/fixtures/protocol/8/ninetySixChannelFullAndColumn.json +++ b/protocol-designer/fixtures/protocol/8/ninetySixChannelFullAndColumn.json @@ -6,7 +6,7 @@ "author": "", "description": "", "created": 1701805621086, - "lastModified": 1709303384383, + "lastModified": 1711742604736, "category": null, "subcategory": null, "tags": [] @@ -15,7 +15,7 @@ "name": "opentrons/protocol-designer", "version": "8.1.0", "data": { - "_internalAppBuildDate": "Fri, 01 Mar 2024 14:22:27 GMT", + "_internalAppBuildDate": "Fri, 29 Mar 2024 20:00:04 GMT", "defaultValues": { "aspirate_mmFromBottom": 1, "dispense_mmFromBottom": 0.5, @@ -93,6 +93,10 @@ "dispense_delay_mmFromBottom": null, "dropTip_location": "1e553651-9e4d-44b1-a31b-92459642bfd7:trashBin", "nozzles": "ALL", + "dispense_x_position": 0, + "dispense_y_position": 0, + "aspirate_x_position": 0, + "aspirate_y_position": 0, "id": "83a095fa-b649-4105-99d4-177f1a3f363a", "stepType": "moveLiquid", "stepName": "transfer", @@ -144,6 +148,10 @@ "dispense_delay_mmFromBottom": null, "dropTip_location": "1e553651-9e4d-44b1-a31b-92459642bfd7:trashBin", "nozzles": "COLUMN", + "dispense_x_position": 0, + "dispense_y_position": 0, + "aspirate_x_position": 0, + "aspirate_y_position": 0, "id": "f5ea3139-1585-4848-9d5f-832eb88c99ca", "stepType": "moveLiquid", "stepName": "transfer", @@ -2233,7 +2241,7 @@ "commandSchemaId": "opentronsCommandSchemaV8", "commands": [ { - "key": "e09dc6e2-c0e6-4b28-9460-865c48a3b03f", + "key": "7224d1a7-a7b3-4bb3-bc5c-65aa98565616", "commandType": "loadPipette", "params": { "pipetteName": "p1000_96", @@ -2242,7 +2250,7 @@ } }, { - "key": "3dc22b4a-9fa8-4c61-843d-b45a4054490e", + "key": "dcddeb3c-66d9-4868-9f9f-fbd47d754fc4", "commandType": "loadLabware", "params": { "displayName": "Opentrons Flex 96 Tip Rack Adapter", @@ -2254,7 +2262,7 @@ } }, { - "key": "0f3b11ad-a015-4ece-9267-0ca57c832bfd", + "key": "c206434e-aa1e-44ee-8667-29accd89941a", "commandType": "loadLabware", "params": { "displayName": "Opentrons Flex 96 Tip Rack 50 µL", @@ -2268,7 +2276,7 @@ } }, { - "key": "0194f4bc-e114-4048-af3f-e053db83a79e", + "key": "3cdba839-f0fa-4e50-8399-94338cced032", "commandType": "loadLabware", "params": { "displayName": "Bio-Rad 96 Well Plate 200 µL PCR", @@ -2280,7 +2288,7 @@ } }, { - "key": "c807c9aa-7300-40be-817f-6d2018cd9d95", + "key": "7f75bf03-3036-4847-afbf-4bbefdf6cee8", "commandType": "loadLabware", "params": { "displayName": "Opentrons Flex 96 Tip Rack 50 µL", @@ -2293,7 +2301,7 @@ }, { "commandType": "configureNozzleLayout", - "key": "131fd37b-29cb-41f8-8792-b3c210e2db36", + "key": "2326c781-0416-4319-b954-16929077b5e3", "params": { "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9", "configurationParams": { "style": "ALL" } @@ -2301,7 +2309,7 @@ }, { "commandType": "pickUpTip", - "key": "d08a4b16-f17e-4146-adff-68d3235f3174", + "key": "86f7ac25-739d-4a38-8bf4-4730a8e6cce7", "params": { "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9", "labwareId": "75aa666f-98d8-4af9-908e-963ced428580:opentrons/opentrons_flex_96_tiprack_50ul/1", @@ -2310,19 +2318,22 @@ }, { "commandType": "aspirate", - "key": "79c1655a-54de-4c5d-8b74-3d866244b229", + "key": "0113e27d-0949-4305-8f0b-5467753dfac3", "params": { "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9", "volume": 10, "labwareId": "fe1942b1-1b75-4d3a-9c12-d23004958a12:opentrons/biorad_96_wellplate_200ul_pcr/2", "wellName": "A1", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 6 } }, { "commandType": "moveToAddressableArea", - "key": "e95fefc8-1738-4e24-89ab-e8b27fbde04b", + "key": "79c134c0-5042-4243-8a81-95ad54594ab3", "params": { "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9", "addressableAreaName": "movableTrashA3", @@ -2331,7 +2342,7 @@ }, { "commandType": "dispenseInPlace", - "key": "432061e5-a407-43cc-b703-25882875ae58", + "key": "2ce5b534-62b3-4415-bdd6-747fb57545be", "params": { "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9", "volume": 10, @@ -2340,7 +2351,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "8e2ba800-c7af-451a-b730-0ef9115b970f", + "key": "7212407e-0bd1-4ef5-a8c7-4c6f95cee357", "params": { "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9", "addressableAreaName": "movableTrashA3", @@ -2350,12 +2361,12 @@ }, { "commandType": "dropTipInPlace", - "key": "0cced503-95fa-49fb-8540-2d528819f20d", + "key": "55286f40-e2c1-44f6-a3f3-032bfbf89f3d", "params": { "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9" } }, { "commandType": "configureNozzleLayout", - "key": "48a2d952-d9ad-4ed7-9021-31c97c43b175", + "key": "47ab8f5c-a2dc-40e0-a6db-3c2ff6c48778", "params": { "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9", "configurationParams": { "primaryNozzle": "A12", "style": "COLUMN" } @@ -2363,7 +2374,7 @@ }, { "commandType": "pickUpTip", - "key": "474ddf94-384e-4c01-acbd-50e43c005c7c", + "key": "c6f563fd-4f3f-4bd8-833e-3519c4fb0026", "params": { "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9", "labwareId": "9bd16b50-4ae9-4cfd-8583-3378087e6a6c:opentrons/opentrons_flex_96_tiprack_50ul/1", @@ -2372,19 +2383,22 @@ }, { "commandType": "aspirate", - "key": "1e082d08-89b8-4e5f-b80f-e9190280fad7", + "key": "ee919504-5c21-40c5-9205-00e8aee06718", "params": { "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9", "volume": 10, "labwareId": "fe1942b1-1b75-4d3a-9c12-d23004958a12:opentrons/biorad_96_wellplate_200ul_pcr/2", "wellName": "A7", - "wellLocation": { "origin": "bottom", "offset": { "z": 1 } }, + "wellLocation": { + "origin": "bottom", + "offset": { "z": 1, "x": 0, "y": 0 } + }, "flowRate": 6 } }, { "commandType": "moveToAddressableArea", - "key": "42daf0a1-9c17-4c9a-b8e6-90e68e166d1a", + "key": "6c1dbdec-0d3a-4693-810b-b28984382fce", "params": { "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9", "addressableAreaName": "movableTrashA3", @@ -2393,7 +2407,7 @@ }, { "commandType": "dispenseInPlace", - "key": "6e36d0e4-e975-4cf6-8dd4-24d74f9d60f7", + "key": "d7ad2bf5-3033-4168-adf4-082306dc5467", "params": { "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9", "volume": 10, @@ -2402,7 +2416,7 @@ }, { "commandType": "moveToAddressableAreaForDropTip", - "key": "918fec4b-1947-49c5-8fe1-af24fef2bf3f", + "key": "9ca4968e-0995-4354-95a1-37964599784f", "params": { "pipetteId": "de7da440-95ec-43e8-8723-851321fbd6f9", "addressableAreaName": "movableTrashA3", @@ -2412,7 +2426,7 @@ }, { "commandType": "dropTipInPlace", - "key": "7b5a5ab4-5dbd-4338-890f-38551bd58c4a", + "key": "548bbf90-da13-4487-a878-dd363b17d906", "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 062052ea9d6..76074bc8e3b 100644 --- a/protocol-designer/src/components/BatchEditForm/BatchEditMix.tsx +++ b/protocol-designer/src/components/BatchEditForm/BatchEditMix.tsx @@ -88,7 +88,10 @@ export const BatchEditMix = (props: BatchEditMixProps): JSX.Element => { tiprack={propsForFields.tipRack.value} /> { className={styles.small_field} > { /> {tipPositionFieldName && ( )} diff --git a/protocol-designer/src/components/StepEditForm/fields/TipPositionField/TipPositionAllViz.tsx b/protocol-designer/src/components/StepEditForm/fields/TipPositionField/TipPositionAllViz.tsx new file mode 100644 index 00000000000..d1b219b04d8 --- /dev/null +++ b/protocol-designer/src/components/StepEditForm/fields/TipPositionField/TipPositionAllViz.tsx @@ -0,0 +1,52 @@ +import * as React from 'react' +import round from 'lodash/round' + +import PIPETTE_TIP_IMAGE from '../../../../images/pipette_tip.svg' +import WELL_CROSS_SECTION_IMAGE from '../../../../images/well_cross_section.svg' + +import styles from './TipPositionInput.module.css' + +const WELL_HEIGHT_PIXELS = 145 +const WELL_WIDTH_PIXELS = 100 +const PIXEL_DECIMALS = 2 + +interface TipPositionAllVizProps { + mmFromBottom: number + xPosition: number + wellDepthMm: number + xWidthMm: number +} + +export function TipPositionAllViz(props: TipPositionAllVizProps): JSX.Element { + const { mmFromBottom, xPosition, wellDepthMm, xWidthMm } = props + const fractionOfWellHeight = mmFromBottom / wellDepthMm + const pixelsFromBottom = + Number(fractionOfWellHeight) * WELL_HEIGHT_PIXELS - WELL_HEIGHT_PIXELS + const roundedPixelsFromBottom = round(pixelsFromBottom, PIXEL_DECIMALS) + const bottomPx = wellDepthMm + ? roundedPixelsFromBottom + : mmFromBottom - WELL_HEIGHT_PIXELS + + const xPx = (WELL_WIDTH_PIXELS / xWidthMm) * xPosition + const roundedXPx = round(xPx, PIXEL_DECIMALS) + return ( +
+ + + {props.wellDepthMm !== null && ( + {props.wellDepthMm}mm + )} + +
+ ) +} diff --git a/protocol-designer/src/components/StepEditForm/fields/TipPositionField/TipPositionInput.module.css b/protocol-designer/src/components/StepEditForm/fields/TipPositionField/TipPositionInput.module.css index 181c6ae6f0d..36818a42e4b 100644 --- a/protocol-designer/src/components/StepEditForm/fields/TipPositionField/TipPositionInput.module.css +++ b/protocol-designer/src/components/StepEditForm/fields/TipPositionField/TipPositionInput.module.css @@ -11,7 +11,7 @@ display: flex; flex-direction: row; justify-content: space-between; - margin: 3rem 0 2rem; + margin: 1rem 0 2rem; } .position_from_bottom_input { @@ -65,3 +65,14 @@ position: relative; left: 9px; } + +.tip_position_icon { + height: 1.5rem; + width: 1.5rem; + cursor: pointer; + color: #24313f; /* black80 */ +} + +.tip_position_icon:hover { + background-color: #e6e6e6; +} diff --git a/protocol-designer/src/components/StepEditForm/fields/TipPositionField/TipPositionModal.tsx b/protocol-designer/src/components/StepEditForm/fields/TipPositionField/TipPositionModal.tsx index b2417810488..0d79a39ae9a 100644 --- a/protocol-designer/src/components/StepEditForm/fields/TipPositionField/TipPositionModal.tsx +++ b/protocol-designer/src/components/StepEditForm/fields/TipPositionField/TipPositionModal.tsx @@ -2,107 +2,84 @@ import * as React from 'react' import { createPortal } from 'react-dom' import cx from 'classnames' import { useTranslation } from 'react-i18next' -import round from 'lodash/round' import { AlertModal, + DIRECTION_COLUMN, Flex, - HandleKeypress, - Icon, InputField, - OutlineButton, RadioGroup, + SPACING, + StyledText, } from '@opentrons/components' import { getMainPagePortalEl } from '../../../portals/MainPageModalPortal' import modalStyles from '../../../modals/modal.module.css' import { getIsTouchTipField } from '../../../../form-types' -import { TipPositionZAxisViz } from './TipPositionZAxisViz' +import { TOO_MANY_DECIMALS } from './constants' +import { TipPositionAllViz } from './TipPositionAllViz' import styles from './TipPositionInput.module.css' import * as utils from './utils' -import type { StepFieldName } from '../../../../form-types' -const SMALL_STEP_MM = 1 -const LARGE_STEP_MM = 10 -const DECIMALS_ALLOWED = 1 +import type { StepFieldName } from '../../../../form-types' -interface Props { - closeModal: () => unknown - isIndeterminate?: boolean - mmFromBottom: number | null +type Offset = 'x' | 'y' | 'z' +interface PositionSpec { name: StepFieldName - updateValue: (val: number | null | undefined) => unknown - wellDepthMm: number + value: number | null + updateValue: (val?: number | null) => void } +export type PositionSpecs = Record -const roundValue = (value: number | string | null): number => { - return round(Number(value), DECIMALS_ALLOWED) -} - -const TOO_MANY_DECIMALS: 'TOO_MANY_DECIMALS' = 'TOO_MANY_DECIMALS' -const OUT_OF_BOUNDS: 'OUT_OF_BOUNDS' = 'OUT_OF_BOUNDS' -type Error = typeof TOO_MANY_DECIMALS | typeof OUT_OF_BOUNDS - -const getErrorText = (args: { - errors: Error[] - maxMmFromBottom: number - minMmFromBottom: number - isPristine: boolean - t: any -}): string | null => { - const { errors, minMmFromBottom, maxMmFromBottom, isPristine, t } = args - - if (errors.includes(TOO_MANY_DECIMALS)) { - return t('tip_position.errors.TOO_MANY_DECIMALS') - } else if (!isPristine && errors.includes(OUT_OF_BOUNDS)) { - return t('tip_position.errors.OUT_OF_BOUNDS', { - minMmFromBottom, - maxMmFromBottom, - }) - } else { - return null - } +interface TipPositionModalProps { + closeModal: () => void + specs: PositionSpecs + wellDepthMm: number + wellXWidthMm: number + wellYWidthMm: number + isIndeterminate?: boolean } -const getErrors = (args: { - isDefault: boolean - value: string | null - maxMmFromBottom: number - minMmFromBottom: number -}): Error[] => { - const { isDefault, value, maxMmFromBottom, minMmFromBottom } = args - const errors: Error[] = [] - if (isDefault) return errors +export const TipPositionModal = ( + props: TipPositionModalProps +): JSX.Element | null => { + const { + isIndeterminate, + specs, + wellDepthMm, + wellXWidthMm, + wellYWidthMm, + closeModal, + } = props + const zSpec = specs.z + const ySpec = specs.y + const xSpec = specs.x - const v = Number(value) - if (value === null || Number.isNaN(v)) { - // blank or otherwise invalid should show this error as a fallback - return [OUT_OF_BOUNDS] - } - const correctDecimals = round(v, DECIMALS_ALLOWED) === v - const outOfBounds = v > maxMmFromBottom || v < minMmFromBottom + const { t } = useTranslation(['modal', 'button']) - if (!correctDecimals) { - errors.push(TOO_MANY_DECIMALS) + if (zSpec == null || xSpec == null || ySpec == null) { + console.error('expected to find specs for the zPosition but could not') } - if (outOfBounds) { - errors.push(OUT_OF_BOUNDS) - } - return errors -} -export const TipPositionModal = (props: Props): JSX.Element => { - const { isIndeterminate, name, wellDepthMm } = props - const { t } = useTranslation(['modal', 'button']) const defaultMmFromBottom = utils.getDefaultMmFromBottom({ - name, + name: zSpec.name, wellDepthMm, }) - const [value, setValue] = React.useState( - props.mmFromBottom === null ? null : String(props.mmFromBottom) + const [zValue, setZValue] = React.useState( + zSpec?.value == null ? null : String(zSpec?.value) + ) + const [yValue, setYValue] = React.useState( + ySpec?.value == null ? null : String(ySpec?.value) ) + const [xValue, setXValue] = React.useState( + xSpec?.value == null ? null : String(xSpec?.value) + ) + const [isDefault, setIsDefault] = React.useState( - !isIndeterminate && props.mmFromBottom === null + !isIndeterminate && + zSpec.value === null && + ySpec.value === 0 && + xSpec.value === 0 ) // in this modal, pristinity hides the OUT_OF_BOUNDS error only. const [isPristine, setPristine] = React.useState(true) @@ -111,54 +88,78 @@ export const TipPositionModal = (props: Props): JSX.Element => { maxMmFromBottom: number minMmFromBottom: number } => { - if (getIsTouchTipField(name)) { + if (getIsTouchTipField(zSpec?.name ?? '')) { return { - maxMmFromBottom: roundValue(wellDepthMm), - minMmFromBottom: roundValue(wellDepthMm / 2), + maxMmFromBottom: utils.roundValue(wellDepthMm), + minMmFromBottom: utils.roundValue(wellDepthMm / 2), } } return { - maxMmFromBottom: roundValue(wellDepthMm * 2), + maxMmFromBottom: utils.roundValue(wellDepthMm * 2), minMmFromBottom: 0, } } + const { maxMmFromBottom, minMmFromBottom } = getMinMaxMmFromBottom() - const errors = getErrors({ - isDefault, - minMmFromBottom, - maxMmFromBottom, - value, - }) - const hasErrors = errors.length > 0 + const { minValue: yMinWidth, maxValue: yMaxWidth } = utils.getMinMaxWidth( + wellYWidthMm + ) + const { minValue: xMinWidth, maxValue: xMaxWidth } = utils.getMinMaxWidth( + wellXWidthMm + ) + + const createErrors = ( + value: string | null, + min: number, + max: number + ): utils.Error[] => { + return utils.getErrors({ isDefault, minMm: min, maxMm: max, value }) + } + const zErrors = createErrors(zValue, minMmFromBottom, maxMmFromBottom) + const xErrors = createErrors(xValue, xMinWidth, xMaxWidth) + const yErrors = createErrors(yValue, yMinWidth, yMaxWidth) + + const hasErrors = + zErrors.length > 0 || xErrors.length > 0 || yErrors.length > 0 const hasVisibleErrors = isPristine - ? errors.includes(TOO_MANY_DECIMALS) + ? zErrors.includes(TOO_MANY_DECIMALS) || + xErrors.includes(TOO_MANY_DECIMALS) || + yErrors.includes(TOO_MANY_DECIMALS) : hasErrors - const errorText = getErrorText({ - errors, - maxMmFromBottom, - minMmFromBottom, - isPristine, - t, - }) + + const createErrorText = ( + errors: utils.Error[], + min: number, + max: number + ): string | null => { + return utils.getErrorText({ errors, minMm: min, maxMm: max, isPristine, t }) + } + + const zErrorText = createErrorText(zErrors, minMmFromBottom, maxMmFromBottom) + const xErrorText = createErrorText(xErrors, xMinWidth, xMaxWidth) + const yErrorText = createErrorText(yErrors, yMinWidth, yMaxWidth) const handleDone = (): void => { setPristine(false) - if (!hasErrors) { if (isDefault) { - props.updateValue(null) + zSpec?.updateValue(null) + xSpec?.updateValue(0) + ySpec?.updateValue(0) } else { - props.updateValue(value === null ? null : Number(value)) + zSpec?.updateValue(zValue === null ? null : Number(zValue)) + xSpec?.updateValue(xValue === null ? null : Number(xValue)) + ySpec?.updateValue(yValue === null ? null : Number(yValue)) } - props.closeModal() + closeModal() } } const handleCancel = (): void => { - props.closeModal() + closeModal() } - const handleChange = (newValueRaw: string | number): void => { + const handleZChange = (newValueRaw: string | number): void => { // if string, strip non-number characters from string and cast to number const newValue = typeof newValueRaw === 'string' @@ -166,147 +167,177 @@ export const TipPositionModal = (props: Props): JSX.Element => { : String(newValueRaw) if (newValue === '.') { - setValue('0.') + setZValue('0.') } else { - setValue(Number(newValue) >= 0 ? newValue : '0') + setZValue(Number(newValue) >= 0 ? newValue : '0') } } - const handleInputFieldChange = ( + const handleZInputFieldChange = ( e: React.ChangeEvent ): void => { - handleChange(e.currentTarget.value) + handleZChange(e.currentTarget.value) } - const handleIncrementDecrement = (delta: number): void => { - const prevValue = value === null ? defaultMmFromBottom : Number(value) - setIsDefault(false) - handleChange(roundValue(prevValue + delta)) + const handleXChange = (newValueRaw: string | number): void => { + // if string, strip non-number characters from string and cast to number + const newValue = + typeof newValueRaw === 'string' + ? newValueRaw.replace(/[^-.0-9]/g, '') + : String(newValueRaw) + + if (newValue === '.') { + setXValue('0.') + } else { + setXValue(newValue) + } } - const makeHandleIncrement = (step: number): (() => void) => () => { - handleIncrementDecrement(step) + const handleXInputFieldChange = ( + e: React.ChangeEvent + ): void => { + handleXChange(e.currentTarget.value) } - const makeHandleDecrement = (step: number): (() => void) => () => { - handleIncrementDecrement(step * -1) + const handleYChange = (newValueRaw: string | number): void => { + // if string, strip non-number characters from string and cast to number + const newValue = + typeof newValueRaw === 'string' + ? newValueRaw.replace(/[^-.0-9]/g, '') + : String(newValueRaw) + + if (newValue === '.') { + setYValue('0.') + } else { + setYValue(newValue) + } } - const TipPositionInputField = !isDefault && ( - - ) + const handleYInputFieldChange = ( + e: React.ChangeEvent + ): void => { + handleYChange(e.currentTarget.value) + } + + const TipPositionInputField = !isDefault ? ( + + + + {t('tip_position.field_titles.x_position')} + + + + + + {t('tip_position.field_titles.y_position')} + + + + + + {t('tip_position.field_titles.z_position')} + + + + + ) : null // Mix Form's asp/disp tip position field has different default value text - const isMixAspDispField = name === 'mix_mmFromBottom' + const isMixAspDispField = zSpec?.name === 'mix_mmFromBottom' return createPortal( - - -
-

{t('tip_position.title')}

-

{t(`tip_position.body.${name}`)}

-
-
- -
- ) => { - setIsDefault(e.currentTarget.value === 'default') - }} - options={[ - { - name: isMixAspDispField - ? `Aspirate 1mm, Dispense 0.5mm from the bottom (default)` - : `${defaultMmFromBottom} mm from the bottom (default)`, - value: 'default', - }, - { - name: 'Custom', - value: 'custom', - }, - ]} - name="TipPositionOptions" - /> - {TipPositionInputField} -
- -
- {!isDefault && ( -
- - - - - - -
- )} - -
+
+

{t('tip_position.title')}

+

{t(`tip_position.body.${zSpec?.name}`)}

+
+
+ + + ) => { + setIsDefault(e.currentTarget.value === 'default') + }} + options={[ + { + name: isMixAspDispField + ? t('tip_position.radio_button.mix') + : t('tip_position.radio_button.default', { + defaultMmFromBottom, + }), + value: 'default', + }, + { + name: t('tip_position.radio_button.custom'), + value: 'custom', + }, + ]} + name="TipPositionOptions" + /> + {TipPositionInputField} -
- - , + +
+ +
+
+
+
, getMainPagePortalEl() ) } diff --git a/protocol-designer/src/components/StepEditForm/fields/TipPositionField/ZTipPositionModal.tsx b/protocol-designer/src/components/StepEditForm/fields/TipPositionField/ZTipPositionModal.tsx new file mode 100644 index 00000000000..d9437ec820b --- /dev/null +++ b/protocol-designer/src/components/StepEditForm/fields/TipPositionField/ZTipPositionModal.tsx @@ -0,0 +1,260 @@ +import * as React from 'react' +import { createPortal } from 'react-dom' +import cx from 'classnames' +import { useTranslation } from 'react-i18next' +import { + AlertModal, + Flex, + HandleKeypress, + Icon, + InputField, + OutlineButton, + RadioGroup, +} from '@opentrons/components' +import { getMainPagePortalEl } from '../../../portals/MainPageModalPortal' +import { getIsTouchTipField } from '../../../../form-types' +import { TipPositionZAxisViz } from './TipPositionZAxisViz' +import * as utils from './utils' +import { LARGE_STEP_MM, SMALL_STEP_MM, TOO_MANY_DECIMALS } from './constants' + +import type { StepFieldName } from '../../../../form-types' + +import modalStyles from '../../../modals/modal.module.css' +import styles from './TipPositionInput.module.css' + +interface ZTipPositionModalProps { + closeModal: () => void + mmFromBottom: number | null + name: StepFieldName + updateValue: (val?: number | null) => unknown + wellDepthMm: number + isIndeterminate?: boolean +} + +export function ZTipPositionModal(props: ZTipPositionModalProps): JSX.Element { + const { + isIndeterminate, + name, + wellDepthMm, + mmFromBottom, + closeModal, + updateValue, + } = props + const { t } = useTranslation(['modal', 'button']) + const defaultMmFromBottom = utils.getDefaultMmFromBottom({ + name, + wellDepthMm, + }) + + const [value, setValue] = React.useState( + mmFromBottom === null ? null : String(mmFromBottom) + ) + const [isDefault, setIsDefault] = React.useState( + !isIndeterminate && mmFromBottom === null + ) + // in this modal, pristinity hides the OUT_OF_BOUNDS error only. + const [isPristine, setPristine] = React.useState(true) + + const getMinMaxMmFromBottom = (): { + maxMmFromBottom: number + minMmFromBottom: number + } => { + if (getIsTouchTipField(name)) { + return { + maxMmFromBottom: utils.roundValue(wellDepthMm), + minMmFromBottom: utils.roundValue(wellDepthMm / 2), + } + } + return { + maxMmFromBottom: utils.roundValue(wellDepthMm * 2), + minMmFromBottom: 0, + } + } + const { maxMmFromBottom, minMmFromBottom } = getMinMaxMmFromBottom() + const errors = utils.getErrors({ + isDefault, + minMm: minMmFromBottom, + maxMm: maxMmFromBottom, + value, + }) + const hasErrors = errors.length > 0 + const hasVisibleErrors = isPristine + ? errors.includes(TOO_MANY_DECIMALS) + : hasErrors + const errorText = utils.getErrorText({ + errors, + minMm: maxMmFromBottom, + maxMm: minMmFromBottom, + isPristine, + t, + }) + + const handleDone = (): void => { + setPristine(false) + + if (!hasErrors) { + if (isDefault) { + updateValue(null) + } else { + updateValue(value === null ? null : Number(value)) + } + closeModal() + } + } + + const handleCancel = (): void => { + closeModal() + } + + const handleChange = (newValueRaw: string | number): void => { + // if string, strip non-number characters from string and cast to number + const newValue = + typeof newValueRaw === 'string' + ? newValueRaw.replace(/[^.0-9]/, '') + : String(newValueRaw) + + if (newValue === '.') { + setValue('0.') + } else { + setValue(Number(newValue) >= 0 ? newValue : '0') + } + } + + const handleInputFieldChange = ( + e: React.ChangeEvent + ): void => { + handleChange(e.currentTarget.value) + } + + const handleIncrementDecrement = (delta: number): void => { + const prevValue = value === null ? defaultMmFromBottom : Number(value) + setIsDefault(false) + handleChange(utils.roundValue(prevValue + delta)) + } + + const makeHandleIncrement = (step: number): (() => void) => () => { + handleIncrementDecrement(step) + } + + const makeHandleDecrement = (step: number): (() => void) => () => { + handleIncrementDecrement(step * -1) + } + + const TipPositionInputField = !isDefault && ( + + ) + + return createPortal( + + +
+

{t('tip_position.title')}

+

{t(`tip_position.body.${name}`)}

+
+
+ +
+ ) => { + setIsDefault(e.currentTarget.value === 'default') + }} + options={[ + { + name: t('tip_position.radio_button.default', { + defaultMmFromBottom, + }), + value: 'default', + }, + { + name: t('tip_position.radio_button.custom'), + value: 'custom', + }, + ]} + name="TipPositionOptions" + /> + {TipPositionInputField} +
+ +
+ {!isDefault ? ( +
+ + + + + + +
+ ) : null} + +
+
+
+
+
, + getMainPagePortalEl() + ) +} diff --git a/protocol-designer/src/components/StepEditForm/fields/TipPositionField/__tests__/TipPositionField.test.tsx b/protocol-designer/src/components/StepEditForm/fields/TipPositionField/__tests__/TipPositionField.test.tsx new file mode 100644 index 00000000000..36e1d07a0f4 --- /dev/null +++ b/protocol-designer/src/components/StepEditForm/fields/TipPositionField/__tests__/TipPositionField.test.tsx @@ -0,0 +1,113 @@ +import * as React from 'react' +import { fireEvent, screen } from '@testing-library/react' +import { describe, it, expect, vi, beforeEach } from 'vitest' +import { fixture96Plate } from '@opentrons/shared-data' +import { renderWithProviders } from '../../../../../__testing-utils__' +import { i18n } from '../../../../../localization' +import { getLabwareEntities } from '../../../../../step-forms/selectors' +import { ZTipPositionModal } from '../ZTipPositionModal' +import { TipPositionModal } from '../TipPositionModal' +import { TipPositionField } from '../index' +import type { LabwareDefinition2 } from '@opentrons/shared-data' + +vi.mock('../../../../../step-forms/selectors') +vi.mock('../ZTipPositionModal') +vi.mock('../TipPositionModal') +const render = (props: React.ComponentProps) => { + return renderWithProviders(, { + i18nInstance: i18n, + })[0] +} +const mockDelay = 'aspirate_delay_mmFromBottom' +const mockAspirate = 'aspirate_mmFromBottom' +const mockLabwareId = 'mockId' +describe('TipPositionField', () => { + let props: React.ComponentProps + + beforeEach(() => { + props = { + zField: mockDelay, + labwareId: mockLabwareId, + propsForFields: { + [mockDelay]: { + name: mockDelay, + value: null, + updateValue: vi.fn(), + tooltipContent: 'mock content', + isIndeterminate: false, + disabled: false, + } as any, + }, + } + vi.mocked(TipPositionModal).mockReturnValue( +
mock TipPositionModal
+ ) + vi.mocked(ZTipPositionModal).mockReturnValue( +
mock ZTipPositionModal
+ ) + vi.mocked(getLabwareEntities).mockReturnValue({ + [mockLabwareId]: { + id: mockLabwareId, + labwareDefURI: 'mock uri', + def: fixture96Plate as LabwareDefinition2, + }, + }) + }) + it('renders the input field and header when x and y fields are not provided', () => { + render(props) + screen.getByText('mm') + fireEvent.click(screen.getByRole('textbox', { name: '' })) + expect(screen.getByRole('textbox', { name: '' })).not.toBeDisabled() + screen.getByText('mock ZTipPositionModal') + }) + it('renders the input field but it is disabled', () => { + props = { + ...props, + propsForFields: { + [mockDelay]: { + name: mockDelay, + value: null, + updateValue: vi.fn(), + tooltipContent: 'mock content', + isIndeterminate: false, + disabled: true, + } as any, + }, + } + render(props) + expect(screen.getByRole('textbox', { name: '' })).toBeDisabled() + }) + it('renders the icon when x,y, and z fields are provided', () => { + const mockX = 'aspirate_x_position' + const mockY = 'aspirate_y_position' + props = { + zField: mockAspirate, + xField: mockX, + yField: mockY, + labwareId: mockLabwareId, + propsForFields: { + [mockAspirate]: { + name: mockAspirate, + value: null, + updateValue: vi.fn(), + tooltipContent: 'mock content', + isIndeterminate: false, + disabled: false, + } as any, + [mockX]: { + name: mockX, + value: null, + updateValue: vi.fn(), + } as any, + [mockY]: { + name: mockY, + value: null, + updateValue: vi.fn(), + } as any, + }, + } + render(props) + fireEvent.click(screen.getByTestId('TipPositionIcon_aspirate_mmFromBottom')) + screen.getByText('mock TipPositionModal') + }) +}) diff --git a/protocol-designer/src/components/StepEditForm/fields/TipPositionField/__tests__/TipPositionModal.test.tsx b/protocol-designer/src/components/StepEditForm/fields/TipPositionField/__tests__/TipPositionModal.test.tsx new file mode 100644 index 00000000000..5fccf40a480 --- /dev/null +++ b/protocol-designer/src/components/StepEditForm/fields/TipPositionField/__tests__/TipPositionModal.test.tsx @@ -0,0 +1,124 @@ +import * as React from 'react' +import { fireEvent, screen } from '@testing-library/react' +import { describe, it, expect, vi, beforeEach } from 'vitest' +import { renderWithProviders } from '../../../../../__testing-utils__' +import { i18n } from '../../../../../localization' +import { TipPositionModal } from '../TipPositionModal' +import { TipPositionAllViz } from '../TipPositionAllViz' + +vi.mock('../TipPositionAllViz') +const render = (props: React.ComponentProps) => { + return renderWithProviders(, { + i18nInstance: i18n, + })[0] +} + +const mockUpdateZSpec = vi.fn() +const mockUpdateXSpec = vi.fn() +const mockUpdateYSpec = vi.fn() + +describe('TipPositionModal', () => { + let props: React.ComponentProps + + beforeEach(() => { + props = { + closeModal: vi.fn(), + wellDepthMm: 50, + wellXWidthMm: 10.3, + wellYWidthMm: 10.5, + isIndeterminate: false, + specs: { + z: { + name: 'aspirate_mmFromBottom', + value: null, + updateValue: mockUpdateZSpec, + }, + y: { + name: 'aspirate_y_position', + value: 0, + updateValue: mockUpdateXSpec, + }, + x: { + name: 'aspirate_x_position', + value: 0, + updateValue: mockUpdateYSpec, + }, + }, + } + vi.mocked(TipPositionAllViz).mockReturnValue(
mock TipPositionViz
) + }) + it('renders the modal text and radio button text', () => { + render(props) + screen.getByText('Tip Positioning') + screen.getByText('Change from where in the well the robot aspirates') + screen.getByRole('radio', { name: '1 mm from the bottom center (default)' }) + screen.getByRole('radio', { name: 'Custom' }) + fireEvent.click(screen.getByText('cancel')) + expect(props.closeModal).toHaveBeenCalled() + fireEvent.click(screen.getByText('done')) + expect(props.closeModal).toHaveBeenCalled() + expect(mockUpdateXSpec).toHaveBeenCalled() + expect(mockUpdateYSpec).toHaveBeenCalled() + expect(mockUpdateZSpec).toHaveBeenCalled() + }) + it('renders the custom options, captions, and visual', () => { + render(props) + fireEvent.click(screen.getByRole('radio', { name: 'Custom' })) + expect(screen.getAllByRole('textbox', { name: '' })).toHaveLength(3) + screen.getByText('X position') + screen.getByText('between -5.15 and 5.15') + screen.getByText('Y position') + screen.getByText('between -5.25 and 5.25') + screen.getByText('Z position') + screen.getByText('between 0 and 100') + screen.getByText('mock TipPositionViz') + }) + it('renders a custom input field and clicks on it, calling the mock updates', () => { + render(props) + fireEvent.click(screen.getByRole('radio', { name: 'Custom' })) + const xInputField = screen.getAllByRole('textbox', { name: '' })[0] + fireEvent.change(xInputField, { target: { value: 3 } }) + const yInputField = screen.getAllByRole('textbox', { name: '' })[1] + fireEvent.change(yInputField, { target: { value: -2 } }) + const zInputField = screen.getAllByRole('textbox', { name: '' })[2] + fireEvent.change(zInputField, { target: { value: 10 } }) + fireEvent.click(screen.getByText('done')) + expect(props.closeModal).toHaveBeenCalled() + expect(mockUpdateXSpec).toHaveBeenCalled() + expect(mockUpdateYSpec).toHaveBeenCalled() + expect(mockUpdateZSpec).toHaveBeenCalled() + }) + it('renders custom input fields and displays error texts', () => { + props = { + ...props, + specs: { + z: { + name: 'aspirate_mmFromBottom', + value: 101, + updateValue: mockUpdateZSpec, + }, + y: { + name: 'aspirate_y_position', + value: -500, + updateValue: mockUpdateXSpec, + }, + x: { + name: 'aspirate_x_position', + value: 10.7, + updateValue: mockUpdateYSpec, + }, + }, + } + render(props) + fireEvent.click(screen.getByText('done')) + // display out of bounds error + screen.getByText('accepted range is 0 to 100') + screen.getByText('accepted range is -5.25 to 5.25') + screen.getByText('accepted range is -5.15 to 5.15') + const xInputField = screen.getAllByRole('textbox', { name: '' })[0] + fireEvent.change(xInputField, { target: { value: 3.55555 } }) + fireEvent.click(screen.getByText('done')) + // display too many decimals error + screen.getByText('a max of 1 decimal place is allowed') + }) +}) diff --git a/protocol-designer/src/components/StepEditForm/fields/TipPositionField/constants.ts b/protocol-designer/src/components/StepEditForm/fields/TipPositionField/constants.ts new file mode 100644 index 00000000000..c790cb449cc --- /dev/null +++ b/protocol-designer/src/components/StepEditForm/fields/TipPositionField/constants.ts @@ -0,0 +1,4 @@ +export const DECIMALS_ALLOWED = 1 +export const SMALL_STEP_MM = 1 +export const LARGE_STEP_MM = 10 +export const TOO_MANY_DECIMALS: 'TOO_MANY_DECIMALS' = 'TOO_MANY_DECIMALS' diff --git a/protocol-designer/src/components/StepEditForm/fields/TipPositionField/index.tsx b/protocol-designer/src/components/StepEditForm/fields/TipPositionField/index.tsx index ccaa80e13d5..91ececa71c8 100644 --- a/protocol-designer/src/components/StepEditForm/fields/TipPositionField/index.tsx +++ b/protocol-designer/src/components/StepEditForm/fields/TipPositionField/index.tsx @@ -2,13 +2,16 @@ import * as React from 'react' import { useTranslation } from 'react-i18next' import { useSelector } from 'react-redux' import { + COLORS, + Flex, FormGroup, + Icon, InputField, Tooltip, useHoverTooltip, UseHoverTooltipTargetProps, } from '@opentrons/components' -import { getWellsDepth } from '@opentrons/shared-data' +import { getWellsDepth, getWellDimension } from '@opentrons/shared-data' import { getIsTouchTipField, getIsDelayPositionField, @@ -16,28 +19,40 @@ import { import { selectors as stepFormSelectors } from '../../../../step-forms' import { TipPositionModal } from './TipPositionModal' import { getDefaultMmFromBottom } from './utils' +import { ZTipPositionModal } from './ZTipPositionModal' +import type { + TipXOffsetFields, + TipYOffsetFields, + TipZOffsetFields, +} from '../../../../form-types' +import type { FieldPropsByName } from '../../types' +import type { PositionSpecs } from './TipPositionModal' + import stepFormStyles from '../../StepEditForm.module.css' import styles from './TipPositionInput.module.css' -import type { FieldProps } from '../../types' -interface TipPositionFieldProps extends FieldProps { +interface TipPositionFieldProps { + propsForFields: FieldPropsByName + zField: TipZOffsetFields + xField?: TipXOffsetFields + yField?: TipYOffsetFields labwareId?: string | null - className?: string } export function TipPositionField(props: TipPositionFieldProps): JSX.Element { + const { labwareId, propsForFields, zField, xField, yField } = props const { - disabled, - name, + name: zName, + value: rawZValue, + updateValue: zUpdateValue, tooltipContent, - updateValue, isIndeterminate, - labwareId, - value: rawValue, - } = props + disabled, + } = propsForFields[zField] + const { t } = useTranslation('application') const [targetProps, tooltipProps] = useHoverTooltip() - const [isModalOpen, setModalOpen] = React.useState(false) + const [isModalOpen, setModalOpen] = React.useState(false) const labwareEntities = useSelector(stepFormSelectors.getLabwareEntities) const labwareDef = labwareId != null && labwareEntities[labwareId] != null @@ -45,68 +60,137 @@ export function TipPositionField(props: TipPositionFieldProps): JSX.Element { : null let wellDepthMm = 0 + let wellXWidthMm = 0 + let wellYWidthMm = 0 + if (labwareDef != null) { - // NOTE: only taking depth of first well in labware def, UI not currently equipped for multiple depths + // NOTE: only taking depth of first well in labware def, UI not currently equipped for multiple depths/widths const firstWell = labwareDef.wells.A1 if (firstWell) { wellDepthMm = getWellsDepth(labwareDef, ['A1']) + wellXWidthMm = getWellDimension(labwareDef, ['A1'], 'x') + wellYWidthMm = getWellDimension(labwareDef, ['A1'], 'y') } } - if (wellDepthMm === 0 && labwareId != null && labwareDef != null) { + if ( + (wellDepthMm === 0 || wellXWidthMm === 0 || wellYWidthMm === 0) && + labwareId != null && + labwareDef != null + ) { console.error( - `expected to find the well depth mm with labwareId ${labwareId} but could not` + `expected to find all well dimensions mm with labwareId ${labwareId} but could not` ) } - const handleOpen = (): void => { - if (wellDepthMm) { + const handleOpen = (has3Specs: boolean): void => { + if (has3Specs && wellDepthMm && wellXWidthMm && wellYWidthMm) { + setModalOpen(true) + } + if (!has3Specs && wellDepthMm) { setModalOpen(true) } } const handleClose = (): void => { setModalOpen(false) } - const isTouchTipField = getIsTouchTipField(name) - const isDelayPositionField = getIsDelayPositionField(name) - let value: string | number = '0' - const mmFromBottom = typeof rawValue === 'number' ? rawValue : null + const isTouchTipField = getIsTouchTipField(zName) + const isDelayPositionField = getIsDelayPositionField(zName) + let zValue: string | number = '0' + const mmFromBottom = typeof rawZValue === 'number' ? rawZValue : null if (wellDepthMm !== null) { // show default value for field in parens if no mmFromBottom value is selected - value = - mmFromBottom !== null - ? mmFromBottom - : getDefaultMmFromBottom({ name, wellDepthMm }) + zValue = + mmFromBottom ?? getDefaultMmFromBottom({ name: zName, wellDepthMm }) } + + let modal = ( + + ) + if (yField != null && xField != null) { + const { + name: xName, + value: rawXValue, + updateValue: xUpdateValue, + } = propsForFields[xField] + const { + name: yName, + value: rawYValue, + updateValue: yUpdateValue, + } = propsForFields[yField] + + const specs: PositionSpecs = { + z: { + name: zName, + value: mmFromBottom, + updateValue: zUpdateValue, + }, + x: { + name: xName, + value: rawXValue != null ? Number(rawXValue) : null, + updateValue: xUpdateValue, + }, + y: { + name: yName, + value: rawYValue != null ? Number(rawYValue) : null, + updateValue: yUpdateValue, + }, + } + + modal = ( + + ) + } + return ( <> {tooltipContent} - {isModalOpen && ( - - )} + {isModalOpen ? modal : null} - + {yField != null && xField != null ? ( + handleOpen(true) : () => {}} + id={`TipPositionIcon_${zName}`} + data-testid={`TipPositionIcon_${zName}`} + width="5rem" + > + + + ) : ( + handleOpen(false)} + value={String(zValue)} + isIndeterminate={isIndeterminate} + units={t('units.millimeter')} + id={`TipPositionField_${zName}`} + /> + )} ) diff --git a/protocol-designer/src/components/StepEditForm/fields/TipPositionField/utils.ts b/protocol-designer/src/components/StepEditForm/fields/TipPositionField/utils.ts index c4d4590c5dc..96ed4729d49 100644 --- a/protocol-designer/src/components/StepEditForm/fields/TipPositionField/utils.ts +++ b/protocol-designer/src/components/StepEditForm/fields/TipPositionField/utils.ts @@ -1,9 +1,13 @@ +import round from 'lodash/round' +import { getIsTouchTipField } from '../../../../form-types' import { DEFAULT_MM_FROM_BOTTOM_ASPIRATE, DEFAULT_MM_FROM_BOTTOM_DISPENSE, DEFAULT_MM_TOUCH_TIP_OFFSET_FROM_TOP, } from '../../../../constants' -import { StepFieldName, getIsTouchTipField } from '../../../../form-types' +import { DECIMALS_ALLOWED, TOO_MANY_DECIMALS } from './constants' +import type { StepFieldName } from '../../../../form-types' + // TODO: Ian + Brian 2019-02-13 this should switch on stepType, not use field // name to infer step type! // @@ -41,3 +45,70 @@ export function getDefaultMmFromBottom(args: { return DEFAULT_MM_TOUCH_TIP_OFFSET_FROM_TOP + wellDepthMm } } + +export const roundValue = (value: number | string | null): number => { + return value === null ? 0 : round(Number(value), DECIMALS_ALLOWED) +} + +const OUT_OF_BOUNDS: 'OUT_OF_BOUNDS' = 'OUT_OF_BOUNDS' +export type Error = typeof TOO_MANY_DECIMALS | typeof OUT_OF_BOUNDS + +export const getErrorText = (args: { + errors: Error[] + maxMm: number + minMm: number + isPristine: boolean + t: any +}): string | null => { + const { errors, minMm, maxMm, isPristine, t } = args + + if (errors.includes(TOO_MANY_DECIMALS)) { + return t('tip_position.errors.TOO_MANY_DECIMALS') + } else if (!isPristine && errors.includes(OUT_OF_BOUNDS)) { + return t('tip_position.errors.OUT_OF_BOUNDS', { + minMm, + maxMm, + }) + } else { + return null + } +} + +export const getErrors = (args: { + isDefault: boolean + value: string | null + maxMm: number + minMm: number +}): Error[] => { + const { isDefault, value: rawValue, maxMm, minMm } = args + const errors: Error[] = [] + if (isDefault) return errors + + const value = Number(rawValue) + if (rawValue === null || Number.isNaN(value)) { + // blank or otherwise invalid should show this error as a fallback + return [OUT_OF_BOUNDS] + } + const incorrectDecimals = round(value, DECIMALS_ALLOWED) !== value + const outOfBounds = value > maxMm || value < minMm + + if (incorrectDecimals) { + errors.push(TOO_MANY_DECIMALS) + } + if (outOfBounds) { + errors.push(OUT_OF_BOUNDS) + } + return errors +} + +interface MinMaxValues { + minValue: number + maxValue: number +} + +export const getMinMaxWidth = (width: number): MinMaxValues => { + return { + minValue: -width * 0.5, + maxValue: width * 0.5, + } +} diff --git a/protocol-designer/src/components/StepEditForm/forms/MixForm.tsx b/protocol-designer/src/components/StepEditForm/forms/MixForm.tsx index 87cfdbcd49b..7b5f8fb9503 100644 --- a/protocol-designer/src/components/StepEditForm/forms/MixForm.tsx +++ b/protocol-designer/src/components/StepEditForm/forms/MixForm.tsx @@ -117,7 +117,10 @@ export const MixForm = (props: StepFormProps): JSX.Element => { tiprack={propsForFields.tipRack.value} /> { label={t('form:step_edit_form.field.touchTip.label')} > { tiprack={propsForFields.tipRack.value} /> { className={styles.small_field} > form.stepType === 'moveLiquid' || form.stepType === 'mix' ) - const pipettingSavedStepsWithTipRack = pipettingSavedSteps.reduce( + const pipettingSavedStepsWithAdditionalFields = pipettingSavedSteps.reduce( (acc, item) => { const tipRackUri = tiprackAssignments[item.pipette] const tiprackLoadName = @@ -67,8 +67,16 @@ export const migrateFile = ( const tiprackIds = loadLabwareCommands .filter(command => command.params.loadName === tiprackLoadName) .map(command => command.params.labwareId) - - acc[item.id] = { ...item, tipRack: tiprackIds[0] } + const xyKeys = + item.stepType === 'mix' + ? { mix_x_position: 0, mix_y_position: 0 } + : { + aspirate_x_position: 0, + aspirate_y_position: 0, + dispense_x_position: 0, + dispense_y_position: 0, + } + acc[item.id] = { ...item, tipRack: tiprackIds[0], ...xyKeys } return acc }, {} @@ -82,7 +90,7 @@ export const migrateFile = ( ...designerApplication.data, savedStepForms: { ...designerApplication.data.savedStepForms, - ...pipettingSavedStepsWithTipRack, + ...pipettingSavedStepsWithAdditionalFields, }, pipetteTiprackAssignments: newTiprackAssignments, }, diff --git a/protocol-designer/src/localization/en/modal.json b/protocol-designer/src/localization/en/modal.json index edceb80718f..03e92e5ea55 100644 --- a/protocol-designer/src/localization/en/modal.json +++ b/protocol-designer/src/localization/en/modal.json @@ -61,6 +61,12 @@ }, "tip_position": { "title": "Tip Positioning", + "caption": "between {{min}} and {{max}}", + "radio_button": { + "default": "{{defaultMmFromBottom}} mm from the bottom center (default)", + "mix": "Aspirate 1mm, Dispense 0.5mm from the bottom center (default)", + "custom": "Custom" + }, "body": { "aspirate_mmFromBottom": "Change from where in the well the robot aspirates", "dispense_mmFromBottom": "Change from where in the well the robot dispenses", @@ -71,9 +77,14 @@ "aspirate_delay_mmFromBottom": "Change from where in the well the robot delays after aspirating", "dispense_delay_mmFromBottom": "Change from where in the well the robot delays after dispensing" }, + "field_titles": { + "z_position": "Z position", + "x_position": "X position", + "y_position": "Y position" + }, "errors": { "TOO_MANY_DECIMALS": "a max of 1 decimal place is allowed", - "OUT_OF_BOUNDS": "accepted range is {{minMmFromBottom}} to {{maxMmFromBottom}}" + "OUT_OF_BOUNDS": "accepted range is {{minMm}} to {{maxMm}}" }, "field_label": "Distance from bottom of well" }, diff --git a/protocol-designer/src/localization/en/tooltip.json b/protocol-designer/src/localization/en/tooltip.json index 59d2f32d1c9..7aa0031b76e 100644 --- a/protocol-designer/src/localization/en/tooltip.json +++ b/protocol-designer/src/localization/en/tooltip.json @@ -26,7 +26,7 @@ "aspirate_delay_mmFromBottom": "Distance from the bottom of the well", "aspirate_flowRate": "The speed at which the pipette aspirates", "aspirate_mix_checkbox": "Pipette up and down before aspirating", - "aspirate_mmFromBottom": "Distance from the bottom of the well", + "aspirate_mmFromBottom": "Adjust tip position for aspirate", "aspirate_touchTip_checkbox": "Touch tip to each side of well after aspirating", "aspirate_touchTip_mmFromBottom": "Distance from the bottom of the well", "blowout_checkbox": "Where to dispose of remaining volume in tip", @@ -37,12 +37,12 @@ "dispense_delay_mmFromBottom": "Distance from the bottom of the well", "dispense_flowRate": "The speed at which the pipette dispenses", "dispense_mix_checkbox": "Pipette up and down after dispensing", - "dispense_mmFromBottom": "Distance from the bottom of the well", + "dispense_mmFromBottom": "Adjust tip position for dispense", "dispense_touchTip_checkbox": "Touch tip to each side of well after dispensing", "dispense_touchTip_mmFromBottom": "Distance from the bottom of the well", "disposalVolume_checkbox": "Aspirate extra volume that is disposed of after a multi-dispense is complete. We recommend a disposal volume of at least the pipette's minimum.", "heaterShakerSetTimer": "Once this counter has elapsed, the module will deactivate the heater and shaker", - "mix_mmFromBottom": "Distance from the bottom of the well", + "mix_mmFromBottom": "Adjust tip position", "mix_touchTip_checkbox": "Touch tip to each side of the well after mixing", "mix_touchTip_mmFromBottom": "Distance from the bottom of the well", "preWetTip": "Pre-wet pipette tip by aspirating and dispensing 2/3 of the tip's max volume", @@ -67,7 +67,9 @@ "aspirate_touchTip_checkbox": "Touch tip is not supported", "blowout_checkbox": "Redundant with disposal volume", "dispense_mix_checkbox": "Unable to mix in a waste chute or trash bin", + "aspirate_mmFromBottom": "Tip position adjustment is not supported", "dispense_mmFromBottom": "Tip position adjustment is not supported", + "mix_mmFromBottom": "Tip position adjustment is not supported", "dispense_touchTip_checkbox": "Touch tip is not supported" } }, diff --git a/protocol-designer/src/step-forms/test/createPresavedStepForm.test.ts b/protocol-designer/src/step-forms/test/createPresavedStepForm.test.ts index 526c4c784b1..c440c25a0e5 100644 --- a/protocol-designer/src/step-forms/test/createPresavedStepForm.test.ts +++ b/protocol-designer/src/step-forms/test/createPresavedStepForm.test.ts @@ -187,6 +187,10 @@ describe('createPresavedStepForm', () => { stepDetails: '', stepName: 'transfer', volume: null, + aspirate_x_position: 0, + aspirate_y_position: 0, + dispense_x_position: 0, + dispense_y_position: 0, }) }) describe('mix step', () => { @@ -210,6 +214,8 @@ describe('createPresavedStepForm', () => { mix_wellOrder_first: 't2b', mix_wellOrder_second: 'l2r', blowout_checkbox: false, + mix_x_position: 0, + mix_y_position: 0, blowout_location: null, changeTip: 'always', stepDetails: '', diff --git a/protocol-designer/src/steplist/formLevel/getDefaultsForStepType.ts b/protocol-designer/src/steplist/formLevel/getDefaultsForStepType.ts index 66656441dd1..25442fac9af 100644 --- a/protocol-designer/src/steplist/formLevel/getDefaultsForStepType.ts +++ b/protocol-designer/src/steplist/formLevel/getDefaultsForStepType.ts @@ -37,6 +37,8 @@ export function getDefaultsForStepType( dropTip_location: null, nozzles: null, tipRack: null, + mix_x_position: 0, + mix_y_position: 0, } case 'moveLiquid': @@ -86,6 +88,10 @@ export function getDefaultsForStepType( dispense_delay_mmFromBottom: null, dropTip_location: null, nozzles: null, + dispense_x_position: 0, + dispense_y_position: 0, + aspirate_x_position: 0, + aspirate_y_position: 0, } case 'moveLabware': diff --git a/protocol-designer/src/steplist/formLevel/stepFormToArgs/mixFormToArgs.ts b/protocol-designer/src/steplist/formLevel/stepFormToArgs/mixFormToArgs.ts index 741355f95a0..d9d4936b71e 100644 --- a/protocol-designer/src/steplist/formLevel/stepFormToArgs/mixFormToArgs.ts +++ b/protocol-designer/src/steplist/formLevel/stepFormToArgs/mixFormToArgs.ts @@ -15,7 +15,14 @@ type MixStepArgs = MixArgs export const mixFormToArgs = ( hydratedFormData: HydratedMixFormDataLegacy ): MixStepArgs => { - const { labware, pipette, dropTip_location, nozzles } = hydratedFormData + const { + labware, + pipette, + dropTip_location, + nozzles, + mix_x_position, + mix_y_position, + } = hydratedFormData const matchingTipLiquidSpecs = getMatchingTipLiquidSpecs( pipette, hydratedFormData.volume, @@ -105,5 +112,9 @@ export const mixFormToArgs = ( dispenseDelaySeconds, dropTipLocation: dropTip_location, nozzles, + aspirateXOffset: mix_x_position ?? 0, + dispenseXOffset: mix_x_position ?? 0, + aspirateYOffset: mix_y_position ?? 0, + dispenseYOffset: mix_y_position ?? 0, } } diff --git a/protocol-designer/src/steplist/formLevel/stepFormToArgs/moveLiquidFormToArgs.ts b/protocol-designer/src/steplist/formLevel/stepFormToArgs/moveLiquidFormToArgs.ts index 7d330f54dbf..4b3023fdad3 100644 --- a/protocol-designer/src/steplist/formLevel/stepFormToArgs/moveLiquidFormToArgs.ts +++ b/protocol-designer/src/steplist/formLevel/stepFormToArgs/moveLiquidFormToArgs.ts @@ -78,6 +78,10 @@ export const moveLiquidFormToArgs = ( path, tipRack, nozzles, + aspirate_x_position, + dispense_x_position, + aspirate_y_position, + dispense_y_position, } = fields let sourceWells = getOrderedWells( fields.aspirate_wells, @@ -211,6 +215,10 @@ export const moveLiquidFormToArgs = ( name: hydratedFormData.stepName, dropTipLocation, nozzles, + aspirateXOffset: aspirate_x_position ?? 0, + aspirateYOffset: aspirate_y_position ?? 0, + dispenseXOffset: dispense_x_position ?? 0, + dispenseYOffset: dispense_y_position ?? 0, } console.assert( sourceWellsUnordered.length > 0, diff --git a/protocol-designer/src/steplist/formLevel/test/getDefaultsForStepType.test.ts b/protocol-designer/src/steplist/formLevel/test/getDefaultsForStepType.test.ts index 84803e31a74..cf0b72b84b0 100644 --- a/protocol-designer/src/steplist/formLevel/test/getDefaultsForStepType.test.ts +++ b/protocol-designer/src/steplist/formLevel/test/getDefaultsForStepType.test.ts @@ -59,13 +59,16 @@ describe('getDefaultsForStepType', () => { aspirate_delay_checkbox: false, aspirate_delay_mmFromBottom: null, aspirate_delay_seconds: `${DEFAULT_DELAY_SECONDS}`, - + aspirate_x_position: 0, + aspirate_y_position: 0, dispense_airGap_checkbox: false, dispense_airGap_volume: null, dispense_delay_checkbox: false, dispense_delay_seconds: `${DEFAULT_DELAY_SECONDS}`, dispense_delay_mmFromBottom: null, tipRack: null, + dispense_x_position: 0, + dispense_y_position: 0, }) }) }) @@ -94,6 +97,8 @@ describe('getDefaultsForStepType', () => { aspirate_flowRate: null, dispense_flowRate: null, tipRack: null, + mix_x_position: 0, + mix_y_position: 0, }) }) }) diff --git a/protocol-designer/src/timelineMiddleware/__tests__/generateRobotStateTimeline.test.ts b/protocol-designer/src/timelineMiddleware/__tests__/generateRobotStateTimeline.test.ts index ede96f0be52..1717dc838cb 100644 --- a/protocol-designer/src/timelineMiddleware/__tests__/generateRobotStateTimeline.test.ts +++ b/protocol-designer/src/timelineMiddleware/__tests__/generateRobotStateTimeline.test.ts @@ -50,6 +50,10 @@ describe('generateRobotStateTimeline', () => { description: null, nozzles: null, tipRack: 'tiprack1Id', + aspirateXOffset: 0, + aspirateYOffset: 0, + dispenseXOffset: 0, + dispenseYOffset: 0, }, }, b: { @@ -86,6 +90,10 @@ describe('generateRobotStateTimeline', () => { description: null, nozzles: null, tipRack: 'tiprack1Id', + aspirateXOffset: 0, + aspirateYOffset: 0, + dispenseXOffset: 0, + dispenseYOffset: 0, }, }, c: { @@ -114,6 +122,10 @@ describe('generateRobotStateTimeline', () => { dispenseDelaySeconds: null, nozzles: null, tipRack: 'tiprack1Id', + aspirateXOffset: 0, + aspirateYOffset: 0, + dispenseXOffset: 0, + dispenseYOffset: 0, }, }, } diff --git a/protocol-designer/src/ui/steps/test/selectors.test.ts b/protocol-designer/src/ui/steps/test/selectors.test.ts index 5cf64a59160..7cfa25c5e22 100644 --- a/protocol-designer/src/ui/steps/test/selectors.test.ts +++ b/protocol-designer/src/ui/steps/test/selectors.test.ts @@ -418,10 +418,23 @@ describe('_getSavedMultiSelectFieldValues', () => { isIndeterminate: false, value: undefined, }, + aspirate_labware: { value: 'aspirate_labware_id', isIndeterminate: false, }, + aspirate_x_position: { + isIndeterminate: false, + }, + aspirate_y_position: { + isIndeterminate: false, + }, + dispense_x_position: { + isIndeterminate: false, + }, + dispense_y_position: { + isIndeterminate: false, + }, aspirate_wells: { isIndeterminate: true, }, @@ -669,6 +682,18 @@ describe('_getSavedMultiSelectFieldValues', () => { path: { isIndeterminate: true, }, + aspirate_x_position: { + isIndeterminate: false, + }, + aspirate_y_position: { + isIndeterminate: false, + }, + dispense_x_position: { + isIndeterminate: false, + }, + dispense_y_position: { + isIndeterminate: false, + }, preWetTip: { isIndeterminate: true, }, @@ -850,6 +875,12 @@ describe('_getSavedMultiSelectFieldValues', () => { mix_touchTip_checkbox: { value: false, isIndeterminate: false }, mix_touchTip_mmFromBottom: { value: null, isIndeterminate: false }, nozzles: { value: undefined, isIndeterminate: false }, + mix_x_position: { + isIndeterminate: false, + }, + mix_y_position: { + isIndeterminate: false, + }, dropTip_location: { value: 'fixedTrash', isIndeterminate: false, @@ -920,6 +951,12 @@ describe('_getSavedMultiSelectFieldValues', () => { mix_touchTip_checkbox: { isIndeterminate: true }, mix_touchTip_mmFromBottom: { isIndeterminate: true }, nozzles: { isIndeterminate: true }, + mix_x_position: { + isIndeterminate: false, + }, + mix_y_position: { + isIndeterminate: false, + }, dropTip_location: { value: 'fixedTrash', isIndeterminate: false, diff --git a/shared-data/js/helpers/index.ts b/shared-data/js/helpers/index.ts index a65a83085de..b996606f6e8 100644 --- a/shared-data/js/helpers/index.ts +++ b/shared-data/js/helpers/index.ts @@ -202,6 +202,23 @@ export const getWellsDepth = ( return offsets[0] } +export const getWellDimension = ( + labwareDef: LabwareDefinition2, + wells: string[], + position: 'x' | 'y' +): number => { + const offsets = wells.map(well => { + const labwareWell = labwareDef.wells[well] + const shape = labwareWell.shape + if (shape === 'circular') { + return labwareWell.diameter + } else { + return position === 'x' ? labwareWell.xDimension : labwareWell.yDimension + } + }) + return offsets[0] +} + export const getSlotHasMatingSurfaceUnitVector = ( deckDef: DeckDefinition, addressableAreaName: string diff --git a/step-generation/src/__tests__/aspirate.test.ts b/step-generation/src/__tests__/aspirate.test.ts index 7731f5e389e..d937fcda7a4 100644 --- a/step-generation/src/__tests__/aspirate.test.ts +++ b/step-generation/src/__tests__/aspirate.test.ts @@ -67,6 +67,8 @@ describe('aspirate', () => { well: 'A1', } as AspDispAirgapParams), tipRack: 'tiprack1Id', + xOffset: 0, + yOffset: 0, } const result = aspirate(params, invariantContext, robotStateWithTip) expect(getSuccessResult(result).commands).toEqual([ @@ -82,6 +84,8 @@ describe('aspirate', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 5, }, }, @@ -106,6 +110,8 @@ describe('aspirate', () => { well: 'A1', } as AspDispAirgapParams), tipRack: 'tiprack1Id', + xOffset: 0, + yOffset: 0, }, invariantContext, robotStateWithTip @@ -133,6 +139,8 @@ describe('aspirate', () => { well: 'A1', } as AspDispAirgapParams), tipRack: 'tipRack', + xOffset: 0, + yOffset: 0, }, invariantContext, robotStateWithTip @@ -153,6 +161,8 @@ describe('aspirate', () => { well: 'A1', } as AspDispAirgapParams), tipRack: 'tipRack', + xOffset: 0, + yOffset: 0, }, invariantContext, robotStateWithTip @@ -170,6 +180,8 @@ describe('aspirate', () => { well: 'A1', } as AspDispAirgapParams), tipRack: 'tipRack', + xOffset: 0, + yOffset: 0, }, invariantContext, initialRobotState @@ -190,6 +202,8 @@ describe('aspirate', () => { well: 'A1', } as AspDispAirgapParams), tipRack: 'tipRack', + xOffset: 0, + yOffset: 0, }, invariantContext, robotStateWithTip @@ -214,6 +228,8 @@ describe('aspirate', () => { well: 'A1', } as AspDispAirgapParams), tipRack: 'tipRack', + xOffset: 0, + yOffset: 0, }, invariantContext, initialRobotState @@ -246,6 +262,8 @@ describe('aspirate', () => { well: 'A1', } as AspDispAirgapParams), tipRack: 'tipRack', + xOffset: 0, + yOffset: 0, }, invariantContext, robotStateWithTip @@ -278,6 +296,8 @@ describe('aspirate', () => { well: 'A1', } as AspDispAirgapParams), tipRack: 'tipRack', + xOffset: 0, + yOffset: 0, }, invariantContext, robotStateWithTip @@ -316,6 +336,8 @@ describe('aspirate', () => { well: 'A1', } as AspDispAirgapParams), tipRack: 'tipRack', + xOffset: 0, + yOffset: 0, }, invariantContext, robotStateWithTip @@ -348,6 +370,8 @@ describe('aspirate', () => { well: 'A1', } as AspDispAirgapParams), tipRack: 'tipRack', + xOffset: 0, + yOffset: 0, }, invariantContext, robotStateWithTip @@ -386,6 +410,8 @@ describe('aspirate', () => { well: 'A1', } as AspDispAirgapParams), tipRack: 'tipRack', + xOffset: 0, + yOffset: 0, }, invariantContext, robotStateWithTip @@ -414,6 +440,8 @@ describe('aspirate', () => { well: 'A1', } as AspDispAirgapParams), tipRack: 'tipRack', + xOffset: 0, + yOffset: 0, }, invariantContext, robotStateWithTip @@ -441,6 +469,8 @@ describe('aspirate', () => { well: 'A1', } as AspDispAirgapParams), tipRack: 'tipRack', + xOffset: 0, + yOffset: 0, }, invariantContext, robotStateWithTip @@ -468,6 +498,8 @@ describe('aspirate', () => { well: 'A1', } as AspDispAirgapParams), tipRack: 'tipRack', + xOffset: 0, + yOffset: 0, }, invariantContext, robotStateWithTip @@ -497,6 +529,8 @@ describe('aspirate', () => { well: 'A1', } as AspDispAirgapParams), tipRack: 'tipRack', + xOffset: 0, + yOffset: 0, }, invariantContext, robotStateWithTip diff --git a/step-generation/src/__tests__/consolidate.test.ts b/step-generation/src/__tests__/consolidate.test.ts index e43e31c4463..db0303605af 100644 --- a/step-generation/src/__tests__/consolidate.test.ts +++ b/step-generation/src/__tests__/consolidate.test.ts @@ -33,6 +33,8 @@ const airGapHelper = makeAirGapHelper({ origin: 'bottom', offset: { z: 11.54, + x: 0, + y: 0, }, }, }) @@ -98,6 +100,10 @@ beforeEach(() => { blowoutLocation: null, dropTipLocation: FIXED_TRASH_ID, tipRack: 'tiprack1Id', + aspirateXOffset: 0, + dispenseXOffset: 0, + aspirateYOffset: 0, + dispenseYOffset: 0, } }) @@ -259,6 +265,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: ASPIRATE_OFFSET_FROM_BOTTOM_MM, }, }, @@ -274,6 +282,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: ASPIRATE_OFFSET_FROM_BOTTOM_MM, }, }, @@ -307,6 +317,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: ASPIRATE_OFFSET_FROM_BOTTOM_MM, }, }, @@ -330,6 +342,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: ASPIRATE_OFFSET_FROM_BOTTOM_MM, }, }, @@ -363,6 +377,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: ASPIRATE_OFFSET_FROM_BOTTOM_MM, }, }, @@ -373,6 +389,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: ASPIRATE_OFFSET_FROM_BOTTOM_MM, }, }, @@ -383,6 +401,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: ASPIRATE_OFFSET_FROM_BOTTOM_MM, }, }, @@ -399,6 +419,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: ASPIRATE_OFFSET_FROM_BOTTOM_MM, }, }, @@ -409,6 +431,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: ASPIRATE_OFFSET_FROM_BOTTOM_MM, }, }, @@ -419,6 +443,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: ASPIRATE_OFFSET_FROM_BOTTOM_MM, }, }, @@ -454,6 +480,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: DISPENSE_OFFSET_FROM_BOTTOM_MM, }, }, @@ -467,6 +495,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: DISPENSE_OFFSET_FROM_BOTTOM_MM, }, }, @@ -501,6 +531,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: DISPENSE_OFFSET_FROM_BOTTOM_MM, }, }, @@ -520,6 +552,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: DISPENSE_OFFSET_FROM_BOTTOM_MM, }, }, @@ -553,6 +587,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: DISPENSE_OFFSET_FROM_BOTTOM_MM, }, }, @@ -566,6 +602,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: DISPENSE_OFFSET_FROM_BOTTOM_MM, }, }, @@ -599,6 +637,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: ASPIRATE_OFFSET_FROM_BOTTOM_MM, }, }, @@ -616,6 +656,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: ASPIRATE_OFFSET_FROM_BOTTOM_MM, }, }, @@ -655,6 +697,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: ASPIRATE_OFFSET_FROM_BOTTOM_MM, }, }, @@ -675,6 +719,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: ASPIRATE_OFFSET_FROM_BOTTOM_MM, }, }, @@ -715,6 +761,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: ASPIRATE_OFFSET_FROM_BOTTOM_MM, }, }, @@ -734,6 +782,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: ASPIRATE_OFFSET_FROM_BOTTOM_MM, }, }, @@ -1056,6 +1106,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 3.1, }, }, @@ -1080,6 +1132,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 3.1, }, }, @@ -1105,6 +1159,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 3.1, }, }, @@ -1163,6 +1219,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 11.54, }, }, @@ -1188,6 +1246,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 3.1, }, }, @@ -1246,6 +1306,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 11.54, }, }, @@ -1271,6 +1333,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 3.2, }, }, @@ -1313,6 +1377,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 3.2, }, }, @@ -1337,6 +1403,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 3.2, }, }, @@ -1385,6 +1453,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 3.1, }, }, @@ -1409,6 +1479,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 3.1, }, }, @@ -1434,6 +1506,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 3.1, }, }, @@ -1492,6 +1566,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 11.54, }, }, @@ -1517,6 +1593,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 3.2, }, }, @@ -1559,6 +1637,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 3.2, }, }, @@ -1583,6 +1663,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 3.2, }, }, @@ -1627,6 +1709,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 11.54, }, }, @@ -1697,6 +1781,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 3.1, }, }, @@ -1721,6 +1807,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 3.1, }, }, @@ -1746,6 +1834,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 3.1, }, }, @@ -1804,6 +1894,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 11.54, }, }, @@ -1830,6 +1922,8 @@ describe('consolidate single-channel', () => { origin: 'bottom', offset: { z: 3.1, + x: 0, + y: 0, }, }, flowRate: 2.1, @@ -1887,6 +1981,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 11.54, }, }, @@ -1912,6 +2008,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 3.2, }, }, @@ -1954,6 +2052,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 3.2, }, }, @@ -1978,6 +2078,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 3.2, }, }, @@ -2041,6 +2143,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 3.1, }, }, @@ -2065,6 +2169,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 3.1, }, }, @@ -2090,6 +2196,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 3.1, }, }, @@ -2148,6 +2256,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 11.54, }, }, @@ -2173,6 +2283,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 3.2, }, }, @@ -2215,6 +2327,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 3.2, }, }, @@ -2239,6 +2353,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 3.2, }, }, @@ -2298,6 +2414,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 11.54, }, }, @@ -2365,6 +2483,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 3.1, }, }, @@ -2389,6 +2509,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 3.1, }, }, @@ -2414,6 +2536,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 3.1, }, }, @@ -2472,6 +2596,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 11.54, }, }, @@ -2497,6 +2623,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 3.1, }, }, @@ -2555,6 +2683,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 11.54, }, }, @@ -2580,6 +2710,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 3.2, }, }, @@ -2622,6 +2754,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 3.2, }, }, @@ -2646,6 +2780,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 3.2, }, }, @@ -2705,6 +2841,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 11.54, }, }, @@ -2744,6 +2882,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 3.1, }, }, @@ -2769,6 +2909,8 @@ describe('consolidate single-channel', () => { origin: 'bottom', offset: { z: 3.1, + x: 0, + y: 0, }, }, flowRate: 2.2, @@ -2793,6 +2935,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 3.1, }, }, @@ -2851,6 +2995,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 11.54, }, }, @@ -2876,6 +3022,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 3.2, }, }, @@ -2918,6 +3066,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 3.2, }, }, @@ -2942,6 +3092,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 3.2, }, }, @@ -3000,6 +3152,8 @@ describe('consolidate single-channel', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 11.54, }, }, @@ -3058,6 +3212,10 @@ describe('consolidate multi-channel', () => { volume: 140, tipRack: 'tiprack1Id', changeTip: 'once', + aspirateXOffset: 0, + dispenseXOffset: 0, + aspirateYOffset: 0, + dispenseYOffset: 0, } as ConsolidateArgs const result = consolidate(data, invariantContext, initialRobotState) const res = getSuccessResult(result) diff --git a/step-generation/src/__tests__/dispense.test.ts b/step-generation/src/__tests__/dispense.test.ts index 18e51c9b7a7..1ef07707d80 100644 --- a/step-generation/src/__tests__/dispense.test.ts +++ b/step-generation/src/__tests__/dispense.test.ts @@ -20,12 +20,11 @@ import { DEFAULT_PIPETTE, SOURCE_LABWARE, } from '../fixtures' -import { dispense } from '../commandCreators/atomic/dispense' -import { InvariantContext, RobotState } from '../types' -import type { - AspDispAirgapParams as V3AspDispAirgapParams, - DispenseParams, -} from '@opentrons/shared-data/protocol/types/schemaV3' +import { + ExtendedDispenseParams, + dispense, +} from '../commandCreators/atomic/dispense' +import type { InvariantContext, RobotState } from '../types' vi.mock('../utils/thermocyclerPipetteCollision') vi.mock('../utils/heaterShakerCollision') @@ -46,7 +45,7 @@ describe('dispense', () => { vi.resetAllMocks() }) describe('tip tracking & commands:', () => { - let params: V3AspDispAirgapParams + let params: ExtendedDispenseParams beforeEach(() => { params = { pipette: DEFAULT_PIPETTE, @@ -55,6 +54,8 @@ describe('dispense', () => { well: 'A1', offsetFromBottomMm: 5, flowRate: 6, + xOffset: 0, + yOffset: 0, } }) it('dispense normally (with tip)', () => { @@ -71,6 +72,8 @@ describe('dispense', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 5, }, }, @@ -99,7 +102,9 @@ describe('dispense', () => { volume: 50, labware: SOURCE_LABWARE, well: 'A1', - } as DispenseParams, + xOffset: 0, + yOffset: 0, + }, invariantContext, initialRobotState ) diff --git a/step-generation/src/__tests__/distribute.test.ts b/step-generation/src/__tests__/distribute.test.ts index 2db91df01d2..3e8fa31f749 100644 --- a/step-generation/src/__tests__/distribute.test.ts +++ b/step-generation/src/__tests__/distribute.test.ts @@ -36,6 +36,8 @@ const airGapHelper = makeAirGapHelper({ wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 11.54, }, }, @@ -44,6 +46,8 @@ const dispenseAirGapHelper = makeDispenseAirGapHelper({ wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 11.54, }, }, @@ -84,6 +88,10 @@ beforeEach(() => { aspirateAirGapVolume: null, touchTipAfterDispense: false, dropTipLocation: FIXED_TRASH_ID, + aspirateXOffset: 0, + dispenseXOffset: 0, + aspirateYOffset: 0, + dispenseYOffset: 0, } blowoutSingleToTrash = blowoutInPlaceHelper() blowoutSingleToSourceA1 = blowoutHelper(SOURCE_LABWARE, { @@ -274,6 +282,8 @@ describe('advanced settings: volume, mix, pre-wet tip, tip touch, tip position', wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: ASPIRATE_OFFSET_FROM_BOTTOM_MM, }, }, @@ -309,6 +319,8 @@ describe('advanced settings: volume, mix, pre-wet tip, tip touch, tip position', wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: ASPIRATE_OFFSET_FROM_BOTTOM_MM, }, }, @@ -320,6 +332,8 @@ describe('advanced settings: volume, mix, pre-wet tip, tip touch, tip position', wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: ASPIRATE_OFFSET_FROM_BOTTOM_MM, }, }, @@ -553,6 +567,8 @@ describe('advanced settings: volume, mix, pre-wet tip, tip touch, tip position', wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: ASPIRATE_OFFSET_FROM_BOTTOM_MM, }, }, @@ -565,6 +581,8 @@ describe('advanced settings: volume, mix, pre-wet tip, tip touch, tip position', wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: ASPIRATE_OFFSET_FROM_BOTTOM_MM, }, }, @@ -690,6 +708,8 @@ describe('advanced settings: volume, mix, pre-wet tip, tip touch, tip position', wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: ASPIRATE_OFFSET_FROM_BOTTOM_MM, }, }, @@ -701,6 +721,8 @@ describe('advanced settings: volume, mix, pre-wet tip, tip touch, tip position', wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: ASPIRATE_OFFSET_FROM_BOTTOM_MM, }, }, @@ -781,6 +803,8 @@ describe('advanced settings: volume, mix, pre-wet tip, tip touch, tip position', wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: ASPIRATE_OFFSET_FROM_BOTTOM_MM, }, }, @@ -793,6 +817,8 @@ describe('advanced settings: volume, mix, pre-wet tip, tip touch, tip position', wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: ASPIRATE_OFFSET_FROM_BOTTOM_MM, }, }, @@ -879,6 +905,8 @@ describe('advanced settings: volume, mix, pre-wet tip, tip touch, tip position', wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: ASPIRATE_OFFSET_FROM_BOTTOM_MM, }, }, diff --git a/step-generation/src/__tests__/mix.test.ts b/step-generation/src/__tests__/mix.test.ts index c2392a94c98..cc2115c42da 100644 --- a/step-generation/src/__tests__/mix.test.ts +++ b/step-generation/src/__tests__/mix.test.ts @@ -51,6 +51,10 @@ beforeEach(() => { aspirateDelaySeconds: null, dispenseDelaySeconds: null, dropTipLocation: FIXED_TRASH_ID, + aspirateXOffset: 0, + dispenseXOffset: 0, + aspirateYOffset: 0, + dispenseYOffset: 0, } invariantContext = makeContext() diff --git a/step-generation/src/__tests__/transfer.test.ts b/step-generation/src/__tests__/transfer.test.ts index 49319bfe2ea..f0c9b9fce7e 100644 --- a/step-generation/src/__tests__/transfer.test.ts +++ b/step-generation/src/__tests__/transfer.test.ts @@ -37,6 +37,8 @@ const airGapHelper = makeAirGapHelper({ wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 11.54, }, }, @@ -45,6 +47,8 @@ const dispenseAirGapHelper = makeDispenseAirGapHelper({ wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 11.54, }, }, @@ -78,6 +82,10 @@ beforeEach(() => { mixInDestination: null, blowoutLocation: null, dropTipLocation: FIXED_TRASH_ID, + aspirateXOffset: 0, + dispenseXOffset: 0, + aspirateYOffset: 0, + dispenseYOffset: 0, } invariantContext = makeContext() @@ -561,6 +569,8 @@ describe('advanced options', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: ASPIRATE_OFFSET_FROM_BOTTOM_MM, }, }, @@ -594,6 +604,8 @@ describe('advanced options', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: ASPIRATE_OFFSET_FROM_BOTTOM_MM, }, }, @@ -628,6 +640,8 @@ describe('advanced options', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: ASPIRATE_OFFSET_FROM_BOTTOM_MM, }, }, @@ -704,6 +718,8 @@ describe('advanced options', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: ASPIRATE_OFFSET_FROM_BOTTOM_MM, }, }, @@ -715,6 +731,8 @@ describe('advanced options', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: ASPIRATE_OFFSET_FROM_BOTTOM_MM, }, }, @@ -754,6 +772,8 @@ describe('advanced options', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: ASPIRATE_OFFSET_FROM_BOTTOM_MM, }, }, @@ -766,6 +786,8 @@ describe('advanced options', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: ASPIRATE_OFFSET_FROM_BOTTOM_MM, }, }, @@ -928,6 +950,8 @@ describe('advanced options', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: DISPENSE_OFFSET_FROM_BOTTOM_MM, }, }, @@ -939,6 +963,8 @@ describe('advanced options', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: DISPENSE_OFFSET_FROM_BOTTOM_MM, }, }, @@ -977,6 +1003,8 @@ describe('advanced options', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: DISPENSE_OFFSET_FROM_BOTTOM_MM, }, }, @@ -986,6 +1014,8 @@ describe('advanced options', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: DISPENSE_OFFSET_FROM_BOTTOM_MM, }, }, @@ -997,6 +1027,8 @@ describe('advanced options', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: DISPENSE_OFFSET_FROM_BOTTOM_MM, }, }, @@ -1097,6 +1129,8 @@ describe('advanced options', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 3.1, }, }, @@ -1122,6 +1156,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: 3.1, + y: 0, + x: 0, }, }, flowRate: 2.2, @@ -1146,6 +1182,8 @@ describe('advanced options', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 3.1, }, }, @@ -1171,6 +1209,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: 3.1, + y: 0, + x: 0, }, }, flowRate: 2.2, @@ -1195,6 +1235,8 @@ describe('advanced options', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 3.1, }, }, @@ -1254,6 +1296,8 @@ describe('advanced options', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 11.54, }, }, @@ -1281,6 +1325,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: 11.54, + y: 0, + x: 0, }, }, flowRate: 2.2, @@ -1303,8 +1349,11 @@ describe('advanced options', () => { wellName: 'B1', wellLocation: { origin: 'bottom', + offset: { z: DISPENSE_OFFSET_FROM_BOTTOM_MM, + y: 0, + x: 0, }, }, flowRate: 2.2, @@ -1346,6 +1395,8 @@ describe('advanced options', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 3.2, }, }, @@ -1371,6 +1422,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: DISPENSE_OFFSET_FROM_BOTTOM_MM, + y: 0, + x: 0, }, }, flowRate: 2.2, @@ -1432,6 +1485,8 @@ describe('advanced options', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 3.1, }, }, @@ -1457,6 +1512,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: 3.1, + y: 0, + x: 0, }, }, flowRate: 2.2, @@ -1481,6 +1538,8 @@ describe('advanced options', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 3.1, }, }, @@ -1540,6 +1599,8 @@ describe('advanced options', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 11.54, }, }, @@ -1567,6 +1628,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: 11.54, + y: 0, + x: 0, }, }, flowRate: 2.2, @@ -1591,6 +1654,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: 3.2, + y: 0, + x: 0, }, }, flowRate: 2.2, @@ -1632,6 +1697,8 @@ describe('advanced options', () => { wellLocation: { origin: 'bottom', offset: { + y: 0, + x: 0, z: 3.2, }, }, @@ -1657,6 +1724,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: 3.2, + y: 0, + x: 0, }, }, flowRate: 2.2, @@ -1716,6 +1785,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: 11.54, + y: 0, + x: 0, }, }, flowRate: 2.1, @@ -1756,6 +1827,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: 3.1, + y: 0, + x: 0, }, }, flowRate: 2.1, @@ -1780,6 +1853,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: 3.1, + y: 0, + x: 0, }, }, flowRate: 2.2, @@ -1805,6 +1880,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: 3.1, + y: 0, + x: 0, }, }, flowRate: 2.1, @@ -1829,6 +1906,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: 3.1, + y: 0, + x: 0, }, }, flowRate: 2.2, @@ -1854,6 +1933,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: 3.1, + y: 0, + x: 0, }, }, flowRate: 2.1, @@ -1913,6 +1994,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: 11.54, + y: 0, + x: 0, }, }, flowRate: 2.1, @@ -1939,6 +2022,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: 11.54, + y: 0, + x: 0, }, }, flowRate: 2.2, @@ -1963,6 +2048,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: DISPENSE_OFFSET_FROM_BOTTOM_MM, + y: 0, + x: 0, }, }, flowRate: 2.2, @@ -2005,6 +2092,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: DISPENSE_OFFSET_FROM_BOTTOM_MM, + y: 0, + x: 0, }, }, flowRate: 2.1, @@ -2029,6 +2118,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: DISPENSE_OFFSET_FROM_BOTTOM_MM, + y: 0, + x: 0, }, }, flowRate: 2.2, @@ -2091,6 +2182,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: 3.1, + y: 0, + x: 0, }, }, flowRate: 2.1, @@ -2115,6 +2208,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: 3.1, + y: 0, + x: 0, }, }, flowRate: 2.2, @@ -2140,6 +2235,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: 3.1, + y: 0, + x: 0, }, }, flowRate: 2.1, @@ -2197,6 +2294,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: 11.54, + y: 0, + x: 0, }, }, pipetteId: 'p300SingleId', @@ -2222,6 +2321,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: 11.54, + y: 0, + x: 0, }, }, pipetteId: 'p300SingleId', @@ -2248,6 +2349,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: DISPENSE_OFFSET_FROM_BOTTOM_MM, + y: 0, + x: 0, }, }, flowRate: 2.2, @@ -2290,6 +2393,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: DISPENSE_OFFSET_FROM_BOTTOM_MM, + y: 0, + x: 0, }, }, flowRate: 2.1, @@ -2314,6 +2419,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: DISPENSE_OFFSET_FROM_BOTTOM_MM, + y: 0, + x: 0, }, }, flowRate: 2.2, @@ -2374,6 +2481,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: 11.54, + y: 0, + x: 0, }, }, }, @@ -2442,6 +2551,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: 3.1, + y: 0, + x: 0, }, }, flowRate: 2.1, @@ -2466,6 +2577,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: 3.1, + y: 0, + x: 0, }, }, flowRate: 2.2, @@ -2491,6 +2604,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: 3.1, + y: 0, + x: 0, }, }, flowRate: 2.1, @@ -2515,6 +2630,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: 3.1, + y: 0, + x: 0, }, }, flowRate: 2.2, @@ -2540,6 +2657,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: 3.1, + y: 0, + x: 0, }, }, flowRate: 2.1, @@ -2599,6 +2718,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: 11.54, + y: 0, + x: 0, }, }, flowRate: 2.1, @@ -2625,6 +2746,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: 11.54, + y: 0, + x: 0, }, }, flowRate: 2.2, @@ -2649,6 +2772,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: DISPENSE_OFFSET_FROM_BOTTOM_MM, + y: 0, + x: 0, }, }, flowRate: 2.2, @@ -2691,6 +2816,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: DISPENSE_OFFSET_FROM_BOTTOM_MM, + y: 0, + x: 0, }, }, flowRate: 2.1, @@ -2715,6 +2842,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: DISPENSE_OFFSET_FROM_BOTTOM_MM, + y: 0, + x: 0, }, }, flowRate: 2.2, @@ -2777,6 +2906,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: 3.1, + y: 0, + x: 0, }, }, flowRate: 2.1, @@ -2801,6 +2932,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: 3.1, + y: 0, + x: 0, }, }, flowRate: 2.2, @@ -2826,6 +2959,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: 3.1, + y: 0, + x: 0, }, }, flowRate: 2.1, @@ -2885,6 +3020,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: 11.54, + y: 0, + x: 0, }, }, flowRate: 2.1, @@ -2911,6 +3048,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: 11.54, + y: 0, + x: 0, }, }, flowRate: 2.2, @@ -2935,6 +3074,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: DISPENSE_OFFSET_FROM_BOTTOM_MM, + y: 0, + x: 0, }, }, flowRate: 2.2, @@ -2977,6 +3118,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: DISPENSE_OFFSET_FROM_BOTTOM_MM, + y: 0, + x: 0, }, }, flowRate: 2.1, @@ -3001,6 +3144,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: DISPENSE_OFFSET_FROM_BOTTOM_MM, + y: 0, + x: 0, }, }, flowRate: 2.2, @@ -3061,6 +3206,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: 11.54, + y: 0, + x: 0, }, }, }, @@ -3127,6 +3274,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: 3.1, + y: 0, + x: 0, }, }, flowRate: 2.1, @@ -3151,6 +3300,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: 3.1, + y: 0, + x: 0, }, }, flowRate: 2.2, @@ -3176,6 +3327,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: 3.1, + y: 0, + x: 0, }, }, flowRate: 2.1, @@ -3200,6 +3353,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: 3.1, + y: 0, + x: 0, }, }, flowRate: 2.2, @@ -3225,6 +3380,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: 3.1, + y: 0, + x: 0, }, }, flowRate: 2.1, @@ -3284,6 +3441,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: 11.54, + y: 0, + x: 0, }, }, flowRate: 2.1, @@ -3310,6 +3469,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: 11.54, + y: 0, + x: 0, }, }, flowRate: 2.2, @@ -3334,6 +3495,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: DISPENSE_OFFSET_FROM_BOTTOM_MM, + y: 0, + x: 0, }, }, flowRate: 2.2, @@ -3376,6 +3539,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: DISPENSE_OFFSET_FROM_BOTTOM_MM, + y: 0, + x: 0, }, }, flowRate: 2.1, @@ -3399,6 +3564,8 @@ describe('advanced options', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: DISPENSE_OFFSET_FROM_BOTTOM_MM, }, }, @@ -3459,6 +3626,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: 11.54, + y: 0, + x: 0, }, }, volume: 3, @@ -3511,6 +3680,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: 3.1, + y: 0, + x: 0, }, }, flowRate: 2.1, @@ -3535,6 +3706,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: 3.1, + y: 0, + x: 0, }, }, flowRate: 2.2, @@ -3560,6 +3733,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: 3.1, + y: 0, + x: 0, }, }, flowRate: 2.1, @@ -3619,6 +3794,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: 11.54, + y: 0, + x: 0, }, }, flowRate: 2.1, @@ -3644,6 +3821,8 @@ describe('advanced options', () => { wellLocation: { origin: 'bottom', offset: { + x: 0, + y: 0, z: 11.54, }, }, @@ -3669,6 +3848,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: DISPENSE_OFFSET_FROM_BOTTOM_MM, + y: 0, + x: 0, }, }, flowRate: 2.2, @@ -3711,6 +3892,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: DISPENSE_OFFSET_FROM_BOTTOM_MM, + y: 0, + x: 0, }, }, flowRate: 2.1, @@ -3735,6 +3918,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: DISPENSE_OFFSET_FROM_BOTTOM_MM, + y: 0, + x: 0, }, }, flowRate: 2.2, @@ -3795,6 +3980,8 @@ describe('advanced options', () => { origin: 'bottom', offset: { z: 11.54, + y: 0, + x: 0, }, }, }, diff --git a/step-generation/src/commandCreators/atomic/aspirate.ts b/step-generation/src/commandCreators/atomic/aspirate.ts index fb360c4cebf..d7226da3387 100644 --- a/step-generation/src/commandCreators/atomic/aspirate.ts +++ b/step-generation/src/commandCreators/atomic/aspirate.ts @@ -18,6 +18,8 @@ import type { AspirateParams } from '@opentrons/shared-data/protocol/types/schem import type { CommandCreator, CommandCreatorError } from '../../types' export interface ExtendedAspirateParams extends AspirateParams { + xOffset: number + yOffset: number tipRack: string } /** Aspirate with given args. Requires tip. */ @@ -35,6 +37,8 @@ export const aspirate: CommandCreator = ( flowRate, isAirGap, tipRack, + xOffset, + yOffset, } = args const actionName = 'aspirate' const errors: CommandCreatorError[] = [] @@ -208,6 +212,8 @@ export const aspirate: CommandCreator = ( origin: 'bottom', offset: { z: offsetFromBottomMm, + x: xOffset, + y: yOffset, }, }, flowRate, diff --git a/step-generation/src/commandCreators/atomic/dispense.ts b/step-generation/src/commandCreators/atomic/dispense.ts index 58c7019fe75..2bec571bd6e 100644 --- a/step-generation/src/commandCreators/atomic/dispense.ts +++ b/step-generation/src/commandCreators/atomic/dispense.ts @@ -16,8 +16,12 @@ import type { CreateCommand } from '@opentrons/shared-data' import type { DispenseParams } from '@opentrons/shared-data/protocol/types/schemaV3' import type { CommandCreator, CommandCreatorError } from '../../types' +export interface ExtendedDispenseParams extends DispenseParams { + xOffset: number + yOffset: number +} /** Dispense with given args. Requires tip. */ -export const dispense: CommandCreator = ( +export const dispense: CommandCreator = ( args, invariantContext, prevRobotState @@ -30,6 +34,8 @@ export const dispense: CommandCreator = ( offsetFromBottomMm, flowRate, isAirGap, + xOffset, + yOffset, } = args const actionName = 'dispense' const errors: CommandCreatorError[] = [] @@ -172,6 +178,8 @@ export const dispense: CommandCreator = ( origin: 'bottom', offset: { z: offsetFromBottomMm, + x: xOffset, + y: yOffset, }, }, flowRate, diff --git a/step-generation/src/commandCreators/compound/consolidate.ts b/step-generation/src/commandCreators/compound/consolidate.ts index 6507f9227f2..b37f2ede1b0 100644 --- a/step-generation/src/commandCreators/compound/consolidate.ts +++ b/step-generation/src/commandCreators/compound/consolidate.ts @@ -152,6 +152,10 @@ export const consolidate: CommandCreator = ( mixFirstAspirate, mixInDestination, dropTipLocation, + aspirateXOffset, + aspirateYOffset, + dispenseXOffset, + dispenseYOffset, } = args const aspirateAirGapVolume = args.aspirateAirGapVolume || 0 const maxWellsPerChunk = Math.floor( @@ -220,6 +224,8 @@ export const consolidate: CommandCreator = ( offsetFromBottomMm: airGapOffsetSourceWell, isAirGap: true, tipRack: args.tipRack, + xOffset: 0, + yOffset: 0, }), ...(aspirateDelay != null ? [ @@ -277,6 +283,8 @@ export const consolidate: CommandCreator = ( flowRate: aspirateFlowRateUlSec, offsetFromBottomMm: aspirateOffsetFromBottomMm, tipRack: args.tipRack, + xOffset: aspirateXOffset, + yOffset: aspirateYOffset, }), ...delayAfterAspirateCommands, ...touchTipAfterAspirateCommand, @@ -326,6 +334,10 @@ export const consolidate: CommandCreator = ( aspirateDelaySeconds: aspirateDelay?.seconds, dispenseDelaySeconds: dispenseDelay?.seconds, tipRack: args.tipRack, + aspirateXOffset, + aspirateYOffset, + dispenseXOffset, + dispenseYOffset, }) : [] const preWetTipCommands = args.preWetTip // Pre-wet tip is equivalent to a single mix, with volume equal to the consolidate volume. @@ -342,6 +354,10 @@ export const consolidate: CommandCreator = ( aspirateDelaySeconds: aspirateDelay?.seconds, dispenseDelaySeconds: dispenseDelay?.seconds, tipRack: args.tipRack, + aspirateXOffset, + aspirateYOffset, + dispenseXOffset, + dispenseYOffset, }) : [] // can not mix in a waste chute @@ -360,6 +376,10 @@ export const consolidate: CommandCreator = ( aspirateDelaySeconds: aspirateDelay?.seconds, dispenseDelaySeconds: dispenseDelay?.seconds, tipRack: args.tipRack, + aspirateXOffset, + aspirateYOffset, + dispenseXOffset, + dispenseYOffset, }) : [] @@ -385,6 +405,8 @@ export const consolidate: CommandCreator = ( well: destinationWell ?? undefined, flowRate: dispenseFlowRateUlSec, offsetFromBottomMm: dispenseOffsetFromBottomMm, + xOffset: dispenseXOffset, + yOffset: dispenseYOffset, }), ] diff --git a/step-generation/src/commandCreators/compound/distribute.ts b/step-generation/src/commandCreators/compound/distribute.ts index 9662a07d959..520ce06aeb4 100644 --- a/step-generation/src/commandCreators/compound/distribute.ts +++ b/step-generation/src/commandCreators/compound/distribute.ts @@ -147,6 +147,10 @@ export const distribute: CommandCreator = ( dispenseFlowRateUlSec, dispenseOffsetFromBottomMm, blowoutLocation, + aspirateXOffset, + aspirateYOffset, + dispenseXOffset, + dispenseYOffset, } = args const aspirateAirGapVolume = args.aspirateAirGapVolume || 0 const dispenseAirGapVolume = args.dispenseAirGapVolume || 0 @@ -211,6 +215,8 @@ export const distribute: CommandCreator = ( flowRate: aspirateFlowRateUlSec, offsetFromBottomMm: airGapOffsetSourceWell, isAirGap: true, + xOffset: 0, + yOffset: 0, tipRack: args.tipRack, }), ...(aspirateDelay != null @@ -232,6 +238,8 @@ export const distribute: CommandCreator = ( flowRate: dispenseFlowRateUlSec, offsetFromBottomMm: airGapOffsetDestWell, isAirGap: true, + xOffset: 0, + yOffset: 0, }), ...(dispenseDelay != null ? [ @@ -290,6 +298,8 @@ export const distribute: CommandCreator = ( well: destWell, flowRate: dispenseFlowRateUlSec, offsetFromBottomMm: dispenseOffsetFromBottomMm, + xOffset: dispenseXOffset, + yOffset: dispenseYOffset, }), ...delayAfterDispenseCommands, ...touchTipAfterDispenseCommand, @@ -337,6 +347,8 @@ export const distribute: CommandCreator = ( offsetFromBottomMm: airGapOffsetDestWell, isAirGap: true, tipRack: args.tipRack, + xOffset: 0, + yOffset: 0, }), ...(aspirateDelay != null ? [ @@ -439,6 +451,10 @@ export const distribute: CommandCreator = ( aspirateDelaySeconds: aspirateDelay?.seconds, dispenseDelaySeconds: dispenseDelay?.seconds, tipRack: args.tipRack, + aspirateXOffset, + aspirateYOffset, + dispenseXOffset, + dispenseYOffset, }) : [] @@ -478,6 +494,8 @@ export const distribute: CommandCreator = ( flowRate: aspirateFlowRateUlSec, offsetFromBottomMm: aspirateOffsetFromBottomMm, tipRack: args.tipRack, + xOffset: aspirateXOffset, + yOffset: aspirateYOffset, }), ...delayAfterAspirateCommands, ...touchTipAfterAspirateCommand, diff --git a/step-generation/src/commandCreators/compound/mix.ts b/step-generation/src/commandCreators/compound/mix.ts index 4a918da5a0d..284529c7c1f 100644 --- a/step-generation/src/commandCreators/compound/mix.ts +++ b/step-generation/src/commandCreators/compound/mix.ts @@ -35,6 +35,10 @@ export function mixUtil(args: { aspirateFlowRateUlSec: number dispenseFlowRateUlSec: number tipRack: string + aspirateXOffset: number + dispenseXOffset: number + aspirateYOffset: number + dispenseYOffset: number aspirateDelaySeconds?: number | null | undefined dispenseDelaySeconds?: number | null | undefined }): CurriedCommandCreator[] { @@ -51,6 +55,10 @@ export function mixUtil(args: { aspirateDelaySeconds, dispenseDelaySeconds, tipRack, + aspirateXOffset, + aspirateYOffset, + dispenseXOffset, + dispenseYOffset, } = args const getDelayCommand = (seconds?: number | null): CurriedCommandCreator[] => @@ -76,6 +84,8 @@ export function mixUtil(args: { offsetFromBottomMm: aspirateOffsetFromBottomMm, flowRate: aspirateFlowRateUlSec, tipRack, + xOffset: aspirateXOffset, + yOffset: aspirateYOffset, }), ...getDelayCommand(aspirateDelaySeconds), curryCommandCreator(dispense, { @@ -85,6 +95,8 @@ export function mixUtil(args: { well, offsetFromBottomMm: dispenseOffsetFromBottomMm, flowRate: dispenseFlowRateUlSec, + xOffset: dispenseXOffset, + yOffset: dispenseYOffset, }), ...getDelayCommand(dispenseDelaySeconds), ], @@ -123,6 +135,10 @@ export const mix: CommandCreator = ( blowoutOffsetFromTopMm, dropTipLocation, tipRack, + aspirateXOffset, + aspirateYOffset, + dispenseXOffset, + dispenseYOffset, } = data const is96Channel = @@ -257,6 +273,10 @@ export const mix: CommandCreator = ( aspirateDelaySeconds, dispenseDelaySeconds, tipRack, + aspirateXOffset, + aspirateYOffset, + dispenseXOffset, + dispenseYOffset, }) return [ ...configureNozzleLayoutCommand, diff --git a/step-generation/src/commandCreators/compound/transfer.ts b/step-generation/src/commandCreators/compound/transfer.ts index d7f4ec5e181..2d16c8064bf 100644 --- a/step-generation/src/commandCreators/compound/transfer.ts +++ b/step-generation/src/commandCreators/compound/transfer.ts @@ -205,6 +205,10 @@ export const transfer: CommandCreator = ( dispenseFlowRateUlSec, dispenseOffsetFromBottomMm, tipRack, + aspirateXOffset, + aspirateYOffset, + dispenseXOffset, + dispenseYOffset, } = args const aspirateAirGapVolume = args.aspirateAirGapVolume || 0 const dispenseAirGapVolume = args.dispenseAirGapVolume || 0 @@ -329,6 +333,10 @@ export const transfer: CommandCreator = ( aspirateDelaySeconds: aspirateDelay?.seconds, dispenseDelaySeconds: dispenseDelay?.seconds, tipRack, + aspirateXOffset, + aspirateYOffset, + dispenseXOffset, + dispenseYOffset, }) : [] const mixBeforeAspirateCommands = @@ -346,6 +354,10 @@ export const transfer: CommandCreator = ( aspirateDelaySeconds: aspirateDelay?.seconds, dispenseDelaySeconds: dispenseDelay?.seconds, tipRack, + aspirateXOffset, + aspirateYOffset, + dispenseXOffset, + dispenseYOffset, }) : [] const delayAfterAspirateCommands = @@ -410,6 +422,10 @@ export const transfer: CommandCreator = ( aspirateDelaySeconds: aspirateDelay?.seconds, dispenseDelaySeconds: dispenseDelay?.seconds, tipRack, + aspirateXOffset, + aspirateYOffset, + dispenseXOffset, + dispenseYOffset, }) : [] @@ -425,6 +441,8 @@ export const transfer: CommandCreator = ( offsetFromBottomMm: airGapOffsetSourceWell, isAirGap: true, tipRack, + xOffset: 0, + yOffset: 0, }), ...(aspirateDelay != null ? [ @@ -445,6 +463,8 @@ export const transfer: CommandCreator = ( flowRate: dispenseFlowRateUlSec, offsetFromBottomMm: airGapOffsetDestWell, isAirGap: true, + xOffset: 0, + yOffset: 0, }), ...(dispenseDelay != null ? [ @@ -486,6 +506,8 @@ export const transfer: CommandCreator = ( flowRate: aspirateFlowRateUlSec, offsetFromBottomMm: aspirateOffsetFromBottomMm, tipRack, + xOffset: aspirateXOffset, + yOffset: aspirateYOffset, }), ] const dispenseCommand = [ @@ -496,6 +518,8 @@ export const transfer: CommandCreator = ( well: destinationWell ?? undefined, flowRate: dispenseFlowRateUlSec, offsetFromBottomMm: dispenseOffsetFromBottomMm, + xOffset: dispenseXOffset, + yOffset: dispenseYOffset, }), ] diff --git a/step-generation/src/fixtures/commandFixtures.ts b/step-generation/src/fixtures/commandFixtures.ts index 2c38a361ee7..3d1ee394574 100644 --- a/step-generation/src/fixtures/commandFixtures.ts +++ b/step-generation/src/fixtures/commandFixtures.ts @@ -129,6 +129,8 @@ export const makeAspirateHelper: MakeAspDispHelper = bakedP wellLocation: { origin: 'bottom', offset: { + y: 0, + x: 0, z: ASPIRATE_OFFSET_FROM_BOTTOM_MM, }, }, @@ -199,6 +201,8 @@ const _defaultDispenseParams = { wellLocation: { origin: 'bottom' as const, offset: { + y: 0, + x: 0, z: DISPENSE_OFFSET_FROM_BOTTOM_MM, }, }, diff --git a/step-generation/src/types.ts b/step-generation/src/types.ts index 98e1e8ec90c..6cef80c43ed 100644 --- a/step-generation/src/types.ts +++ b/step-generation/src/types.ts @@ -192,6 +192,10 @@ export type SharedTransferLikeArgs = CommonArgs & { aspirateFlowRateUlSec: number /** offset from bottom of well in mm */ aspirateOffsetFromBottomMm: number + /** x offset mm */ + aspirateXOffset: number + /** y offset mm */ + aspirateYOffset: number // ===== DISPENSE SETTINGS ===== /** Air gap after dispense */ @@ -206,6 +210,10 @@ export type SharedTransferLikeArgs = CommonArgs & { dispenseFlowRateUlSec: number /** offset from bottom of well in mm */ dispenseOffsetFromBottomMm: number + /** x offset mm */ + dispenseXOffset: number + /** y offset mm */ + dispenseYOffset: number } export type ConsolidateArgs = SharedTransferLikeArgs & { @@ -286,6 +294,12 @@ export type MixArgs = CommonArgs & { /** offset from bottom of well in mm */ aspirateOffsetFromBottomMm: number dispenseOffsetFromBottomMm: number + /** x offset */ + aspirateXOffset: number + dispenseXOffset: number + /** y offset */ + aspirateYOffset: number + dispenseYOffset: number /** flow rates in uL/sec */ aspirateFlowRateUlSec: number dispenseFlowRateUlSec: number diff --git a/step-generation/src/utils/misc.ts b/step-generation/src/utils/misc.ts index c9f36587213..58bf2e9f782 100644 --- a/step-generation/src/utils/misc.ts +++ b/step-generation/src/utils/misc.ts @@ -479,6 +479,8 @@ interface DispenseLocationHelperArgs { pipetteId: string volume: number flowRate: number + xOffset: number + yOffset: number offsetFromBottomMm?: number well?: string } @@ -494,6 +496,8 @@ export const dispenseLocationHelper: CommandCreator flowRate, offsetFromBottomMm, well, + xOffset, + yOffset, } = args const trashOrLabware = getTrashOrLabware( @@ -516,6 +520,8 @@ export const dispenseLocationHelper: CommandCreator well, flowRate, offsetFromBottomMm, + xOffset, + yOffset, }), ] } else if (trashOrLabware === 'wasteChute') { @@ -660,6 +666,8 @@ export const airGapHelper: CommandCreator = ( offsetFromBottomMm, isAirGap: true, tipRack, + xOffset: 0, + yOffset: 0, }), ] // when aspirating out of multi wells for consolidate @@ -674,6 +682,9 @@ export const airGapHelper: CommandCreator = ( offsetFromBottomMm, isAirGap: true, tipRack, + // NOTE: airgap aspirates happen at default x/y offset + xOffset: 0, + yOffset: 0, }), ] }